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