From 655afebfcd133e224e8a35f43acbc43dbdaf61af Mon Sep 17 00:00:00 2001 From: Bruce Dawson Date: Mon, 2 Nov 2020 23:30:37 +0000 Subject: [PATCH] Support autoninja -o/--offline to disable goma It is sometimes helpful to do a full build of Chrome using goma while online and then do incremental builds without goma while offline or with poor network bandwidth. Turning off goma in gn args triggers a full rebuild but the GOMA_DISABLED environment variable can be used to disable goma without triggering a rebuild. In order to make this feature easier to discover and use this change adds support for -o/--offline to autoninja. autoninja -h will mention this flag and autoninja.bat/autoninja.py handle it appropriately. This means setting the environment variable in autoninja.bat, and using it to adjust the -j value and stripping it out in autoninja.py. The bash script that wraps autoninja.py on Linux and OSX did not need updating because the Python script can emit 'GOMA_DISABLED=1 ninja ...' and this is executed by bash. This was produced during pair programming with jessemckenna@ Bug: b/172039612 Change-Id: Ifcfbc598ac20f23e5fe013e02979b5b8c2851b01 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/2510818 Auto-Submit: Bruce Dawson Commit-Queue: Dirk Pranke Reviewed-by: Dirk Pranke --- autoninja.bat | 19 +++++++++++++++---- autoninja.py | 20 ++++++++++++++++++-- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/autoninja.bat b/autoninja.bat index 8b5904c60..5dee6de84 100755 --- a/autoninja.bat +++ b/autoninja.bat @@ -14,19 +14,30 @@ REM to see how quickly process creation is happening - often a critical clue on REM Windows. The trailing space is intentional. if "%NINJA_SUMMARIZE_BUILD%" == "1" set NINJA_STATUS=[%%r processes, %%f/%%t @ %%o/s : %%es ] +set scriptdir=%~dp0 + +:loop +IF NOT "%1"=="" ( + @rem Tell goma to not do network compiles. + IF "%1"=="--offline" SET GOMA_DISABLED=1 + IF "%1"=="-o" SET GOMA_DISABLED=1 + SHIFT + GOTO :loop +) + REM Execute whatever is printed by autoninja.py. REM Also print it to reassure that the right settings are being used. -FOR /f "usebackq tokens=*" %%a in (`vpython %~dp0autoninja.py "%*"`) do echo %%a & %%a +FOR /f "usebackq tokens=*" %%a in (`vpython %scriptdir%autoninja.py "%*"`) do echo %%a & %%a @if errorlevel 1 goto buildfailure REM Use call to invoke vpython script here, because we use vpython via vpython.bat. -@if "%NINJA_SUMMARIZE_BUILD%" == "1" call vpython.bat %~dp0post_build_ninja_summary.py %* -@call vpython.bat %~dp0ninjalog_uploader_wrapper.py --cmdline %* +@if "%NINJA_SUMMARIZE_BUILD%" == "1" call vpython.bat %scriptdir%post_build_ninja_summary.py %* +@call vpython.bat %scriptdir%ninjalog_uploader_wrapper.py --cmdline %* exit /b :buildfailure -@call vpython.bat %~dp0ninjalog_uploader_wrapper.py --cmdline %* +@call vpython.bat %scriptdir%ninjalog_uploader_wrapper.py --cmdline %* REM Return an error code of 1 so that if a developer types: REM "autoninja chrome && chrome" then chrome won't run if the build fails. diff --git a/autoninja.py b/autoninja.py index 020acc574..a0f49966b 100755 --- a/autoninja.py +++ b/autoninja.py @@ -30,6 +30,7 @@ SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) # The -t tools are incompatible with -j t_specified = False j_specified = False +offline = False output_dir = '.' input_args = sys.argv # On Windows the autoninja.bat script passes along the arguments enclosed in @@ -56,6 +57,15 @@ for index, arg in enumerate(input_args[1:]): elif arg.startswith('-C'): # Support -Cout/Default output_dir = arg[2:] + elif arg == '-o' or arg == '--offline': + offline = True + elif arg == '-h': + print('autoninja: Use -o/--offline to temporary disable goma.', + file=sys.stderr) + print(file=sys.stderr) + +# Strip -o/--offline so ninja doesn't see them. +input_args = [ arg for arg in input_args if arg != '-o' and arg != '--offline'] use_remote_build = False @@ -92,7 +102,7 @@ elif os.path.exists(os.path.join(output_dir, 'rules.ninja')): # for each compile step. Checking this environment variable ensures that # autoninja uses an appropriate -j value in this situation. goma_disabled_env = os.environ.get('GOMA_DISABLED', '0').lower() -if goma_disabled_env in ['true', 't', 'yes', 'y', '1']: +if offline or goma_disabled_env in ['true', 't', 'yes', 'y', '1']: use_remote_build = False # Specify ninja.exe on Windows so that ninja.bat can call autoninja and not @@ -150,4 +160,10 @@ for i in range(len(args)): if os.environ.get('NINJA_SUMMARIZE_BUILD', '0') == '1': args += ['-d', 'stats'] -print(' '.join(args)) +if offline and not sys.platform.startswith('win'): + # Tell goma to do local compiles. On Windows this environment variable is set + # by the wrapper batch file. + print('GOMA_DISABLED=1 ' + ' '.join(args)) +else: + print(' '.join(args)) +