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

Commit 127127b6 authored by LaMont Jones's avatar LaMont Jones
Browse files

Add support for PRODUCT_RELEASE_CONFIG_MAPS

This allows product config to determine what build flags are present in
a product's build, as well as their value.

As product config moves to a declarative specification, this can be
handled with less unnecessary work.

Bug: b/302593603
Bug: b/308849337
Test: manual
Change-Id: If57622059bb7d1c33df7498321db621c0c2d30c0
parent 87706098
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -59,6 +59,9 @@ type command struct {

	// run the command
	run func(ctx build.Context, config build.Config, args []string)

	// whether to do common setup before calling run.
	doSetup bool
}

// list of supported commands (flags) supported by soong ui
@@ -69,6 +72,7 @@ var commands = []command{
		config:      build.NewConfig,
		stdio:       stdio,
		run:         runMake,
		doSetup:     true,
	}, {
		flag:         "--dumpvar-mode",
		description:  "print the value of the legacy make variable VAR to stdout",
@@ -77,6 +81,7 @@ var commands = []command{
		config:       dumpVarConfig,
		stdio:        customStdio,
		run:          dumpVar,
		doSetup:      true,
	}, {
		flag:         "--dumpvars-mode",
		description:  "dump the values of one or more legacy make variables, in shell syntax",
@@ -85,6 +90,7 @@ var commands = []command{
		config:       dumpVarConfig,
		stdio:        customStdio,
		run:          dumpVars,
		doSetup:      true,
	}, {
		flag:        "--build-mode",
		description: "build modules based on the specified build action",
@@ -182,8 +188,12 @@ func main() {
		CriticalPath: criticalPath,
	}}

	freshConfig := func() build.Config {
		config := c.config(buildCtx, args...)
		config.SetLogsPrefix(c.logsPrefix)
		return config
	}
	config := freshConfig()
	logsDir := config.LogsDir()
	buildStarted = config.BuildStartedTimeOrDefault(buildStarted)

@@ -213,6 +223,16 @@ func main() {
		log.Verbosef("  [%d] %s", i, arg)
	}

	if c.doSetup {
		// We need to call logAndSymlinkSetup before we can do product
		// config, which is how we get PRODUCT_CONFIG_RELEASE_MAPS set
		// for the final product config for the build.
		logAndSymlinkSetup(buildCtx, config)
		if build.SetProductReleaseConfigMaps(buildCtx, config) {
			config = freshConfig()
		}

	}
	defer func() {
		stat.Finish()
		criticalPath.WriteToMetrics(met)
@@ -311,7 +331,6 @@ func removeBadTargetRename(ctx build.Context, config build.Config) {
}

func dumpVar(ctx build.Context, config build.Config, args []string) {
	logAndSymlinkSetup(ctx, config)
	flags := flag.NewFlagSet("dumpvar", flag.ExitOnError)
	flags.SetOutput(ctx.Writer)

@@ -364,7 +383,6 @@ func dumpVar(ctx build.Context, config build.Config, args []string) {
}

func dumpVars(ctx build.Context, config build.Config, args []string) {
	logAndSymlinkSetup(ctx, config)

	flags := flag.NewFlagSet("dumpvars", flag.ExitOnError)
	flags.SetOutput(ctx.Writer)
@@ -544,7 +562,6 @@ func buildActionConfig(ctx build.Context, args ...string) build.Config {
}

func runMake(ctx build.Context, config build.Config, _ []string) {
	logAndSymlinkSetup(ctx, config)
	logsDir := config.LogsDir()
	if config.IsVerbose() {
		writer := ctx.Writer
+37 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import (
	"time"

	"android/soong/shared"
	"android/soong/ui/metrics"

	"google.golang.org/protobuf/proto"

@@ -465,6 +466,42 @@ func NewBuildActionConfig(action BuildAction, dir string, ctx Context, args ...s
	return NewConfig(ctx, getConfigArgs(action, dir, ctx, args)...)
}

// Prepare for getting make variables.  For them to be accurate, we need to have
// obtained PRODUCT_RELEASE_CONFIG_MAPS.
//
// Returns:
//
//	Whether config should be called again.
//
// TODO: when converting product config to a declarative language, make sure
// that PRODUCT_RELEASE_CONFIG_MAPS is properly handled as a separate step in
// that process.
func SetProductReleaseConfigMaps(ctx Context, config Config) bool {
	ctx.BeginTrace(metrics.RunKati, "SetProductReleaseConfigMaps")
	defer ctx.EndTrace()

	if config.SkipConfig() {
		// This duplicates the logic from Build to skip product config
		// if the user has explicitly said to.
		return false
	}

	releaseConfigVars := []string{
		"PRODUCT_RELEASE_CONFIG_MAPS",
	}

	origValue, _ := config.environ.Get("PRODUCT_RELEASE_CONFIG_MAPS")
	// Get the PRODUCT_RELEASE_CONFIG_MAPS for this product, to avoid polluting the environment
	// when we run product config to get the rest of the make vars.
	releaseMapVars, err := dumpMakeVars(ctx, config, nil, releaseConfigVars, false, "")
	if err != nil {
		ctx.Fatalln("Error getting PRODUCT_RELEASE_CONFIG_MAPS:", err)
	}
	productReleaseConfigMaps := releaseMapVars["PRODUCT_RELEASE_CONFIG_MAPS"]
	os.Setenv("PRODUCT_RELEASE_CONFIG_MAPS", productReleaseConfigMaps)
	return origValue != productReleaseConfigMaps
}

// storeConfigMetrics selects a set of configuration information and store in
// the metrics system for further analysis.
func storeConfigMetrics(ctx Context, config Config) {
+3 −0
Original line number Diff line number Diff line
@@ -191,6 +191,9 @@ func runMakeProductConfig(ctx Context, config Config) {
		"TARGET_BUILD_APPS",
		"TARGET_BUILD_UNBUNDLED",

		// Additional release config maps
		"PRODUCT_RELEASE_CONFIG_MAPS",

		// compiler wrappers set up by make
		"CC_WRAPPER",
		"CXX_WRAPPER",