# Copyright 2024 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import contextlib import os import sys import signal import subprocess import gclient_paths # Keeps track of whether our SIGINT handler was called. _is_canceled = False def _register_build_id(local_dev_server_path, build_id, out_dir): subprocess.run([ local_dev_server_path, '--register-build-id', build_id, '--builder-pid', str(os.getpid()), '--output-directory', os.path.abspath(out_dir) ]) def _print_status(local_dev_server_path, build_id): subprocess.run([local_dev_server_path, '--print-status', build_id]) def _get_server_path(): src_dir = gclient_paths.GetPrimarySolutionPath() return os.path.join(src_dir, 'build/android/fast_local_dev_server.py') def _set_signal_handler(local_dev_server_path, build_id): original_sigint_handler = signal.getsignal(signal.SIGINT) def _kill_handler(signum, frame): global _is_canceled _is_canceled = True # Cancel the pending build tasks if user CTRL+c early. print('Canceling pending build_server tasks', file=sys.stderr) subprocess.run([local_dev_server_path, '--cancel-build', build_id]) original_sigint_handler(signum, frame) signal.signal(signal.SIGINT, _kill_handler) def _start_server(local_dev_server_path): subprocess.Popen([local_dev_server_path, '--exit-on-idle', '--quiet'], start_new_session=True) def _set_tty_env(): stdout_name = os.readlink('/proc/self/fd/1') # Anonymous pipes can't be opened. These look like "pipe:[394765110]". ret = os.path.exists(stdout_name) if ret: os.environ.setdefault("AUTONINJA_STDOUT_NAME", stdout_name) return ret @contextlib.contextmanager def build_server_context(build_id, out_dir, use_android_build_server=False): if not use_android_build_server or not _set_tty_env(): yield return server_path = _get_server_path() _start_server(server_path) # Tell the build server about us. _register_build_id(server_path, build_id, out_dir) _set_signal_handler(server_path, build_id) yield # No need to print status if we CTRL+Ced out. if (not _is_canceled): _print_status(server_path, build_id)