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