Add product_config module
product_config module will export productVariables struct (defined in
android/variable.go). Other modules can depend on product_Config module
to read product variables, without needing to update Soong.
Bug: 346214955
Test: build and see output of product_config module
Change-Id: I06e1d2716dc2a8b90984bb46c5fc901cd1ca5020
diff --git a/android/Android.bp b/android/Android.bp
index 9ce8cdc..21ef59f 100644
--- a/android/Android.bp
+++ b/android/Android.bp
@@ -83,6 +83,7 @@
"plugin.go",
"prebuilt.go",
"prebuilt_build_tool.go",
+ "product_config.go",
"proto.go",
"provider.go",
"raw_files.go",
diff --git a/android/product_config.go b/android/product_config.go
new file mode 100644
index 0000000..20b29a7
--- /dev/null
+++ b/android/product_config.go
@@ -0,0 +1,58 @@
+// Copyright 2024 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package android
+
+import "github.com/google/blueprint/proptools"
+
+func init() {
+ ctx := InitRegistrationContext
+ ctx.RegisterModuleType("product_config", productConfigFactory)
+}
+
+type productConfigModule struct {
+ ModuleBase
+}
+
+func (p *productConfigModule) GenerateAndroidBuildActions(ctx ModuleContext) {
+ if ctx.ModuleName() != "product_config" || ctx.ModuleDir() != "build/soong" {
+ ctx.ModuleErrorf("There can only be one product_config module in build/soong")
+ return
+ }
+ outputFilePath := PathForModuleOut(ctx, p.Name()+".json").OutputPath
+
+ // DeviceProduct can be null so calling ctx.Config().DeviceProduct() may cause null dereference
+ targetProduct := proptools.String(ctx.Config().config.productVariables.DeviceProduct)
+ if targetProduct != "" {
+ targetProduct += "."
+ }
+ soongVariablesPath := PathForOutput(ctx, "soong."+targetProduct+"variables")
+ extraVariablesPath := PathForOutput(ctx, "soong."+targetProduct+"extra.variables")
+
+ rule := NewRuleBuilder(pctx, ctx)
+ rule.Command().BuiltTool("merge_json").
+ Output(outputFilePath).
+ Input(soongVariablesPath).
+ Input(extraVariablesPath).
+ rule.Build("product_config.json", "building product_config.json")
+
+ ctx.SetOutputFiles(Paths{outputFilePath}, "")
+}
+
+// product_config module exports product variables and extra variables as a JSON file.
+func productConfigFactory() Module {
+ module := &productConfigModule{}
+ InitAndroidModule(module)
+ return module
+}