diff --git a/ui/build/config.go b/ui/build/config.go index 52c5e233c..2470f843d 100644 --- a/ui/build/config.go +++ b/ui/build/config.go @@ -121,6 +121,10 @@ type configImpl struct { // There's quite a bit of overlap with module-info.json and soong module graph. We // could consider merging them. moduleDebugFile string + + // Whether to use n2 instead of ninja. This is controlled with the + // environment variable SOONG_USE_N2 + useN2 bool } type NinjaWeightListSource uint @@ -283,6 +287,10 @@ func NewConfig(ctx Context, args ...string) Config { ret.moduleDebugFile, _ = filepath.Abs(shared.JoinPath(ret.SoongOutDir(), "soong-debug-info.json")) } + if os.Getenv("SOONG_USE_N2") == "true" { + ret.useN2 = true + } + ret.environ.Unset( // We're already using it "USE_SOONG_UI", @@ -339,6 +347,9 @@ func NewConfig(ctx Context, args ...string) Config { // We read it here already, don't let others share in the fun "GENERATE_SOONG_DEBUG", + + // Use config.useN2 instead. + "SOONG_USE_N2", ) if ret.UseGoma() || ret.ForceUseGoma() { diff --git a/ui/build/ninja.go b/ui/build/ninja.go index ae27330a9..1935e7210 100644 --- a/ui/build/ninja.go +++ b/ui/build/ninja.go @@ -56,6 +56,17 @@ func runNinjaForBuild(ctx Context, config Config) { "-d", "stats", "--frontend_file", fifo, } + if config.useN2 { + executable = config.PrebuiltBuildTool("n2") + args = []string{ + "-d", "trace", + // TODO: implement these features, or remove them. + //"-d", "keepdepfile", + //"-d", "keeprsp", + //"-d", "stats", + "--frontend-file", fifo, + } + } args = append(args, config.NinjaArgs()...) @@ -72,17 +83,21 @@ func runNinjaForBuild(ctx Context, config Config) { args = append(args, "-f", config.CombinedNinjaFile()) - args = append(args, - "-o", "usesphonyoutputs=yes", - "-w", "dupbuild=err", - "-w", "missingdepfile=err") + if !config.useN2 { + args = append(args, + "-o", "usesphonyoutputs=yes", + "-w", "dupbuild=err", + "-w", "missingdepfile=err") + } if !config.BuildBrokenMissingOutputs() { // Missing outputs will be treated as errors. // BUILD_BROKEN_MISSING_OUTPUTS can be used to bypass this check. - args = append(args, - "-w", "missingoutfile=err", - ) + if !config.useN2 { + args = append(args, + "-w", "missingoutfile=err", + ) + } } cmd := Command(ctx, config, "ninja", executable, args...) @@ -97,16 +112,22 @@ func runNinjaForBuild(ctx Context, config Config) { switch config.NinjaWeightListSource() { case NINJA_LOG: - cmd.Args = append(cmd.Args, "-o", "usesninjalogasweightlist=yes") + if !config.useN2 { + cmd.Args = append(cmd.Args, "-o", "usesninjalogasweightlist=yes") + } case EVENLY_DISTRIBUTED: // pass empty weight list means ninja considers every tasks's weight as 1(default value). - cmd.Args = append(cmd.Args, "-o", "usesweightlist=/dev/null") + if !config.useN2 { + cmd.Args = append(cmd.Args, "-o", "usesweightlist=/dev/null") + } case EXTERNAL_FILE: fallthrough case HINT_FROM_SOONG: // The weight list is already copied/generated. - ninjaWeightListPath := filepath.Join(config.OutDir(), ninjaWeightListFileName) - cmd.Args = append(cmd.Args, "-o", "usesweightlist="+ninjaWeightListPath) + if !config.useN2 { + ninjaWeightListPath := filepath.Join(config.OutDir(), ninjaWeightListFileName) + cmd.Args = append(cmd.Args, "-o", "usesweightlist="+ninjaWeightListPath) + } } // Allow both NINJA_ARGS and NINJA_EXTRA_ARGS, since both have been @@ -206,11 +227,16 @@ func runNinjaForBuild(ctx Context, config Config) { // We don't want this build broken flag to cause reanalysis, so allow it through to the // actions. "BUILD_BROKEN_INCORRECT_PARTITION_IMAGES", + "SOONG_USE_N2", + "RUST_BACKTRACE", }, config.BuildBrokenNinjaUsesEnvVars()...)...) } cmd.Environment.Set("DIST_DIR", config.DistDir()) cmd.Environment.Set("SHELL", "/bin/bash") + if config.useN2 { + cmd.Environment.Set("RUST_BACKTRACE", "1") + } // Print the environment variables that Ninja is operating in. ctx.Verboseln("Ninja environment: ") diff --git a/ui/build/soong.go b/ui/build/soong.go index 77fee0ac6..e18cc2579 100644 --- a/ui/build/soong.go +++ b/ui/build/soong.go @@ -638,6 +638,22 @@ func runSoong(ctx Context, config Config) { "--frontend_file", fifo, "-f", filepath.Join(config.SoongOutDir(), "bootstrap.ninja"), } + if config.useN2 { + ninjaArgs = []string{ + // TODO: implement these features, or remove them. + //"-d", "keepdepfile", + //"-d", "stats", + //"-o", "usesphonyoutputs=yes", + //"-o", "preremoveoutputs=yes", + //"-w", "dupbuild=err", + //"-w", "outputdir=err", + //"-w", "missingoutfile=err", + "-v", + "-j", strconv.Itoa(config.Parallel()), + "--frontend-file", fifo, + "-f", filepath.Join(config.SoongOutDir(), "bootstrap.ninja"), + } + } if extra, ok := config.Environment().Get("SOONG_UI_NINJA_ARGS"); ok { ctx.Printf(`CAUTION: arguments in $SOONG_UI_NINJA_ARGS=%q, e.g. "-n", can make soong_build FAIL or INCORRECT`, extra) @@ -645,8 +661,13 @@ func runSoong(ctx Context, config Config) { } ninjaArgs = append(ninjaArgs, targets...) + ninjaCmd := config.PrebuiltBuildTool("ninja") + if config.useN2 { + ninjaCmd = config.PrebuiltBuildTool("n2") + } + cmd := Command(ctx, config, "soong bootstrap", - config.PrebuiltBuildTool("ninja"), ninjaArgs...) + ninjaCmd, ninjaArgs...) var ninjaEnv Environment