Merge aconfig files per-module am: d788b3e6cb

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/2860765

Change-Id: Ie43ca8826156ff580618cdeda0337db270a82e62
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Colin Cross
2023-12-07 22:37:13 +00:00
committed by Automerger Merge Worker
11 changed files with 56 additions and 47 deletions

View File

@@ -126,7 +126,7 @@ var DeclarationsProviderKey = blueprint.NewProvider(DeclarationsProviderData{})
// This is used to collect the aconfig declarations info on the transitive closure,
// the data is keyed on the container.
type TransitiveDeclarationsInfo struct {
AconfigFiles map[string]*android.DepSet[android.Path]
AconfigFiles map[string]android.Paths
}
var TransitiveDeclarationsInfoProvider = blueprint.NewProvider(TransitiveDeclarationsInfo{})
@@ -177,40 +177,49 @@ func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.Module
})
}
func CollectTransitiveAconfigFiles(ctx android.ModuleContext, transitiveAconfigFiles *map[string]*android.DepSet[android.Path]) {
if *transitiveAconfigFiles == nil {
*transitiveAconfigFiles = make(map[string]*android.DepSet[android.Path])
func CollectDependencyAconfigFiles(ctx android.ModuleContext, mergedAconfigFiles *map[string]android.Paths) {
if *mergedAconfigFiles == nil {
*mergedAconfigFiles = make(map[string]android.Paths)
}
ctx.VisitDirectDeps(func(module android.Module) {
if dep := ctx.OtherModuleProvider(module, DeclarationsProviderKey).(DeclarationsProviderData); dep.IntermediatePath != nil {
aconfigMap := make(map[string]*android.DepSet[android.Path])
aconfigMap[dep.Container] = android.NewDepSet(android.POSTORDER, []android.Path{dep.IntermediatePath}, nil)
mergeTransitiveAconfigFiles(aconfigMap, *transitiveAconfigFiles)
(*mergedAconfigFiles)[dep.Container] = append((*mergedAconfigFiles)[dep.Container], dep.IntermediatePath)
return
}
if dep := ctx.OtherModuleProvider(module, TransitiveDeclarationsInfoProvider).(TransitiveDeclarationsInfo); len(dep.AconfigFiles) > 0 {
mergeTransitiveAconfigFiles(dep.AconfigFiles, *transitiveAconfigFiles)
for container, v := range dep.AconfigFiles {
(*mergedAconfigFiles)[container] = append((*mergedAconfigFiles)[container], v...)
}
}
})
for container, aconfigFiles := range *mergedAconfigFiles {
(*mergedAconfigFiles)[container] = mergeAconfigFiles(ctx, aconfigFiles)
}
ctx.SetProvider(TransitiveDeclarationsInfoProvider, TransitiveDeclarationsInfo{
AconfigFiles: *transitiveAconfigFiles,
AconfigFiles: *mergedAconfigFiles,
})
}
func mergeTransitiveAconfigFiles(from, to map[string]*android.DepSet[android.Path]) {
for fromKey, fromValue := range from {
if fromValue == nil {
continue
}
toValue, ok := to[fromKey]
if !ok {
to[fromKey] = fromValue
} else {
to[fromKey] = android.NewDepSet(android.POSTORDER, toValue.ToList(), []*android.DepSet[android.Path]{fromValue})
}
func mergeAconfigFiles(ctx android.ModuleContext, inputs android.Paths) android.Paths {
if len(inputs) == 1 {
return android.Paths{inputs[0]}
}
output := android.PathForModuleOut(ctx, "aconfig_merged.pb")
ctx.Build(pctx, android.BuildParams{
Rule: mergeAconfigFilesRule,
Description: "merge aconfig files",
Inputs: inputs,
Output: output,
Args: map[string]string{
"flags": android.JoinWithPrefix(inputs.Strings(), "--cache "),
},
})
return android.Paths{output}
}
type bazelAconfigDeclarationsAttributes struct {

View File

@@ -60,9 +60,8 @@ func runJavaAndroidMkTest(t *testing.T, bp string) {
entry := android.AndroidMkEntriesForTest(t, result.TestContext, module)[0]
makeVar := entry.EntryMap["LOCAL_ACONFIG_FILES"]
android.AssertIntEquals(t, "len(LOCAL_ACONFIG_FILES)", 2, len(makeVar))
android.EnsureListContainsSuffix(t, makeVar, "my_aconfig_declarations_foo/intermediate.pb")
android.EnsureListContainsSuffix(t, makeVar, "my_aconfig_declarations_bar/intermediate.pb")
android.AssertIntEquals(t, "len(LOCAL_ACONFIG_FILES)", 1, len(makeVar))
android.EnsureListContainsSuffix(t, makeVar, "android_common/aconfig_merged.pb")
}
func TestAndroidMkJavaLibrary(t *testing.T) {

View File

@@ -48,6 +48,12 @@ var (
"${aconfig}",
},
}, "cache_files")
mergeAconfigFilesRule = pctx.AndroidStaticRule("mergeAconfigFilesRule",
blueprint.RuleParams{
Command: `${aconfig} dump --dedup --format protobuf --out $out $flags`,
CommandDeps: []string{"${aconfig}"},
}, "flags")
)
func init() {

View File

@@ -2394,7 +2394,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext,
func addAconfigFiles(vctx *visitorContext, ctx android.ModuleContext, module blueprint.Module) {
dep := ctx.OtherModuleProvider(module, aconfig.TransitiveDeclarationsInfoProvider).(aconfig.TransitiveDeclarationsInfo)
if len(dep.AconfigFiles) > 0 && dep.AconfigFiles[ctx.ModuleName()] != nil {
vctx.aconfigFiles = append(vctx.aconfigFiles, dep.AconfigFiles[ctx.ModuleName()].ToList()...)
vctx.aconfigFiles = append(vctx.aconfigFiles, dep.AconfigFiles[ctx.ModuleName()]...)
}
}

View File

@@ -11103,7 +11103,7 @@ func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
}
android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
android.EnsureListContainsSuffix(t, aconfigArgs, "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/aconfig_merged.pb")
android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
buildParams := combineAconfigRule.BuildParams
@@ -11111,7 +11111,7 @@ func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
}
android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/aconfig_merged.pb")
android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
}

View File

@@ -6,7 +6,6 @@ bootstrap_go_package {
name: "soong-bp2build",
pkgPath: "android/soong/bp2build",
srcs: [
"aconfig_conversion_test.go",
"androidbp_to_build_templates.go",
"bp2build.go",
"bp2build_product_config.go",
@@ -43,6 +42,7 @@ bootstrap_go_package {
testSrcs: [
"go_conversion_test.go",
"aar_conversion_test.go",
"aconfig_conversion_test.go",
"aidl_library_conversion_test.go",
"android_app_certificate_conversion_test.go",
"android_app_conversion_test.go",

View File

@@ -15,6 +15,7 @@
package bp2build
import (
"android/soong/aconfig/codegen"
"testing"
"android/soong/aconfig"
@@ -25,6 +26,7 @@ import (
func registerAconfigModuleTypes(ctx android.RegistrationContext) {
aconfig.RegisterBuildComponents(ctx)
codegen.RegisterBuildComponents(ctx)
ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
ctx.RegisterModuleType("java_library", java.LibraryFactory)
}

View File

@@ -134,7 +134,7 @@ func (c *Module) AndroidMkEntries() []android.AndroidMkEntries {
"$(SOONG_SDK_VARIANT_MODULES) $(patsubst %.sdk,%,$(LOCAL_MODULE))")
}
// TODO(b/311155208): The container here should be system.
entries.SetOptionalPaths("LOCAL_ACONFIG_FILES", c.getTransitiveAconfigFiles(""))
entries.SetPaths("LOCAL_ACONFIG_FILES", c.mergedAconfigFiles[""])
},
},
ExtraFooters: []android.AndroidMkExtraFootersFunc{

View File

@@ -928,7 +928,7 @@ type Module struct {
hideApexVariantFromMake bool
// Aconfig files for all transitive deps. Also exposed via TransitiveDeclarationsInfo
transitiveAconfigFiles map[string]*android.DepSet[android.Path]
mergedAconfigFiles map[string]android.Paths
}
func (c *Module) AddJSONData(d *map[string]interface{}) {
@@ -2324,7 +2324,7 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
}
ctx.SetProvider(blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
aconfig.CollectTransitiveAconfigFiles(ctx, &c.transitiveAconfigFiles)
aconfig.CollectDependencyAconfigFiles(ctx, &c.mergedAconfigFiles)
c.maybeInstall(ctx, apexInfo)
}
@@ -2345,10 +2345,6 @@ func (c *Module) maybeUnhideFromMake() {
}
}
func (c *Module) getTransitiveAconfigFiles(container string) []android.Path {
return c.transitiveAconfigFiles[container].ToList()
}
// maybeInstall is called at the end of both GenerateAndroidBuildActions and
// ProcessBazelQueryResponse to run the install hooks for installable modules,
// like binaries and tests.

View File

@@ -129,7 +129,8 @@ func (library *Library) AndroidMkEntries() []android.AndroidMkEntries {
entries.SetPath("LOCAL_SOONG_DEXPREOPT_CONFIG", library.dexpreopter.configPath)
}
// TODO(b/311155208): The container here should be system.
entries.SetOptionalPaths("LOCAL_ACONFIG_FILES", library.getTransitiveAconfigFiles(""))
entries.SetPaths("LOCAL_ACONFIG_FILES", library.mergedAconfigFiles[""])
},
},
})
@@ -307,7 +308,7 @@ func (binary *Binary) AndroidMkEntries() []android.AndroidMkEntries {
entries.SetString("LOCAL_SOONG_BUILT_INSTALLED", binary.dexpreopter.builtInstalled)
}
// TODO(b/311155208): The container here should be system.
entries.SetOptionalPaths("LOCAL_ACONFIG_FILES", binary.getTransitiveAconfigFiles(""))
entries.SetPaths("LOCAL_ACONFIG_FILES", binary.mergedAconfigFiles[""])
},
},
ExtraFooters: []android.AndroidMkExtraFootersFunc{
@@ -461,7 +462,7 @@ func (app *AndroidApp) AndroidMkEntries() []android.AndroidMkEntries {
if app.Name() != "framework-res" {
// TODO(b/311155208): The container here should be system.
entries.SetOptionalPaths("LOCAL_ACONFIG_FILES", app.getTransitiveAconfigFiles(""))
entries.SetPaths("LOCAL_ACONFIG_FILES", app.mergedAconfigFiles[""])
}
},
},
@@ -540,7 +541,7 @@ func (a *AndroidLibrary) AndroidMkEntries() []android.AndroidMkEntries {
entries.SetPath("LOCAL_SOONG_EXPORT_PROGUARD_FLAGS", a.combinedExportedProguardFlagsFile)
entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", true)
// TODO(b/311155208): The container here should be system.
entries.SetOptionalPaths("LOCAL_ACONFIG_FILES", a.getTransitiveAconfigFiles(""))
entries.SetPaths("LOCAL_ACONFIG_FILES", a.mergedAconfigFiles[""])
})
return entriesList

View File

@@ -22,9 +22,9 @@ import (
"android/soong/ui/metrics/bp2build_metrics_proto"
"github.com/google/blueprint"
"github.com/google/blueprint/pathtools"
"github.com/google/blueprint/proptools"
"github.com/google/blueprint"
"android/soong/aconfig"
"android/soong/android"
@@ -514,8 +514,8 @@ type Module struct {
// or the module should override Stem().
stem string
// Aconfig files for all transitive deps. Also exposed via TransitiveDeclarationsInfo
transitiveAconfigFiles map[string]*android.DepSet[android.Path]
// Single aconfig "cache file" merged from this module and all dependencies.
mergedAconfigFiles map[string]android.Paths
}
func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error {
@@ -1721,7 +1721,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
ctx.CheckbuildFile(outputFile)
aconfig.CollectTransitiveAconfigFiles(ctx, &j.transitiveAconfigFiles)
aconfig.CollectDependencyAconfigFiles(ctx, &j.mergedAconfigFiles)
ctx.SetProvider(JavaInfoProvider, JavaInfo{
HeaderJars: android.PathsIfNonNil(j.headerJarFile),
@@ -2078,10 +2078,6 @@ func (j *Module) IsInstallable() bool {
return Bool(j.properties.Installable)
}
func (j *Module) getTransitiveAconfigFiles(container string) []android.Path {
return j.transitiveAconfigFiles[container].ToList()
}
type sdkLinkType int
const (