diff --git a/ui/build/config.go b/ui/build/config.go index d72c8fa01..851a22ae1 100644 --- a/ui/build/config.go +++ b/ui/build/config.go @@ -54,6 +54,16 @@ func init() { rbeRandPrefix = rand.Intn(1000) } +// Which builder are we using? +type ninjaCommandType = int + +const ( + _ = iota + NINJA_NINJA + NINJA_N2 + NINJA_SISO +) + type Config struct{ *configImpl } type configImpl struct { @@ -123,9 +133,8 @@ type configImpl struct { // 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 + // Which builder are we using + ninjaCommand ninjaCommandType } type NinjaWeightListSource uint @@ -288,8 +297,16 @@ 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.ninjaCommand = NINJA_NINJA + switch os.Getenv("SOONG_NINJA") { + case "n2": + ret.ninjaCommand = NINJA_N2 + case "siso": + ret.ninjaCommand = NINJA_SISO + default: + if os.Getenv("SOONG_USE_N2") == "true" { + ret.ninjaCommand = NINJA_N2 + } } ret.environ.Unset( @@ -349,7 +366,8 @@ 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. + // Use config.ninjaCommand instead. + "SOONG_NINJA", "SOONG_USE_N2", ) @@ -1643,6 +1661,12 @@ func (c *configImpl) N2Bin() string { return strings.ReplaceAll(path, "/linux-x86/", "/linux_musl-x86/") } +func (c *configImpl) SisoBin() string { + path := c.PrebuiltBuildTool("siso") + // Use musl instead of glibc because glibc on the build server is old and has bugs + return strings.ReplaceAll(path, "/linux-x86/", "/linux_musl-x86/") +} + func (c *configImpl) PrebuiltBuildTool(name string) string { if v, ok := c.environ.Get("SANITIZE_HOST"); ok { if sanitize := strings.Fields(v); inList("address", sanitize) { diff --git a/ui/build/ninja.go b/ui/build/ninja.go index 4e3e54443..def0783a2 100644 --- a/ui/build/ninja.go +++ b/ui/build/ninja.go @@ -49,14 +49,10 @@ func runNinjaForBuild(ctx Context, config Config) { nr := status.NewNinjaReader(ctx, ctx.Status.StartTool(), fifo) defer nr.Close() - executable := config.NinjaBin() - args := []string{ - "-d", "keepdepfile", - "-d", "keeprsp", - "-d", "stats", - "--frontend_file", fifo, - } - if config.useN2 { + var executable string + var args []string + switch config.ninjaCommand { + case NINJA_N2: executable = config.N2Bin() args = []string{ "-d", "trace", @@ -66,8 +62,31 @@ func runNinjaForBuild(ctx Context, config Config) { //"-d", "stats", "--frontend-file", fifo, } + case NINJA_SISO: + executable = config.SisoBin() + args = []string{ + "ninja", + "--log_dir", config.SoongOutDir(), + // TODO: implement these features, or remove them. + //"-d", "trace", + //"-d", "keepdepfile", + //"-d", "keeprsp", + //"-d", "stats", + //"--frontend-file", fifo, + } + default: + // NINJA_NINJA is the default. + executable = config.NinjaBin() + args = []string{ + "-d", "keepdepfile", + "-d", "keeprsp", + "-d", "stats", + "--frontend_file", fifo, + "-o", "usesphonyoutputs=yes", + "-w", "dupbuild=err", + "-w", "missingdepfile=err", + } } - args = append(args, config.NinjaArgs()...) var parallel int @@ -83,17 +102,10 @@ func runNinjaForBuild(ctx Context, config Config) { args = append(args, "-f", config.CombinedNinjaFile()) - 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. - if !config.useN2 { + if config.ninjaCommand != NINJA_N2 { args = append(args, "-w", "missingoutfile=err", ) @@ -110,21 +122,18 @@ func runNinjaForBuild(ctx Context, config Config) { cmd.Environment.AppendFromKati(config.KatiEnvFile()) } - switch config.NinjaWeightListSource() { - case NINJA_LOG: - if !config.useN2 { + // TODO(b/346806126): implement this for the other ninjaCommand values. + if config.ninjaCommand == NINJA_NINJA { + switch config.NinjaWeightListSource() { + case NINJA_LOG: 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). - if !config.useN2 { + 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") - } - case EXTERNAL_FILE: - fallthrough - case HINT_FROM_SOONG: - // The weight list is already copied/generated. - if !config.useN2 { + 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) } @@ -227,6 +236,8 @@ 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", + // Do not do reanalysis just because we changed ninja commands. + "SOONG_NINJA", "SOONG_USE_N2", "RUST_BACKTRACE", "RUST_LOG", @@ -235,8 +246,11 @@ func runNinjaForBuild(ctx Context, config Config) { cmd.Environment.Set("DIST_DIR", config.DistDir()) cmd.Environment.Set("SHELL", "/bin/bash") - if config.useN2 { + switch config.ninjaCommand { + case NINJA_N2: cmd.Environment.Set("RUST_BACKTRACE", "1") + default: + // Only set RUST_BACKTRACE for n2. } // Print the environment variables that Ninja is operating in. diff --git a/ui/build/soong.go b/ui/build/soong.go index 97bc9971e..eb51022af 100644 --- a/ui/build/soong.go +++ b/ui/build/soong.go @@ -588,19 +588,11 @@ func runSoong(ctx Context, config Config) { nr := status.NewNinjaReader(ctx, ctx.Status.StartTool(), fifo) defer nr.Close() - ninjaArgs := []string{ - "-d", "keepdepfile", - "-d", "stats", - "-o", "usesphonyoutputs=yes", - "-o", "preremoveoutputs=yes", - "-w", "dupbuild=err", - "-w", "outputdir=err", - "-w", "missingoutfile=err", - "-j", strconv.Itoa(config.Parallel()), - "--frontend_file", fifo, - "-f", filepath.Join(config.SoongOutDir(), "bootstrap.ninja"), - } - if config.useN2 { + var ninjaCmd string + var ninjaArgs []string + switch config.ninjaCommand { + case NINJA_N2: + ninjaCmd = config.N2Bin() ninjaArgs = []string{ // TODO: implement these features, or remove them. //"-d", "keepdepfile", @@ -615,6 +607,39 @@ func runSoong(ctx Context, config Config) { "--frontend-file", fifo, "-f", filepath.Join(config.SoongOutDir(), "bootstrap.ninja"), } + case NINJA_SISO: + ninjaCmd = config.SisoBin() + ninjaArgs = []string{ + "ninja", + // 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, + "--log_dir", config.SoongOutDir(), + "-f", filepath.Join(config.SoongOutDir(), "bootstrap.ninja"), + } + default: + // NINJA_NINJA is the default. + ninjaCmd = config.NinjaBin() + ninjaArgs = []string{ + "-d", "keepdepfile", + "-d", "stats", + "-o", "usesphonyoutputs=yes", + "-o", "preremoveoutputs=yes", + "-w", "dupbuild=err", + "-w", "outputdir=err", + "-w", "missingoutfile=err", + "-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 { @@ -623,10 +648,6 @@ func runSoong(ctx Context, config Config) { } ninjaArgs = append(ninjaArgs, targets...) - ninjaCmd := config.NinjaBin() - if config.useN2 { - ninjaCmd = config.N2Bin() - } cmd := Command(ctx, config, "soong bootstrap", ninjaCmd, ninjaArgs...)