Add EXTERNAL_FILE option for ninja weight list
Test: m --ninja_weight_source=file,<file path>
Bug: 271527305
Change-Id: Ibeae4c757dff281be69486a9758dbee3584d9dec
diff --git a/ui/build/config.go b/ui/build/config.go
index 20cc9fb..3fb38d7 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -132,6 +132,8 @@
NINJA_LOG
// ninja thinks every task has the same weight.
EVENLY_DISTRIBUTED
+ // ninja uses an external custom weight list
+ EXTERNAL_FILE
)
const srcDirFileCheck = "build/soong/root.bp"
@@ -547,6 +549,8 @@
return smpb.BuildConfig_NINJA_LOG.Enum()
case EVENLY_DISTRIBUTED:
return smpb.BuildConfig_EVENLY_DISTRIBUTED.Enum()
+ case EXTERNAL_FILE:
+ return smpb.BuildConfig_EXTERNAL_FILE.Enum()
default:
return smpb.BuildConfig_NOT_USED.Enum()
}
@@ -830,6 +834,17 @@
c.ninjaWeightListSource = EVENLY_DISTRIBUTED
} else if source == "not_used" {
c.ninjaWeightListSource = NOT_USED
+ } else if strings.HasPrefix(source, "file,") {
+ c.ninjaWeightListSource = EXTERNAL_FILE
+ filePath := strings.TrimPrefix(source, "file,")
+ err := validateNinjaWeightList(filePath)
+ if err != nil {
+ ctx.Fatalf("Malformed weight list from %s: %s", filePath, err)
+ }
+ _, err = copyFile(filePath, filepath.Join(c.OutDir(), ".ninja_weight_list"))
+ if err != nil {
+ ctx.Fatalf("Error to copy ninja weight list from %s: %s", filePath, err)
+ }
} else {
ctx.Fatalf("unknown option for ninja_weight_source: %s", source)
}
@@ -903,6 +918,25 @@
}
}
+func validateNinjaWeightList(weightListFilePath string) (err error) {
+ data, err := os.ReadFile(weightListFilePath)
+ if err != nil {
+ return
+ }
+ lines := strings.Split(strings.TrimSpace(string(data)), "\n")
+ for _, line := range lines {
+ fields := strings.Split(line, ",")
+ if len(fields) != 2 {
+ return fmt.Errorf("wrong format, each line should have two fields, but '%s'", line)
+ }
+ _, err = strconv.Atoi(fields[1])
+ if err != nil {
+ return
+ }
+ }
+ return
+}
+
func (c *configImpl) configureLocale(ctx Context) {
cmd := Command(ctx, Config{c}, "locale", "locale", "-a")
output, err := cmd.Output()