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

Commit e114e606 authored by Jeongik Cha's avatar Jeongik Cha
Browse files

Add HINT_FROM_SOONG option for ninja weight list

If this option is set, Soong generates ninja weight list including
modules in HugeModulesList in allowlists.go

Test: m --ninja_weight_source=soong
Bug: 273282046
Change-Id: Id92b7f9f9e8152c1c46ae071c5821a479cf47bce
parent 518f3ea1
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ const (
	// all modules in this package and subpackages default to bp2build_available: false.
	// allows modules to opt-in.
	Bp2BuildDefaultFalseRecursively

	DEFAULT_NINJA_WEIGHT = 1000
)

var (
@@ -1470,4 +1472,31 @@ var (
	// "libssl",
	// "libstagefright_flacdec",
	// "libutils",

	// TODO(b/273282046): Make this list customizable to support various targets.
	// The list of modules which are expected to spend lots of build time.
	// With `--ninja_weight_source=soong`, ninja builds these modules and deps first.
	HugeModulesMap = map[string]int{
		"libbt_packets":                           DEFAULT_NINJA_WEIGHT,
		"libbt_packets_nonapex":                   DEFAULT_NINJA_WEIGHT,
		"crosvm":                                  DEFAULT_NINJA_WEIGHT,
		"system-api-stubs-docs-non-updatable":     DEFAULT_NINJA_WEIGHT,
		"test-api-stubs-docs-non-updatable":       DEFAULT_NINJA_WEIGHT,
		"module-lib-api-stubs-docs-non-updatable": DEFAULT_NINJA_WEIGHT,
		"libdevices":                              DEFAULT_NINJA_WEIGHT,
		"libaom":                                  DEFAULT_NINJA_WEIGHT,
		"libart-disassembler":                     DEFAULT_NINJA_WEIGHT,
		"libart":                                  DEFAULT_NINJA_WEIGHT,
		"libprotobuf":                             DEFAULT_NINJA_WEIGHT,
		"libsyn":                                  DEFAULT_NINJA_WEIGHT,
		"api-stubs-docs-non-updatable":            DEFAULT_NINJA_WEIGHT,
		"framework-res":                           DEFAULT_NINJA_WEIGHT,
		"SystemUI-core":                           DEFAULT_NINJA_WEIGHT,
		"services-non-updatable-stubs":            DEFAULT_NINJA_WEIGHT,
		"art.module.public.api.stubs.source":      DEFAULT_NINJA_WEIGHT,
		"art.module.intra.core.api.stubs.source":  DEFAULT_NINJA_WEIGHT,
		"virtmgr":                                 DEFAULT_NINJA_WEIGHT,
		"metalava":                                DEFAULT_NINJA_WEIGHT,
		"libkeystore2":                            DEFAULT_NINJA_WEIGHT,
	}
)
+27 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import (
	"time"

	"android/soong/android"
	"android/soong/android/allowlists"
	"android/soong/bazel"
	"android/soong/bp2build"
	"android/soong/shared"
@@ -252,6 +253,29 @@ func apiBuildFileExcludes(ctx *android.Context) []string {
	return ret
}

func writeNinjaHint(ctx *android.Context) error {
	wantModules := make([]string, len(allowlists.HugeModulesMap))
	i := 0
	for k := range allowlists.HugeModulesMap {
		wantModules[i] = k
		i += 1
	}
	outputsMap := ctx.Context.GetOutputsFromModuleNames(wantModules)
	var outputBuilder strings.Builder
	for k, v := range allowlists.HugeModulesMap {
		for _, output := range outputsMap[k] {
			outputBuilder.WriteString(fmt.Sprintf("%s,%d\n", output, v))
		}
	}
	weightListFile := filepath.Join(topDir, ctx.Config().OutDir(), ".ninja_weight_list")

	err := os.WriteFile(weightListFile, []byte(outputBuilder.String()), 0644)
	if err != nil {
		return fmt.Errorf("could not write ninja weight list file %s", err)
	}
	return nil
}

func writeMetrics(configuration android.Config, eventHandler *metrics.EventHandler, metricsDir string) {
	if len(metricsDir) < 1 {
		fmt.Fprintf(os.Stderr, "\nMissing required env var for generating soong metrics: LOG_DIR\n")
@@ -412,6 +436,9 @@ func main() {
		} else {
			finalOutputFile = runSoongOnlyBuild(ctx, extraNinjaDeps)
		}
		if ctx.Config().IsEnvTrue("SOONG_GENERATES_NINJA_HINT") {
			writeNinjaHint(ctx)
		}
		writeMetrics(configuration, ctx.EventHandler, metricsDir)
	}
	writeUsedEnvironmentFile(configuration, finalOutputFile)
+10 −0
Original line number Diff line number Diff line
@@ -134,6 +134,8 @@ const (
	EVENLY_DISTRIBUTED
	// ninja uses an external custom weight list
	EXTERNAL_FILE
	// ninja uses a prioritized module list from Soong
	HINT_FROM_SOONG
)
const srcDirFileCheck = "build/soong/root.bp"

@@ -319,6 +321,10 @@ func NewConfig(ctx Context, args ...string) Config {

	ret.totalRAM = detectTotalRAM(ctx)
	ret.parseArgs(ctx, args)

	if ret.ninjaWeightListSource == HINT_FROM_SOONG {
		ret.environ.Set("SOONG_GENERATES_NINJA_HINT", "true")
	}
	// Make sure OUT_DIR is set appropriately
	if outDir, ok := ret.environ.Get("OUT_DIR"); ok {
		ret.environ.Set("OUT_DIR", filepath.Clean(outDir))
@@ -551,6 +557,8 @@ func getNinjaWeightListSourceInMetric(s NinjaWeightListSource) *smpb.BuildConfig
		return smpb.BuildConfig_EVENLY_DISTRIBUTED.Enum()
	case EXTERNAL_FILE:
		return smpb.BuildConfig_EXTERNAL_FILE.Enum()
	case HINT_FROM_SOONG:
		return smpb.BuildConfig_HINT_FROM_SOONG.Enum()
	default:
		return smpb.BuildConfig_NOT_USED.Enum()
	}
@@ -834,6 +842,8 @@ func (c *configImpl) parseArgs(ctx Context, args []string) {
				c.ninjaWeightListSource = EVENLY_DISTRIBUTED
			} else if source == "not_used" {
				c.ninjaWeightListSource = NOT_USED
			} else if source == "soong" {
				c.ninjaWeightListSource = HINT_FROM_SOONG
			} else if strings.HasPrefix(source, "file,") {
				c.ninjaWeightListSource = EXTERNAL_FILE
				filePath := strings.TrimPrefix(source, "file,")
+3 −1
Original line number Diff line number Diff line
@@ -136,7 +136,9 @@ func runNinjaForBuild(ctx Context, config Config) {
		// 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:
		// The weight list is already copied.
		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)
	}
+166 −161

File changed.

Preview size limit exceeded, changes collapsed.

Loading