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
diff --git a/cmd/soong_ui/main.go b/cmd/soong_ui/main.go
index 18cba77..df8101c 100644
--- a/cmd/soong_ui/main.go
+++ b/cmd/soong_ui/main.go
@@ -59,6 +59,9 @@
// 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 @@
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 @@
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 @@
config: dumpVarConfig,
stdio: customStdio,
run: dumpVars,
+ doSetup: true,
}, {
flag: "--build-mode",
description: "build modules based on the specified build action",
@@ -182,8 +188,12 @@
CriticalPath: criticalPath,
}}
- config := c.config(buildCtx, args...)
- config.SetLogsPrefix(c.logsPrefix)
+ 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 @@
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 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 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 runMake(ctx build.Context, config build.Config, _ []string) {
- logAndSymlinkSetup(ctx, config)
logsDir := config.LogsDir()
if config.IsVerbose() {
writer := ctx.Writer
diff --git a/ui/build/config.go b/ui/build/config.go
index b228bb4..ac1bc7c 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -31,6 +31,7 @@
"time"
"android/soong/shared"
+ "android/soong/ui/metrics"
"google.golang.org/protobuf/proto"
@@ -465,6 +466,42 @@
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) {
diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go
index efe7478..d364542 100644
--- a/ui/build/dumpvars.go
+++ b/ui/build/dumpvars.go
@@ -191,6 +191,9 @@
"TARGET_BUILD_APPS",
"TARGET_BUILD_UNBUNDLED",
+ // Additional release config maps
+ "PRODUCT_RELEASE_CONFIG_MAPS",
+
// compiler wrappers set up by make
"CC_WRAPPER",
"CXX_WRAPPER",