move CollectDependencyAconfigFiles to android

This needs to be called by some modules in android.

Bug: 308625757
Test: manual
Change-Id: I389fcfd88a3f4bd85a9218fdd4dd66d8a239bb67
This commit is contained in:
LaMont Jones 2023-12-19 19:01:57 +00:00
parent 349ef87505
commit aa005ae080
15 changed files with 106 additions and 89 deletions

View file

@ -112,24 +112,6 @@ func optionalVariable(prefix string, value string) string {
return sb.String()
}
// Provider published by aconfig_value_set
type DeclarationsProviderData struct {
Package string
Container string
IntermediateCacheOutputPath android.WritablePath
IntermediateDumpOutputPath android.WritablePath
}
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.Paths
}
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
valuesFiles := make([]android.Path, 0)
@ -174,7 +156,7 @@ func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.Module
Description: "aconfig_text",
})
android.SetProvider(ctx, DeclarationsProviderKey, DeclarationsProviderData{
android.SetProvider(ctx, android.AconfigDeclarationsProviderKey, android.AconfigDeclarationsProviderData{
Package: module.properties.Package,
Container: module.properties.Container,
IntermediateCacheOutputPath: intermediateCacheFilePath,
@ -182,51 +164,6 @@ func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.Module
})
}
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, _ := android.OtherModuleProvider(ctx, module, DeclarationsProviderKey); dep.IntermediateCacheOutputPath != nil {
(*mergedAconfigFiles)[dep.Container] = append((*mergedAconfigFiles)[dep.Container], dep.IntermediateCacheOutputPath)
return
}
if dep, _ := android.OtherModuleProvider(ctx, module, TransitiveDeclarationsInfoProvider); len(dep.AconfigFiles) > 0 {
for container, v := range dep.AconfigFiles {
(*mergedAconfigFiles)[container] = append((*mergedAconfigFiles)[container], v...)
}
}
})
for container, aconfigFiles := range *mergedAconfigFiles {
(*mergedAconfigFiles)[container] = mergeAconfigFiles(ctx, aconfigFiles)
}
android.SetProvider(ctx, TransitiveDeclarationsInfoProvider, TransitiveDeclarationsInfo{
AconfigFiles: *mergedAconfigFiles,
})
}
func mergeAconfigFiles(ctx android.ModuleContext, inputs android.Paths) android.Paths {
inputs = android.LastUniquePaths(inputs)
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}
}
func SetAconfigFileMkEntries(m *android.ModuleBase, entries *android.AndroidMkEntries, aconfigFiles map[string]android.Paths) {
// TODO(b/311155208): The default container here should be system.

View file

@ -38,7 +38,7 @@ func TestAconfigDeclarations(t *testing.T) {
module := result.ModuleForTests("module_name", "").Module().(*DeclarationsModule)
// Check that the provider has the right contents
depData, _ := android.SingletonModuleProvider(result, module, DeclarationsProviderKey)
depData, _ := android.SingletonModuleProvider(result, module, android.AconfigDeclarationsProviderKey)
android.AssertStringEquals(t, "package", depData.Package, "com.example.package")
android.AssertStringEquals(t, "container", depData.Container, "com.android.foo")
if !strings.HasSuffix(depData.IntermediateCacheOutputPath.String(), "/intermediate.pb") {

View file

@ -37,7 +37,7 @@ func (this *allAconfigDeclarationsSingleton) GenerateBuildActions(ctx android.Si
// Find all of the aconfig_declarations modules
var cacheFiles android.Paths
ctx.VisitAllModules(func(module android.Module) {
decl, ok := android.SingletonModuleProvider(ctx, module, DeclarationsProviderKey)
decl, ok := android.SingletonModuleProvider(ctx, module, android.AconfigDeclarationsProviderKey)
if !ok {
return
}

View file

@ -15,7 +15,6 @@
package codegen
import (
"android/soong/aconfig"
"android/soong/android"
"android/soong/cc"
@ -92,7 +91,7 @@ func (this *CcAconfigLibraryCallbacks) GeneratorSources(ctx cc.ModuleContext) cc
if len(declarationsModules) != 1 {
panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
}
declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], aconfig.DeclarationsProviderKey)
declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], android.AconfigDeclarationsProviderKey)
// Figure out the generated file paths. This has to match aconfig's codegen_cpp.rs.
this.generatedDir = android.PathForModuleGen(ctx)
@ -122,7 +121,7 @@ func (this *CcAconfigLibraryCallbacks) GeneratorBuildActions(ctx cc.ModuleContex
if len(declarationsModules) != 1 {
panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
}
declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], aconfig.DeclarationsProviderKey)
declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], android.AconfigDeclarationsProviderKey)
mode := proptools.StringDefault(this.properties.Mode, "production")
if !isModeSupported(mode) {

View file

@ -17,7 +17,6 @@ package codegen
import (
"fmt"
"android/soong/aconfig"
"android/soong/android"
"android/soong/java"
@ -74,7 +73,7 @@ func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuild
if len(declarationsModules) != 1 {
panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
}
declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], aconfig.DeclarationsProviderKey)
declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], android.AconfigDeclarationsProviderKey)
// Generate the action to build the srcjar
srcJarPath := android.PathForModuleGen(ctx, ctx.ModuleName()+".srcjar")

View file

@ -3,7 +3,6 @@ package codegen
import (
"fmt"
"android/soong/aconfig"
"android/soong/android"
"android/soong/rust"
@ -65,7 +64,7 @@ func (a *aconfigDecorator) GenerateSource(ctx rust.ModuleContext, deps rust.Path
if len(declarationsModules) != 1 {
panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
}
declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], aconfig.DeclarationsProviderKey)
declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], android.AconfigDeclarationsProviderKey)
mode := proptools.StringDefault(a.Properties.Mode, "production")
if !isModeSupported(mode) {

View file

@ -30,7 +30,7 @@ func (this *exportedJavaDeclarationsLibrarySingleton) GenerateBuildActions(ctx a
// Find all of the aconfig_declarations modules
var cacheFiles android.Paths
ctx.VisitAllModules(func(module android.Module) {
decl, ok := android.SingletonModuleProvider(ctx, module, DeclarationsProviderKey)
decl, ok := android.SingletonModuleProvider(ctx, module, android.AconfigDeclarationsProviderKey)
if !ok {
return
}

View file

@ -62,11 +62,6 @@ var (
},
}, "cache_files")
mergeAconfigFilesRule = pctx.AndroidStaticRule("mergeAconfigFilesRule",
blueprint.RuleParams{
Command: `${aconfig} dump --dedup --format protobuf --out $out $flags`,
CommandDeps: []string{"${aconfig}"},
}, "flags")
// For exported_java_aconfig_library: Generate a JAR from all
// java_aconfig_libraries to be consumed by apps built outside the
// platform

View file

@ -27,6 +27,7 @@ bootstrap_go_package {
"androidmk-parser",
],
srcs: [
"aconfig_providers.go",
"androidmk.go",
"apex.go",
"apex_contributions.go",

View file

@ -0,0 +1,92 @@
// 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 android
import (
"github.com/google/blueprint"
)
var (
mergeAconfigFilesRule = pctx.AndroidStaticRule("mergeAconfigFilesRule",
blueprint.RuleParams{
Command: `${aconfig} dump --dedup --format protobuf --out $out $flags`,
CommandDeps: []string{"${aconfig}"},
}, "flags")
_ = pctx.HostBinToolVariable("aconfig", "aconfig")
)
// Provider published by aconfig_value_set
type AconfigDeclarationsProviderData struct {
Package string
Container string
IntermediateCacheOutputPath WritablePath
IntermediateDumpOutputPath WritablePath
}
var AconfigDeclarationsProviderKey = blueprint.NewProvider[AconfigDeclarationsProviderData]()
// This is used to collect the aconfig declarations info on the transitive closure,
// the data is keyed on the container.
type AconfigTransitiveDeclarationsInfo struct {
AconfigFiles map[string]Paths
}
var AconfigTransitiveDeclarationsInfoProvider = blueprint.NewProvider[AconfigTransitiveDeclarationsInfo]()
func CollectDependencyAconfigFiles(ctx ModuleContext, mergedAconfigFiles *map[string]Paths) {
if *mergedAconfigFiles == nil {
*mergedAconfigFiles = make(map[string]Paths)
}
ctx.VisitDirectDeps(func(module Module) {
if dep, _ := OtherModuleProvider(ctx, module, AconfigDeclarationsProviderKey); dep.IntermediateCacheOutputPath != nil {
(*mergedAconfigFiles)[dep.Container] = append((*mergedAconfigFiles)[dep.Container], dep.IntermediateCacheOutputPath)
return
}
if dep, _ := OtherModuleProvider(ctx, module, AconfigTransitiveDeclarationsInfoProvider); len(dep.AconfigFiles) > 0 {
for container, v := range dep.AconfigFiles {
(*mergedAconfigFiles)[container] = append((*mergedAconfigFiles)[container], v...)
}
}
})
for container, aconfigFiles := range *mergedAconfigFiles {
(*mergedAconfigFiles)[container] = mergeAconfigFiles(ctx, aconfigFiles)
}
SetProvider(ctx, AconfigTransitiveDeclarationsInfoProvider, AconfigTransitiveDeclarationsInfo{
AconfigFiles: *mergedAconfigFiles,
})
}
func mergeAconfigFiles(ctx ModuleContext, inputs Paths) Paths {
inputs = LastUniquePaths(inputs)
if len(inputs) == 1 {
return Paths{inputs[0]}
}
output := PathForModuleOut(ctx, "aconfig_merged.pb")
ctx.Build(pctx, BuildParams{
Rule: mergeAconfigFilesRule,
Description: "merge aconfig files",
Inputs: inputs,
Output: output,
Args: map[string]string{
"flags": JoinWithPrefix(inputs.Strings(), "--cache "),
},
})
return Paths{output}
}

View file

@ -24,7 +24,6 @@ import (
"sort"
"strings"
"android/soong/aconfig"
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
@ -2272,7 +2271,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext,
}
func addAconfigFiles(vctx *visitorContext, ctx android.ModuleContext, module blueprint.Module) {
dep, _ := android.OtherModuleProvider(ctx, module, aconfig.TransitiveDeclarationsInfoProvider)
dep, _ := android.OtherModuleProvider(ctx, module, android.AconfigTransitiveDeclarationsInfoProvider)
if len(dep.AconfigFiles) > 0 && dep.AconfigFiles[ctx.ModuleName()] != nil {
vctx.aconfigFiles = append(vctx.aconfigFiles, dep.AconfigFiles[ctx.ModuleName()]...)
}

View file

@ -28,7 +28,6 @@ import (
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
"android/soong/aconfig"
"android/soong/aidl_library"
"android/soong/android"
"android/soong/cc/config"
@ -2137,7 +2136,7 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
}
android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
aconfig.CollectDependencyAconfigFiles(ctx, &c.mergedAconfigFiles)
android.CollectDependencyAconfigFiles(ctx, &c.mergedAconfigFiles)
c.maybeInstall(ctx, apexInfo)
}

View file

@ -22,7 +22,6 @@ import (
"path/filepath"
"strings"
"android/soong/aconfig"
"android/soong/testing"
"github.com/google/blueprint"
@ -509,7 +508,7 @@ func (a *AndroidApp) aaptBuildActions(ctx android.ModuleContext) {
var aconfigTextFilePaths android.Paths
ctx.VisitDirectDepsWithTag(aconfigDeclarationTag, func(dep android.Module) {
if provider, ok := android.OtherModuleProvider(ctx, dep, aconfig.DeclarationsProviderKey); ok {
if provider, ok := android.OtherModuleProvider(ctx, dep, android.AconfigDeclarationsProviderKey); ok {
aconfigTextFilePaths = append(aconfigTextFilePaths, provider.IntermediateDumpOutputPath)
} else {
ctx.ModuleErrorf("Only aconfig_declarations module type is allowed for "+

View file

@ -24,7 +24,6 @@ import (
"github.com/google/blueprint/pathtools"
"github.com/google/blueprint/proptools"
"android/soong/aconfig"
"android/soong/android"
"android/soong/dexpreopt"
"android/soong/java/config"
@ -1694,7 +1693,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
ctx.CheckbuildFile(outputFile)
aconfig.CollectDependencyAconfigFiles(ctx, &j.mergedAconfigFiles)
android.CollectDependencyAconfigFiles(ctx, &j.mergedAconfigFiles)
android.SetProvider(ctx, JavaInfoProvider, JavaInfo{
HeaderJars: android.PathsIfNonNil(j.headerJarFile),

View file

@ -23,7 +23,6 @@ import (
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
"android/soong/aconfig"
"android/soong/android"
"android/soong/cc"
cc_config "android/soong/cc/config"
@ -1007,7 +1006,7 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
android.SetProvider(ctx, testing.TestModuleProviderKey, testing.TestModuleProviderData{})
}
aconfig.CollectDependencyAconfigFiles(ctx, &mod.mergedAconfigFiles)
android.CollectDependencyAconfigFiles(ctx, &mod.mergedAconfigFiles)
}
func (mod *Module) deps(ctx DepsContext) Deps {