diff --git a/autoninja.py b/autoninja.py index e68c52d30..4459f9d1b 100755 --- a/autoninja.py +++ b/autoninja.py @@ -186,7 +186,7 @@ def _print_cmd(cmd): print(*[shell_quoter(arg) for arg in cmd], file=sys.stderr) -def main(args, should_collect_logs=False): +def _main_inner(input_args, should_collect_logs=False): # if user doesn't set PYTHONPYCACHEPREFIX and PYTHONDONTWRITEBYTECODE # set PYTHONDONTWRITEBYTECODE=1 not to create many *.pyc in workspace # and keep workspace clean. @@ -197,17 +197,7 @@ def main(args, should_collect_logs=False): j_specified = False offline = False output_dir = "." - input_args = args summarize_build = os.environ.get("NINJA_SUMMARIZE_BUILD") == "1" - # On Windows the autoninja.bat script passes along the arguments enclosed in - # double quotes. This prevents multiple levels of parsing of the special '^' - # characters needed when compiling a single file but means that this script - # gets called with a single argument containing all of the actual arguments, - # separated by spaces. When this case is detected we need to do argument - # splitting ourselves. This means that arguments containing actual spaces - # are not supported by autoninja, but that is not a real limitation. - if sys.platform.startswith("win") and len(args) == 2: - input_args = args[:1] + args[1].split() # Ninja uses getopt_long, which allow to intermix non-option arguments. # To leave non supported parameters untouched, we do not use getopt. @@ -349,11 +339,11 @@ def main(args, should_collect_logs=False): fileno_limit, hard_limit = resource.getrlimit( resource.RLIMIT_NOFILE) - args = ['ninja'] + ninja_args = ['ninja'] num_cores = multiprocessing.cpu_count() if not j_specified and not t_specified: if not offline and use_remoteexec: - args.append("-j") + ninja_args.append("-j") default_core_multiplier = 80 if platform.machine() in ("x86_64", "AMD64"): # Assume simultaneous multithreading and therefore half as many @@ -379,28 +369,28 @@ def main(args, should_collect_logs=False): if sys.platform in ["darwin", "linux"]: j_value = min(j_value, int(fileno_limit * 0.8)) - args.append("%d" % j_value) + ninja_args.append("%d" % j_value) else: j_value = num_cores # Ninja defaults to |num_cores + 2| j_value += int(os.environ.get("NINJA_CORE_ADDITION", "2")) - args.append("-j") - args.append("%d" % j_value) + ninja_args.append("-j") + ninja_args.append("%d" % j_value) if summarize_build: # Enable statistics collection in Ninja. - args += ["-d", "stats"] + ninja_args += ["-d", "stats"] - args += input_args[1:] + ninja_args += input_args[1:] if summarize_build: # Print the command-line to reassure the user that the right settings # are being used. - _print_cmd(args) + _print_cmd(ninja_args) if use_reclient: - return reclient_helper.run_ninja(args, should_collect_logs) - return ninja.main(args) + return reclient_helper.run_ninja(ninja_args, should_collect_logs) + return ninja.main(ninja_args) def _upload_ninjalog(args): @@ -416,14 +406,28 @@ def _upload_ninjalog(args): ) -if __name__ == "__main__": +def main(args): # Check the log collection opt-in/opt-out status, and display notice if necessary. - _should_collect_logs = build_telemetry.enabled() + should_collect_logs = build_telemetry.enabled() + # On Windows the autoninja.bat script passes along the arguments enclosed in + # double quotes. This prevents multiple levels of parsing of the special '^' + # characters needed when compiling a single file but means that this script + # gets called with a single argument containing all of the actual arguments, + # separated by spaces. When this case is detected we need to do argument + # splitting ourselves. This means that arguments containing actual spaces + # are not supported by autoninja, but that is not a real limitation. + input_args = args + if sys.platform.startswith("win") and len(args) == 2: + input_args = args[:1] + args[1].split() try: - exit_code = main(sys.argv, _should_collect_logs) + exit_code = _main_inner(input_args, should_collect_logs) except KeyboardInterrupt: exit_code = 1 finally: - if _should_collect_logs: - _upload_ninjalog(sys.argv) - sys.exit(exit_code) + if should_collect_logs: + _upload_ninjalog(input_args) + return exit_code + + +if __name__ == "__main__": + sys.exit(main(sys.argv))