diff options
Diffstat (limited to 'aconfig/aconfig_declarations.go')
-rw-r--r-- | aconfig/aconfig_declarations.go | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/aconfig/aconfig_declarations.go b/aconfig/aconfig_declarations.go index 897f8925a..e662f1da4 100644 --- a/aconfig/aconfig_declarations.go +++ b/aconfig/aconfig_declarations.go @@ -38,6 +38,9 @@ type DeclarationsModule struct { // Values from TARGET_RELEASE / RELEASE_ACONFIG_VALUE_SETS Values []string `blueprint:"mutated"` + + // Container(system/vendor/apex) that this module belongs to + Container string } intermediatePath android.WritablePath @@ -69,6 +72,8 @@ func (module *DeclarationsModule) DepsMutator(ctx android.BottomUpMutatorContext if len(module.properties.Package) == 0 { ctx.PropertyErrorf("package", "missing package property") } + // TODO(b/311155208): Add mandatory check for container after all pre-existing + // ones are changed. // Add a dependency on the aconfig_value_sets defined in // RELEASE_ACONFIG_VALUE_SETS, and add any aconfig_values that @@ -110,12 +115,21 @@ func optionalVariable(prefix string, value string) string { } // Provider published by aconfig_value_set -type declarationsProviderData struct { +type DeclarationsProviderData struct { Package string + Container string IntermediatePath android.WritablePath } -var declarationsProviderKey = blueprint.NewProvider(declarationsProviderData{}) +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] +} + +var TransitiveDeclarationsInfoProvider = blueprint.NewProvider(TransitiveDeclarationsInfo{}) func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag @@ -156,13 +170,49 @@ func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.Module }, }) - ctx.SetProvider(declarationsProviderKey, declarationsProviderData{ + ctx.SetProvider(DeclarationsProviderKey, DeclarationsProviderData{ Package: module.properties.Package, + Container: module.properties.Container, IntermediatePath: intermediatePath, }) } +func CollectTransitiveAconfigFiles(ctx android.ModuleContext, transitiveAconfigFiles *map[string]*android.DepSet[android.Path]) { + if *transitiveAconfigFiles == nil { + *transitiveAconfigFiles = make(map[string]*android.DepSet[android.Path]) + } + 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) + return + } + if dep := ctx.OtherModuleProvider(module, TransitiveDeclarationsInfoProvider).(TransitiveDeclarationsInfo); len(dep.AconfigFiles) > 0 { + mergeTransitiveAconfigFiles(dep.AconfigFiles, *transitiveAconfigFiles) + } + }) + + ctx.SetProvider(TransitiveDeclarationsInfoProvider, TransitiveDeclarationsInfo{ + AconfigFiles: *transitiveAconfigFiles, + }) +} + +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}) + } + } +} + type bazelAconfigDeclarationsAttributes struct { Srcs bazel.LabelListAttribute Package string |