Loading aconfig/aconfig_declarations.go +50 −30 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import ( "android/soong/android" "android/soong/bazel" "github.com/google/blueprint" ) Loading Loading @@ -118,7 +119,8 @@ func optionalVariable(prefix string, value string) string { type DeclarationsProviderData struct { Package string Container string IntermediatePath android.WritablePath IntermediateCacheOutputPath android.WritablePath IntermediateDumpOutputPath android.WritablePath } var DeclarationsProviderKey = blueprint.NewProvider(DeclarationsProviderData{}) Loading @@ -126,7 +128,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{}) Loading @@ -151,14 +153,14 @@ func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.Module // Intermediate format declarationFiles := android.PathsForModuleSrc(ctx, module.properties.Srcs) intermediatePath := android.PathForModuleOut(ctx, "intermediate.pb") intermediateCacheFilePath := android.PathForModuleOut(ctx, "intermediate.pb") defaultPermission := ctx.Config().ReleaseAconfigFlagDefaultPermission() inputFiles := make([]android.Path, len(declarationFiles)) copy(inputFiles, declarationFiles) inputFiles = append(inputFiles, valuesFiles...) ctx.Build(pctx, android.BuildParams{ Rule: aconfigRule, Output: intermediatePath, Output: intermediateCacheFilePath, Inputs: inputFiles, Description: "aconfig_declarations", Args: map[string]string{ Loading @@ -170,47 +172,65 @@ func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.Module }, }) intermediateDumpFilePath := android.PathForModuleOut(ctx, "intermediate.txt") ctx.Build(pctx, android.BuildParams{ Rule: aconfigTextRule, Output: intermediateDumpFilePath, Inputs: android.Paths{intermediateCacheFilePath}, Description: "aconfig_text", }) ctx.SetProvider(DeclarationsProviderKey, DeclarationsProviderData{ Package: module.properties.Package, Container: module.properties.Container, IntermediatePath: intermediatePath, IntermediateCacheOutputPath: intermediateCacheFilePath, IntermediateDumpOutputPath: intermediateDumpFilePath, }) } 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) if dep := ctx.OtherModuleProvider(module, DeclarationsProviderKey).(DeclarationsProviderData); dep.IntermediateCacheOutputPath != nil { (*mergedAconfigFiles)[dep.Container] = append((*mergedAconfigFiles)[dep.Container], dep.IntermediateCacheOutputPath) 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 { Loading aconfig/aconfig_declarations_test.go +5 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,10 @@ func TestAconfigDeclarations(t *testing.T) { depData := result.ModuleProvider(module, DeclarationsProviderKey).(DeclarationsProviderData) android.AssertStringEquals(t, "package", depData.Package, "com.example.package") android.AssertStringEquals(t, "container", depData.Container, "com.android.foo") if !strings.HasSuffix(depData.IntermediatePath.String(), "/intermediate.pb") { t.Errorf("Missing intermediates path in provider: %s", depData.IntermediatePath.String()) if !strings.HasSuffix(depData.IntermediateCacheOutputPath.String(), "/intermediate.pb") { t.Errorf("Missing intermediates proto path in provider: %s", depData.IntermediateCacheOutputPath.String()) } if !strings.HasSuffix(depData.IntermediateDumpOutputPath.String(), "/intermediate.txt") { t.Errorf("Missing intermediates text path in provider: %s", depData.IntermediateDumpOutputPath.String()) } } aconfig/all_aconfig_declarations.go +1 −1 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ func (this *allAconfigDeclarationsSingleton) GenerateBuildActions(ctx android.Si return } decl := ctx.ModuleProvider(module, DeclarationsProviderKey).(DeclarationsProviderData) cacheFiles = append(cacheFiles, decl.IntermediatePath) cacheFiles = append(cacheFiles, decl.IntermediateCacheOutputPath) }) // Generate build action for aconfig Loading aconfig/codegen/cc_aconfig_library.go +1 −1 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ func (this *CcAconfigLibraryCallbacks) GeneratorBuildActions(ctx cc.ModuleContex ctx.Build(pctx, android.BuildParams{ Rule: cppRule, Input: declarations.IntermediatePath, Input: declarations.IntermediateCacheOutputPath, Outputs: []android.WritablePath{ this.generatedCpp, this.generatedH, Loading aconfig/codegen/java_aconfig_library.go +2 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import ( "android/soong/android" "android/soong/bazel" "android/soong/java" "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) Loading Loading @@ -86,7 +87,7 @@ func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuild ctx.Build(pctx, android.BuildParams{ Rule: javaRule, Input: declarations.IntermediatePath, Input: declarations.IntermediateCacheOutputPath, Output: srcJarPath, Description: "aconfig.srcjar", Args: map[string]string{ Loading Loading
aconfig/aconfig_declarations.go +50 −30 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import ( "android/soong/android" "android/soong/bazel" "github.com/google/blueprint" ) Loading Loading @@ -118,7 +119,8 @@ func optionalVariable(prefix string, value string) string { type DeclarationsProviderData struct { Package string Container string IntermediatePath android.WritablePath IntermediateCacheOutputPath android.WritablePath IntermediateDumpOutputPath android.WritablePath } var DeclarationsProviderKey = blueprint.NewProvider(DeclarationsProviderData{}) Loading @@ -126,7 +128,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{}) Loading @@ -151,14 +153,14 @@ func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.Module // Intermediate format declarationFiles := android.PathsForModuleSrc(ctx, module.properties.Srcs) intermediatePath := android.PathForModuleOut(ctx, "intermediate.pb") intermediateCacheFilePath := android.PathForModuleOut(ctx, "intermediate.pb") defaultPermission := ctx.Config().ReleaseAconfigFlagDefaultPermission() inputFiles := make([]android.Path, len(declarationFiles)) copy(inputFiles, declarationFiles) inputFiles = append(inputFiles, valuesFiles...) ctx.Build(pctx, android.BuildParams{ Rule: aconfigRule, Output: intermediatePath, Output: intermediateCacheFilePath, Inputs: inputFiles, Description: "aconfig_declarations", Args: map[string]string{ Loading @@ -170,47 +172,65 @@ func (module *DeclarationsModule) GenerateAndroidBuildActions(ctx android.Module }, }) intermediateDumpFilePath := android.PathForModuleOut(ctx, "intermediate.txt") ctx.Build(pctx, android.BuildParams{ Rule: aconfigTextRule, Output: intermediateDumpFilePath, Inputs: android.Paths{intermediateCacheFilePath}, Description: "aconfig_text", }) ctx.SetProvider(DeclarationsProviderKey, DeclarationsProviderData{ Package: module.properties.Package, Container: module.properties.Container, IntermediatePath: intermediatePath, IntermediateCacheOutputPath: intermediateCacheFilePath, IntermediateDumpOutputPath: intermediateDumpFilePath, }) } 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) if dep := ctx.OtherModuleProvider(module, DeclarationsProviderKey).(DeclarationsProviderData); dep.IntermediateCacheOutputPath != nil { (*mergedAconfigFiles)[dep.Container] = append((*mergedAconfigFiles)[dep.Container], dep.IntermediateCacheOutputPath) 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 { Loading
aconfig/aconfig_declarations_test.go +5 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,10 @@ func TestAconfigDeclarations(t *testing.T) { depData := result.ModuleProvider(module, DeclarationsProviderKey).(DeclarationsProviderData) android.AssertStringEquals(t, "package", depData.Package, "com.example.package") android.AssertStringEquals(t, "container", depData.Container, "com.android.foo") if !strings.HasSuffix(depData.IntermediatePath.String(), "/intermediate.pb") { t.Errorf("Missing intermediates path in provider: %s", depData.IntermediatePath.String()) if !strings.HasSuffix(depData.IntermediateCacheOutputPath.String(), "/intermediate.pb") { t.Errorf("Missing intermediates proto path in provider: %s", depData.IntermediateCacheOutputPath.String()) } if !strings.HasSuffix(depData.IntermediateDumpOutputPath.String(), "/intermediate.txt") { t.Errorf("Missing intermediates text path in provider: %s", depData.IntermediateDumpOutputPath.String()) } }
aconfig/all_aconfig_declarations.go +1 −1 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ func (this *allAconfigDeclarationsSingleton) GenerateBuildActions(ctx android.Si return } decl := ctx.ModuleProvider(module, DeclarationsProviderKey).(DeclarationsProviderData) cacheFiles = append(cacheFiles, decl.IntermediatePath) cacheFiles = append(cacheFiles, decl.IntermediateCacheOutputPath) }) // Generate build action for aconfig Loading
aconfig/codegen/cc_aconfig_library.go +1 −1 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ func (this *CcAconfigLibraryCallbacks) GeneratorBuildActions(ctx cc.ModuleContex ctx.Build(pctx, android.BuildParams{ Rule: cppRule, Input: declarations.IntermediatePath, Input: declarations.IntermediateCacheOutputPath, Outputs: []android.WritablePath{ this.generatedCpp, this.generatedH, Loading
aconfig/codegen/java_aconfig_library.go +2 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import ( "android/soong/android" "android/soong/bazel" "android/soong/java" "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) Loading Loading @@ -86,7 +87,7 @@ func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuild ctx.Build(pctx, android.BuildParams{ Rule: javaRule, Input: declarations.IntermediatePath, Input: declarations.IntermediateCacheOutputPath, Output: srcJarPath, Description: "aconfig.srcjar", Args: map[string]string{ Loading