From 2f99c47a87740448a215cb88dfd851f204732899 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Wed, 21 Jun 2023 18:10:28 -0700 Subject: [PATCH] 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 --- aconfig/Android.bp | 1 + aconfig/all_aconfig_declarations.go | 63 +++++++++++++++++++++++++++++ aconfig/init.go | 10 +++++ android/util.go | 10 +++++ 4 files changed, 84 insertions(+) create mode 100644 aconfig/all_aconfig_declarations.go diff --git a/aconfig/Android.bp b/aconfig/Android.bp index d19b543ed..ae8276f39 100644 --- a/aconfig/Android.bp +++ b/aconfig/Android.bp @@ -19,6 +19,7 @@ bootstrap_go_package { "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 000000000..6096c6c0b --- /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 6b433c93d..161fd4248 100644 --- a/aconfig/init.go +++ b/aconfig/init.go @@ -54,6 +54,15 @@ var ( }, 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 @@ func registerBuildComponents(ctx android.RegistrationContext) { 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 c4ce71a5c..96954543e 100644 --- a/android/util.go +++ b/android/util.go @@ -42,6 +42,16 @@ func Concat[T any](s1, s2 []T) []T { 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 {