brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · afdac98 Raw
118 lines · python
1#!/usr/bin/env python2#3# ===- pipeline_helper.py - Remote Index pipeline Helper *- python -------*--===#4#5# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.6# See https://llvm.org/LICENSE.txt for license information.7# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception8#9# ===------------------------------------------------------------------------===#10 11import argparse12import os13import subprocess14from socket import socket15import sys16import time17import threading18 19 20def kill_process_after_delay(server_process):21    time.sleep(10)22    if server_process.poll() is None:23        server_process.kill()24 25 26def main():27    parser = argparse.ArgumentParser()28    parser.add_argument("--input-file-name", required=True)29    parser.add_argument("--project-root", required=True)30    parser.add_argument("--index-file", required=True)31    parser.add_argument("--server-arg", action="append", default=[])32    parser.add_argument(33        "--server-log", nargs="?", type=argparse.FileType("wb"), default=os.devnull34    )35 36    args = parser.parse_args()37 38    # Grab an available port.39    with socket() as s:40        s.bind(("localhost", 0))41        server_address = "localhost:" + str(s.getsockname()[1])42 43    print("Initializing clangd-index-server...", file=sys.stderr)44    index_server_process = subprocess.Popen(45        [46            "clangd-index-server",47            "--server-address=" + server_address,48            args.index_file,49            args.project_root,50        ]51        + args.server_arg,52        stderr=subprocess.PIPE,53    )54 55    # This will kill index_server_process if it hangs without printing init56    # message.57    shutdown_thread = threading.Thread(58        target=kill_process_after_delay, args=(index_server_process,)59    )60    shutdown_thread.daemon = True61    shutdown_thread.start()62 63    # Wait for the server to warm-up.64    found_init_message = False65    while index_server_process.poll() is None:66        line = index_server_process.stderr.readline()67        args.server_log.write(line)68        args.server_log.flush()69        if b"Server listening" in line:70            print("Server initialization complete.", file=sys.stderr)71            found_init_message = True72            break73 74    if not found_init_message:75        print("Server initialization failed. Shutting down.", file=sys.stderr)76        sys.exit(1)77 78    print("Running clangd-index-server-monitor...", file=sys.stderr)79    index_server_monitor_process = subprocess.Popen(80        [81            "clangd-index-server-monitor",82            server_address,83        ],84        stderr=subprocess.PIPE,85    )86 87    index_server_monitor_process.wait()88 89    in_file = open(args.input_file_name)90 91    print("Staring clangd...", file=sys.stderr)92    clangd_process = subprocess.Popen(93        [94            "clangd",95            "--remote-index-address=" + server_address,96            "--project-root=" + args.project_root,97            "--lit-test",98            "--sync",99        ],100        stdin=in_file,101    )102    clangd_process.wait()103    print(104        "Clangd executed successfully, shutting down child processes.", file=sys.stderr105    )106    index_server_process.kill()107    for line in index_server_process.stderr:108        args.server_log.write(line)109        args.server_log.flush()110 111    for line in index_server_monitor_process.stderr:112        args.server_log.write(line)113        args.server_log.flush()114 115 116if __name__ == "__main__":117    main()118