1// Copyright 2024 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package codegen 16 17import ( 18 "maps" 19 20 "android/soong/android" 21 22 "github.com/google/blueprint" 23) 24 25type dependencyTag struct { 26 blueprint.BaseDependencyTag 27 name string 28} 29 30var ( 31 aconfigDeclarationsGroupTag = dependencyTag{name: "aconfigDeclarationsGroup"} 32 javaAconfigLibraryTag = dependencyTag{name: "javaAconfigLibrary"} 33 ccAconfigLibraryTag = dependencyTag{name: "ccAconfigLibrary"} 34 rustAconfigLibraryTag = dependencyTag{name: "rustAconfigLibrary"} 35) 36 37type AconfigDeclarationsGroup struct { 38 android.ModuleBase 39 android.DefaultableModuleBase 40 41 properties AconfigDeclarationsGroupProperties 42} 43 44type AconfigDeclarationsGroupProperties struct { 45 46 // Name of the aconfig_declarations_group modules 47 Aconfig_declarations_groups []string 48 49 // Name of the java_aconfig_library modules 50 Java_aconfig_libraries []string 51 52 // Name of the cc_aconfig_library modules 53 Cc_aconfig_libraries []string 54 55 // Name of the rust_aconfig_library modules 56 Rust_aconfig_libraries []string 57} 58 59func AconfigDeclarationsGroupFactory() android.Module { 60 module := &AconfigDeclarationsGroup{} 61 module.AddProperties(&module.properties) 62 android.InitAndroidModule(module) 63 android.InitDefaultableModule(module) 64 return module 65} 66 67func (adg *AconfigDeclarationsGroup) DepsMutator(ctx android.BottomUpMutatorContext) { 68 ctx.AddDependency(ctx.Module(), aconfigDeclarationsGroupTag, adg.properties.Aconfig_declarations_groups...) 69 ctx.AddDependency(ctx.Module(), javaAconfigLibraryTag, adg.properties.Java_aconfig_libraries...) 70 ctx.AddDependency(ctx.Module(), ccAconfigLibraryTag, adg.properties.Cc_aconfig_libraries...) 71 ctx.AddDependency(ctx.Module(), rustAconfigLibraryTag, adg.properties.Rust_aconfig_libraries...) 72} 73 74func (adg *AconfigDeclarationsGroup) GenerateAndroidBuildActions(ctx android.ModuleContext) { 75 modeInfos := make(map[string]android.ModeInfo) 76 var aconfigDeclarationNames []string 77 var intermediateCacheOutputPaths android.Paths 78 var javaSrcjars android.Paths 79 ctx.VisitDirectDeps(func(dep android.Module) { 80 tag := ctx.OtherModuleDependencyTag(dep) 81 if provider, ok := android.OtherModuleProvider(ctx, dep, android.CodegenInfoProvider); ok { 82 83 // aconfig declaration names and cache files are collected for all aconfig library dependencies 84 aconfigDeclarationNames = append(aconfigDeclarationNames, provider.AconfigDeclarations...) 85 intermediateCacheOutputPaths = append(intermediateCacheOutputPaths, provider.IntermediateCacheOutputPaths...) 86 87 switch tag { 88 case aconfigDeclarationsGroupTag: 89 // Will retrieve outputs from another language codegen modules when support is added 90 javaSrcjars = append(javaSrcjars, provider.Srcjars...) 91 maps.Copy(modeInfos, provider.ModeInfos) 92 case javaAconfigLibraryTag: 93 javaSrcjars = append(javaSrcjars, provider.Srcjars...) 94 maps.Copy(modeInfos, provider.ModeInfos) 95 case ccAconfigLibraryTag: 96 maps.Copy(modeInfos, provider.ModeInfos) 97 case rustAconfigLibraryTag: 98 maps.Copy(modeInfos, provider.ModeInfos) 99 } 100 } 101 }) 102 103 aconfigDeclarationNames = android.FirstUniqueStrings(aconfigDeclarationNames) 104 intermediateCacheOutputPaths = android.FirstUniquePaths(intermediateCacheOutputPaths) 105 106 android.SetProvider(ctx, android.CodegenInfoProvider, android.CodegenInfo{ 107 AconfigDeclarations: aconfigDeclarationNames, 108 IntermediateCacheOutputPaths: intermediateCacheOutputPaths, 109 Srcjars: javaSrcjars, 110 ModeInfos: modeInfos, 111 }) 112 113 ctx.SetOutputFiles(intermediateCacheOutputPaths, "") 114 ctx.SetOutputFiles(javaSrcjars, ".srcjars") 115} 116