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
This commit is contained in:
Joe Onorato 2023-06-21 18:10:28 -07:00
parent a41c679fe1
commit 2f99c47a87
4 changed files with 84 additions and 0 deletions

View file

@ -19,6 +19,7 @@ bootstrap_go_package {
"aconfig_declarations.go", "aconfig_declarations.go",
"aconfig_values.go", "aconfig_values.go",
"aconfig_value_set.go", "aconfig_value_set.go",
"all_aconfig_declarations.go",
"init.go", "init.go",
"java_aconfig_library.go", "java_aconfig_library.go",
"testing.go", "testing.go",

View file

@ -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)
}

View file

@ -54,6 +54,15 @@ var (
}, },
Restat: true, 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() { func init() {
@ -67,4 +76,5 @@ func registerBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("aconfig_values", ValuesFactory) ctx.RegisterModuleType("aconfig_values", ValuesFactory)
ctx.RegisterModuleType("aconfig_value_set", ValueSetFactory) ctx.RegisterModuleType("aconfig_value_set", ValueSetFactory)
ctx.RegisterModuleType("java_aconfig_library", JavaDeclarationsLibraryFactory) ctx.RegisterModuleType("java_aconfig_library", JavaDeclarationsLibraryFactory)
ctx.RegisterParallelSingletonType("all_aconfig_declarations", AllAconfigDeclarationsFactory)
} }

View file

@ -42,6 +42,16 @@ func Concat[T any](s1, s2 []T) []T {
return res 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 // JoinWithPrefix prepends the prefix to each string in the list and
// returns them joined together with " " as separator. // returns them joined together with " " as separator.
func JoinWithPrefix(strs []string, prefix string) string { func JoinWithPrefix(strs []string, prefix string) string {