#!/usr/bin/env python # # ===- pipeline_helper.py - Remote Index pipeline Helper *- python -------*--===# # # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # # ===------------------------------------------------------------------------===# import argparse import os import subprocess from socket import socket import sys import time import threading def kill_process_after_delay(server_process): time.sleep(10) if server_process.poll() is None: server_process.kill() def main(): parser = argparse.ArgumentParser() parser.add_argument("--input-file-name", required=True) parser.add_argument("--project-root", required=True) parser.add_argument("--index-file", required=True) parser.add_argument("--server-arg", action="append", default=[]) parser.add_argument( "--server-log", nargs="?", type=argparse.FileType("wb"), default=os.devnull ) args = parser.parse_args() # Grab an available port. with socket() as s: s.bind(("localhost", 0)) server_address = "localhost:" + str(s.getsockname()[1]) print("Initializing clangd-index-server...", file=sys.stderr) index_server_process = subprocess.Popen( [ "clangd-index-server", "--server-address=" + server_address, args.index_file, args.project_root, ] + args.server_arg, stderr=subprocess.PIPE, ) # This will kill index_server_process if it hangs without printing init # message. shutdown_thread = threading.Thread( target=kill_process_after_delay, args=(index_server_process,) ) shutdown_thread.daemon = True shutdown_thread.start() # Wait for the server to warm-up. found_init_message = False while index_server_process.poll() is None: line = index_server_process.stderr.readline() args.server_log.write(line) args.server_log.flush() if b"Server listening" in line: print("Server initialization complete.", file=sys.stderr) found_init_message = True break if not found_init_message: print("Server initialization failed. Shutting down.", file=sys.stderr) sys.exit(1) print("Running clangd-index-server-monitor...", file=sys.stderr) index_server_monitor_process = subprocess.Popen( [ "clangd-index-server-monitor", server_address, ], stderr=subprocess.PIPE, ) index_server_monitor_process.wait() in_file = open(args.input_file_name) print("Staring clangd...", file=sys.stderr) clangd_process = subprocess.Popen( [ "clangd", "--remote-index-address=" + server_address, "--project-root=" + args.project_root, "--lit-test", "--sync", ], stdin=in_file, ) clangd_process.wait() print( "Clangd executed successfully, shutting down child processes.", file=sys.stderr ) index_server_process.kill() for line in index_server_process.stderr: args.server_log.write(line) args.server_log.flush() for line in index_server_monitor_process.stderr: args.server_log.write(line) args.server_log.flush() if __name__ == "__main__": main()