Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d299760e authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Allow multiple ninja implementations" into main am: d4771aa2 am: fea92ff7

parents cf9a2627 fea92ff7
Loading
Loading
Loading
Loading
+30 −6
Original line number Diff line number Diff line
@@ -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"))
	}

	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.useN2 = 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) {
+45 −31
Original line number Diff line number Diff line
@@ -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())
	}

	// TODO(b/346806126): implement this for the other ninjaCommand values.
	if config.ninjaCommand == NINJA_NINJA {
		switch config.NinjaWeightListSource() {
		case NINJA_LOG:
		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).
		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.
		if !config.useN2 {
			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.
+38 −17
Original line number Diff line number Diff line
@@ -588,20 +588,29 @@ 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",
		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",
				//"-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,
				"--frontend-file", fifo,
				"-f", filepath.Join(config.SoongOutDir(), "bootstrap.ninja"),
			}
		if config.useN2 {
		case NINJA_SISO:
			ninjaCmd = config.SisoBin()
			ninjaArgs = []string{
				"ninja",
				// TODO: implement these features, or remove them.
				//"-d", "keepdepfile",
				//"-d", "stats",
@@ -612,7 +621,23 @@ func runSoong(ctx Context, config Config) {
				//"-w", "missingoutfile=err",
				"-v",
				"-j", strconv.Itoa(config.Parallel()),
				"--frontend-file", fifo,
				//"--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"),
			}
		}
@@ -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...)