Add aconfig dump of all aconfig_declarations modules.
Bug: 283910439
Test: m dist ; m all_aconfig_declarations ; gqui from all_aconfig_declarations.pb proto /source/aosp-master-with-phones/build/make/tools/aconfig/protos/aconfig.proto:android.aconfig.parsed_flags
Change-Id: Ia89c7f9c53fa1600fa2f9c8ea01319e949e09f58
diff --git a/aconfig/Android.bp b/aconfig/Android.bp
index d19b543..ae8276f 100644
--- a/aconfig/Android.bp
+++ b/aconfig/Android.bp
@@ -19,6 +19,7 @@
"aconfig_declarations.go",
"aconfig_values.go",
"aconfig_value_set.go",
+ "all_aconfig_declarations.go",
"init.go",
"java_aconfig_library.go",
"testing.go",
diff --git a/aconfig/all_aconfig_declarations.go b/aconfig/all_aconfig_declarations.go
new file mode 100644
index 0000000..6096c6c
--- /dev/null
+++ b/aconfig/all_aconfig_declarations.go
@@ -0,0 +1,63 @@
+// Copyright 2023 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 aconfig
+
+import (
+ "android/soong/android"
+)
+
+// A singleton module that collects all of the aconfig flags declared in the
+// tree into a single combined file for export to the external flag setting
+// server (inside Google it's Gantry).
+//
+// Note that this is ALL aconfig_declarations modules present in the tree, not just
+// ones that are relevant to the product currently being built, so that that infra
+// doesn't need to pull from multiple builds and merge them.
+func AllAconfigDeclarationsFactory() android.Singleton {
+ return &allAconfigDeclarationsSingleton{}
+}
+
+type allAconfigDeclarationsSingleton struct {
+ intermediatePath android.OutputPath
+}
+
+func (this *allAconfigDeclarationsSingleton) GenerateBuildActions(ctx android.SingletonContext) {
+ // Find all of the aconfig_declarations modules
+ var cacheFiles android.Paths
+ ctx.VisitAllModules(func(module android.Module) {
+ if !ctx.ModuleHasProvider(module, declarationsProviderKey) {
+ return
+ }
+ decl := ctx.ModuleProvider(module, declarationsProviderKey).(declarationsProviderData)
+ cacheFiles = append(cacheFiles, decl.IntermediatePath)
+ })
+
+ // Generate build action for aconfig
+ this.intermediatePath = android.PathForIntermediates(ctx, "all_aconfig_declarations.pb")
+ ctx.Build(pctx, android.BuildParams{
+ Rule: allDeclarationsRule,
+ Inputs: cacheFiles,
+ Output: this.intermediatePath,
+ Description: "all_aconfig_declarations",
+ Args: map[string]string{
+ "cache_files": android.JoinPathsWithPrefix(cacheFiles, "--cache "),
+ },
+ })
+ ctx.Phony("all_aconfig_declarations", this.intermediatePath)
+}
+
+func (this *allAconfigDeclarationsSingleton) MakeVars(ctx android.MakeVarsContext) {
+ ctx.DistForGoal("droid", this.intermediatePath)
+}
diff --git a/aconfig/init.go b/aconfig/init.go
index 6b433c9..161fd42 100644
--- a/aconfig/init.go
+++ b/aconfig/init.go
@@ -54,6 +54,15 @@
},
Restat: true,
})
+
+ // For all_aconfig_declarations
+ allDeclarationsRule = pctx.AndroidStaticRule("all_aconfig_declarations_dump",
+ blueprint.RuleParams{
+ Command: `${aconfig} dump --format protobuf --out ${out} ${cache_files}`,
+ CommandDeps: []string{
+ "${aconfig}",
+ },
+ }, "cache_files")
)
func init() {
@@ -67,4 +76,5 @@
ctx.RegisterModuleType("aconfig_values", ValuesFactory)
ctx.RegisterModuleType("aconfig_value_set", ValueSetFactory)
ctx.RegisterModuleType("java_aconfig_library", JavaDeclarationsLibraryFactory)
+ ctx.RegisterParallelSingletonType("all_aconfig_declarations", AllAconfigDeclarationsFactory)
}
diff --git a/android/util.go b/android/util.go
index c4ce71a..9695454 100644
--- a/android/util.go
+++ b/android/util.go
@@ -42,6 +42,16 @@
return res
}
+// JoinPathsWithPrefix converts the paths to strings, prefixes them
+// with prefix and then joins them separated by " ".
+func JoinPathsWithPrefix(paths []Path, prefix string) string {
+ strs := make([]string, len(paths))
+ for i := range paths {
+ strs[i] = paths[i].String()
+ }
+ return JoinWithPrefixAndSeparator(strs, prefix, " ")
+}
+
// JoinWithPrefix prepends the prefix to each string in the list and
// returns them joined together with " " as separator.
func JoinWithPrefix(strs []string, prefix string) string {