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

Commit 518f3ea1 authored by Jeongik Cha's avatar Jeongik Cha
Browse files

Add EXTERNAL_FILE option for ninja weight list

Test: m --ninja_weight_source=file,<file path>
Bug: 271527305
Change-Id: Ibeae4c757dff281be69486a9758dbee3584d9dec
parent f4f03435
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -132,6 +132,8 @@ const (
	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 @@ func getNinjaWeightListSourceInMetric(s NinjaWeightListSource) *smpb.BuildConfig
		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 @@ func (c *configImpl) parseArgs(ctx Context, args []string) {
				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 (c *configImpl) parseArgs(ctx Context, args []string) {
	}
}

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()
+8 −3
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ const (
	// File containing the environment state when ninja is executed
	ninjaEnvFileName        = "ninja.environment"
	ninjaLogFileName        = ".ninja_log"
	ninjaWeightListFileName = ".ninja_weight_list"
)

func useNinjaBuildLog(ctx Context, config Config, cmd *Cmd) {
@@ -66,7 +67,7 @@ func useNinjaBuildLog(ctx Context, config Config, cmd *Cmd) {
		ctx.Verbosef("There is an error during reading ninja log, so ninja will use empty weight list: %s", err)
	}

	weightListFile := filepath.Join(config.OutDir(), ".ninja_weight_list")
	weightListFile := filepath.Join(config.OutDir(), ninjaWeightListFileName)

	err = os.WriteFile(weightListFile, []byte(outputBuilder.String()), 0644)
	if err == nil {
@@ -134,6 +135,10 @@ func runNinjaForBuild(ctx Context, config Config) {
	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:
		// The weight list is already copied.
		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
+157 −152

File changed.

Preview size limit exceeded, changes collapsed.

+2 −0
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ message BuildConfig {
    NOT_USED = 0;
    NINJA_LOG = 1;
    EVENLY_DISTRIBUTED = 2;
    EXTERNAL_FILE = 3;
  }

  optional bool use_goma = 1;
@@ -163,6 +164,7 @@ message BuildConfig {
  // NOT_USED - ninja doesn't use weight list.
  // NINJA_LOG - ninja uses weight list based on previous builds by ninja log
  // EVENLY_DISTRIBUTED - ninja thinks every task has the same weight.
  // EXTERNAL_FILE - ninja uses an external custom weight list
  optional NinjaWeightListSource ninja_weight_list_source = 8 [default = NOT_USED];
}