1*d57664e9SAndroid Build Coastguard Worker// Copyright (C) 2021 The Android Open Source Project 2*d57664e9SAndroid Build Coastguard Worker// 3*d57664e9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*d57664e9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*d57664e9SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*d57664e9SAndroid Build Coastguard Worker// 7*d57664e9SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*d57664e9SAndroid Build Coastguard Worker// 9*d57664e9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*d57664e9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*d57664e9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*d57664e9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*d57664e9SAndroid Build Coastguard Worker// limitations under the License. 14*d57664e9SAndroid Build Coastguard Worker 15*d57664e9SAndroid Build Coastguard Workerpackage api 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Workerimport ( 18*d57664e9SAndroid Build Coastguard Worker "slices" 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard Worker "android/soong/android" 23*d57664e9SAndroid Build Coastguard Worker "android/soong/java" 24*d57664e9SAndroid Build Coastguard Worker) 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Workerconst art = "art.module.public.api" 27*d57664e9SAndroid Build Coastguard Workerconst conscrypt = "conscrypt.module.public.api" 28*d57664e9SAndroid Build Coastguard Workerconst i18n = "i18n.module.public.api" 29*d57664e9SAndroid Build Coastguard Workerconst virtualization = "framework-virtualization" 30*d57664e9SAndroid Build Coastguard Workerconst location = "framework-location" 31*d57664e9SAndroid Build Coastguard Workerconst platformCrashrecovery = "framework-platformcrashrecovery" 32*d57664e9SAndroid Build Coastguard Workerconst ondeviceintelligence = "framework-ondeviceintelligence-platform" 33*d57664e9SAndroid Build Coastguard Worker 34*d57664e9SAndroid Build Coastguard Workervar core_libraries_modules = []string{art, conscrypt, i18n} 35*d57664e9SAndroid Build Coastguard Worker 36*d57664e9SAndroid Build Coastguard Worker// List of modules that are not yet updatable, and hence they can still compile 37*d57664e9SAndroid Build Coastguard Worker// against hidden APIs. These modules are filtered out when building the 38*d57664e9SAndroid Build Coastguard Worker// updatable-framework-module-impl (because updatable-framework-module-impl is 39*d57664e9SAndroid Build Coastguard Worker// built against module_current SDK). Instead they are directly statically 40*d57664e9SAndroid Build Coastguard Worker// linked into the all-framework-module-lib, which is building against hidden 41*d57664e9SAndroid Build Coastguard Worker// APIs. 42*d57664e9SAndroid Build Coastguard Worker// In addition, the modules in this list are allowed to contribute to test APIs 43*d57664e9SAndroid Build Coastguard Worker// stubs. 44*d57664e9SAndroid Build Coastguard Workervar non_updatable_modules = []string{virtualization, location, platformCrashrecovery, ondeviceintelligence} 45*d57664e9SAndroid Build Coastguard Worker 46*d57664e9SAndroid Build Coastguard Worker// The intention behind this soong plugin is to generate a number of "merged" 47*d57664e9SAndroid Build Coastguard Worker// API-related modules that would otherwise require a large amount of very 48*d57664e9SAndroid Build Coastguard Worker// similar Android.bp boilerplate to define. For example, the merged current.txt 49*d57664e9SAndroid Build Coastguard Worker// API definitions (created by merging the non-updatable current.txt with all 50*d57664e9SAndroid Build Coastguard Worker// the module current.txts). This simplifies the addition of new android 51*d57664e9SAndroid Build Coastguard Worker// modules, by reducing the number of genrules etc a new module must be added to. 52*d57664e9SAndroid Build Coastguard Worker 53*d57664e9SAndroid Build Coastguard Worker// The properties of the combined_apis module type. 54*d57664e9SAndroid Build Coastguard Workertype CombinedApisProperties struct { 55*d57664e9SAndroid Build Coastguard Worker // Module libraries in the bootclasspath 56*d57664e9SAndroid Build Coastguard Worker Bootclasspath proptools.Configurable[[]string] 57*d57664e9SAndroid Build Coastguard Worker // Module libraries on the bootclasspath if include_nonpublic_framework_api is true. 58*d57664e9SAndroid Build Coastguard Worker Conditional_bootclasspath []string 59*d57664e9SAndroid Build Coastguard Worker // Module libraries in system server 60*d57664e9SAndroid Build Coastguard Worker System_server_classpath proptools.Configurable[[]string] 61*d57664e9SAndroid Build Coastguard Worker} 62*d57664e9SAndroid Build Coastguard Worker 63*d57664e9SAndroid Build Coastguard Workertype CombinedApis struct { 64*d57664e9SAndroid Build Coastguard Worker android.ModuleBase 65*d57664e9SAndroid Build Coastguard Worker 66*d57664e9SAndroid Build Coastguard Worker properties CombinedApisProperties 67*d57664e9SAndroid Build Coastguard Worker} 68*d57664e9SAndroid Build Coastguard Worker 69*d57664e9SAndroid Build Coastguard Workerfunc init() { 70*d57664e9SAndroid Build Coastguard Worker registerBuildComponents(android.InitRegistrationContext) 71*d57664e9SAndroid Build Coastguard Worker} 72*d57664e9SAndroid Build Coastguard Worker 73*d57664e9SAndroid Build Coastguard Workerfunc registerBuildComponents(ctx android.RegistrationContext) { 74*d57664e9SAndroid Build Coastguard Worker ctx.RegisterModuleType("combined_apis", combinedApisModuleFactory) 75*d57664e9SAndroid Build Coastguard Worker} 76*d57664e9SAndroid Build Coastguard Worker 77*d57664e9SAndroid Build Coastguard Workervar PrepareForCombinedApisTest = android.FixtureRegisterWithContext(registerBuildComponents) 78*d57664e9SAndroid Build Coastguard Worker 79*d57664e9SAndroid Build Coastguard Workerfunc (a *CombinedApis) apiFingerprintStubDeps(ctx android.BottomUpMutatorContext) []string { 80*d57664e9SAndroid Build Coastguard Worker bootClasspath := a.properties.Bootclasspath.GetOrDefault(ctx, nil) 81*d57664e9SAndroid Build Coastguard Worker systemServerClasspath := a.properties.System_server_classpath.GetOrDefault(ctx, nil) 82*d57664e9SAndroid Build Coastguard Worker var ret []string 83*d57664e9SAndroid Build Coastguard Worker ret = append( 84*d57664e9SAndroid Build Coastguard Worker ret, 85*d57664e9SAndroid Build Coastguard Worker transformArray(bootClasspath, "", ".stubs")..., 86*d57664e9SAndroid Build Coastguard Worker ) 87*d57664e9SAndroid Build Coastguard Worker ret = append( 88*d57664e9SAndroid Build Coastguard Worker ret, 89*d57664e9SAndroid Build Coastguard Worker transformArray(bootClasspath, "", ".stubs.system")..., 90*d57664e9SAndroid Build Coastguard Worker ) 91*d57664e9SAndroid Build Coastguard Worker ret = append( 92*d57664e9SAndroid Build Coastguard Worker ret, 93*d57664e9SAndroid Build Coastguard Worker transformArray(bootClasspath, "", ".stubs.module_lib")..., 94*d57664e9SAndroid Build Coastguard Worker ) 95*d57664e9SAndroid Build Coastguard Worker ret = append( 96*d57664e9SAndroid Build Coastguard Worker ret, 97*d57664e9SAndroid Build Coastguard Worker transformArray(systemServerClasspath, "", ".stubs.system_server")..., 98*d57664e9SAndroid Build Coastguard Worker ) 99*d57664e9SAndroid Build Coastguard Worker return ret 100*d57664e9SAndroid Build Coastguard Worker} 101*d57664e9SAndroid Build Coastguard Worker 102*d57664e9SAndroid Build Coastguard Workerfunc (a *CombinedApis) DepsMutator(ctx android.BottomUpMutatorContext) { 103*d57664e9SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), nil, a.apiFingerprintStubDeps(ctx)...) 104*d57664e9SAndroid Build Coastguard Worker} 105*d57664e9SAndroid Build Coastguard Worker 106*d57664e9SAndroid Build Coastguard Workerfunc (a *CombinedApis) GenerateAndroidBuildActions(ctx android.ModuleContext) { 107*d57664e9SAndroid Build Coastguard Worker ctx.WalkDeps(func(child, parent android.Module) bool { 108*d57664e9SAndroid Build Coastguard Worker if _, ok := child.(java.AndroidLibraryDependency); ok && child.Name() != "framework-res" { 109*d57664e9SAndroid Build Coastguard Worker // Stubs of BCP and SSCP libraries should not have any dependencies on apps 110*d57664e9SAndroid Build Coastguard Worker // This check ensures that we do not run into circular dependencies when UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT=true 111*d57664e9SAndroid Build Coastguard Worker ctx.ModuleErrorf( 112*d57664e9SAndroid Build Coastguard Worker "Module %s is not a valid dependency of the stub library %s\n."+ 113*d57664e9SAndroid Build Coastguard Worker "If this dependency has been added via `libs` of java_sdk_library, please move it to `impl_only_libs`\n", 114*d57664e9SAndroid Build Coastguard Worker child.Name(), parent.Name()) 115*d57664e9SAndroid Build Coastguard Worker return false // error detected 116*d57664e9SAndroid Build Coastguard Worker } 117*d57664e9SAndroid Build Coastguard Worker return true 118*d57664e9SAndroid Build Coastguard Worker }) 119*d57664e9SAndroid Build Coastguard Worker 120*d57664e9SAndroid Build Coastguard Worker} 121*d57664e9SAndroid Build Coastguard Worker 122*d57664e9SAndroid Build Coastguard Workertype genruleProps struct { 123*d57664e9SAndroid Build Coastguard Worker Name *string 124*d57664e9SAndroid Build Coastguard Worker Cmd *string 125*d57664e9SAndroid Build Coastguard Worker Dists []android.Dist 126*d57664e9SAndroid Build Coastguard Worker Out []string 127*d57664e9SAndroid Build Coastguard Worker Srcs proptools.Configurable[[]string] 128*d57664e9SAndroid Build Coastguard Worker Tools []string 129*d57664e9SAndroid Build Coastguard Worker Visibility []string 130*d57664e9SAndroid Build Coastguard Worker} 131*d57664e9SAndroid Build Coastguard Worker 132*d57664e9SAndroid Build Coastguard Workertype libraryProps struct { 133*d57664e9SAndroid Build Coastguard Worker Name *string 134*d57664e9SAndroid Build Coastguard Worker Sdk_version *string 135*d57664e9SAndroid Build Coastguard Worker Static_libs proptools.Configurable[[]string] 136*d57664e9SAndroid Build Coastguard Worker Visibility []string 137*d57664e9SAndroid Build Coastguard Worker Defaults []string 138*d57664e9SAndroid Build Coastguard Worker Is_stubs_module *bool 139*d57664e9SAndroid Build Coastguard Worker} 140*d57664e9SAndroid Build Coastguard Worker 141*d57664e9SAndroid Build Coastguard Workertype fgProps struct { 142*d57664e9SAndroid Build Coastguard Worker Name *string 143*d57664e9SAndroid Build Coastguard Worker Srcs proptools.Configurable[[]string] 144*d57664e9SAndroid Build Coastguard Worker Device_common_srcs proptools.Configurable[[]string] 145*d57664e9SAndroid Build Coastguard Worker Visibility []string 146*d57664e9SAndroid Build Coastguard Worker} 147*d57664e9SAndroid Build Coastguard Worker 148*d57664e9SAndroid Build Coastguard Workertype defaultsProps struct { 149*d57664e9SAndroid Build Coastguard Worker Name *string 150*d57664e9SAndroid Build Coastguard Worker Api_surface *string 151*d57664e9SAndroid Build Coastguard Worker Api_contributions []string 152*d57664e9SAndroid Build Coastguard Worker Defaults_visibility []string 153*d57664e9SAndroid Build Coastguard Worker Previous_api *string 154*d57664e9SAndroid Build Coastguard Worker} 155*d57664e9SAndroid Build Coastguard Worker 156*d57664e9SAndroid Build Coastguard Worker// Struct to pass parameters for the various merged [current|removed].txt file modules we create. 157*d57664e9SAndroid Build Coastguard Workertype MergedTxtDefinition struct { 158*d57664e9SAndroid Build Coastguard Worker // "current.txt" or "removed.txt" 159*d57664e9SAndroid Build Coastguard Worker TxtFilename string 160*d57664e9SAndroid Build Coastguard Worker // Filename in the new dist dir. "android.txt" or "android-removed.txt" 161*d57664e9SAndroid Build Coastguard Worker DistFilename string 162*d57664e9SAndroid Build Coastguard Worker // The module for the non-updatable / non-module part of the api. 163*d57664e9SAndroid Build Coastguard Worker BaseTxt string 164*d57664e9SAndroid Build Coastguard Worker // The list of modules that are relevant for this merged txt. 165*d57664e9SAndroid Build Coastguard Worker Modules proptools.Configurable[[]string] 166*d57664e9SAndroid Build Coastguard Worker // The output tag for each module to use.e.g. {.public.api.txt} for current.txt 167*d57664e9SAndroid Build Coastguard Worker ModuleTag string 168*d57664e9SAndroid Build Coastguard Worker // public, system, module-lib or system-server 169*d57664e9SAndroid Build Coastguard Worker Scope string 170*d57664e9SAndroid Build Coastguard Worker} 171*d57664e9SAndroid Build Coastguard Worker 172*d57664e9SAndroid Build Coastguard Workerfunc createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition, stubsTypeSuffix string, doDist bool) { 173*d57664e9SAndroid Build Coastguard Worker metalavaCmd := "$(location metalava)" 174*d57664e9SAndroid Build Coastguard Worker // Silence reflection warnings. See b/168689341 175*d57664e9SAndroid Build Coastguard Worker metalavaCmd += " -J--add-opens=java.base/java.util=ALL-UNNAMED " 176*d57664e9SAndroid Build Coastguard Worker metalavaCmd += " --quiet merge-signatures --format=v2 " 177*d57664e9SAndroid Build Coastguard Worker 178*d57664e9SAndroid Build Coastguard Worker filename := txt.TxtFilename 179*d57664e9SAndroid Build Coastguard Worker if txt.Scope != "public" { 180*d57664e9SAndroid Build Coastguard Worker filename = txt.Scope + "-" + filename 181*d57664e9SAndroid Build Coastguard Worker } 182*d57664e9SAndroid Build Coastguard Worker moduleName := ctx.ModuleName() + stubsTypeSuffix + filename 183*d57664e9SAndroid Build Coastguard Worker 184*d57664e9SAndroid Build Coastguard Worker props := genruleProps{} 185*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(moduleName) 186*d57664e9SAndroid Build Coastguard Worker props.Tools = []string{"metalava"} 187*d57664e9SAndroid Build Coastguard Worker props.Out = []string{filename} 188*d57664e9SAndroid Build Coastguard Worker props.Cmd = proptools.StringPtr(metalavaCmd + "$(in) --out $(out)") 189*d57664e9SAndroid Build Coastguard Worker props.Srcs = proptools.NewSimpleConfigurable([]string{txt.BaseTxt}) 190*d57664e9SAndroid Build Coastguard Worker props.Srcs.Append(createSrcs(txt.Modules, txt.ModuleTag)) 191*d57664e9SAndroid Build Coastguard Worker if doDist { 192*d57664e9SAndroid Build Coastguard Worker props.Dists = []android.Dist{ 193*d57664e9SAndroid Build Coastguard Worker { 194*d57664e9SAndroid Build Coastguard Worker Targets: []string{"droidcore"}, 195*d57664e9SAndroid Build Coastguard Worker Dir: proptools.StringPtr("api"), 196*d57664e9SAndroid Build Coastguard Worker Dest: proptools.StringPtr(filename), 197*d57664e9SAndroid Build Coastguard Worker }, 198*d57664e9SAndroid Build Coastguard Worker { 199*d57664e9SAndroid Build Coastguard Worker Targets: []string{"api_txt", "sdk"}, 200*d57664e9SAndroid Build Coastguard Worker Dir: proptools.StringPtr("apistubs/android/" + txt.Scope + "/api"), 201*d57664e9SAndroid Build Coastguard Worker Dest: proptools.StringPtr(txt.DistFilename), 202*d57664e9SAndroid Build Coastguard Worker }, 203*d57664e9SAndroid Build Coastguard Worker } 204*d57664e9SAndroid Build Coastguard Worker } 205*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//visibility:public"} 206*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.GenRuleFactory, &props) 207*d57664e9SAndroid Build Coastguard Worker} 208*d57664e9SAndroid Build Coastguard Worker 209*d57664e9SAndroid Build Coastguard Workerfunc createMergedAnnotationsFilegroups(ctx android.LoadHookContext, modules, system_server_modules proptools.Configurable[[]string]) { 210*d57664e9SAndroid Build Coastguard Worker for _, i := range []struct { 211*d57664e9SAndroid Build Coastguard Worker name string 212*d57664e9SAndroid Build Coastguard Worker tag string 213*d57664e9SAndroid Build Coastguard Worker modules proptools.Configurable[[]string] 214*d57664e9SAndroid Build Coastguard Worker }{ 215*d57664e9SAndroid Build Coastguard Worker { 216*d57664e9SAndroid Build Coastguard Worker name: "all-modules-public-annotations", 217*d57664e9SAndroid Build Coastguard Worker tag: "{.public.annotations.zip}", 218*d57664e9SAndroid Build Coastguard Worker modules: modules, 219*d57664e9SAndroid Build Coastguard Worker }, { 220*d57664e9SAndroid Build Coastguard Worker name: "all-modules-system-annotations", 221*d57664e9SAndroid Build Coastguard Worker tag: "{.system.annotations.zip}", 222*d57664e9SAndroid Build Coastguard Worker modules: modules, 223*d57664e9SAndroid Build Coastguard Worker }, { 224*d57664e9SAndroid Build Coastguard Worker name: "all-modules-module-lib-annotations", 225*d57664e9SAndroid Build Coastguard Worker tag: "{.module-lib.annotations.zip}", 226*d57664e9SAndroid Build Coastguard Worker modules: modules, 227*d57664e9SAndroid Build Coastguard Worker }, { 228*d57664e9SAndroid Build Coastguard Worker name: "all-modules-system-server-annotations", 229*d57664e9SAndroid Build Coastguard Worker tag: "{.system-server.annotations.zip}", 230*d57664e9SAndroid Build Coastguard Worker modules: system_server_modules, 231*d57664e9SAndroid Build Coastguard Worker }, 232*d57664e9SAndroid Build Coastguard Worker } { 233*d57664e9SAndroid Build Coastguard Worker props := fgProps{} 234*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(i.name) 235*d57664e9SAndroid Build Coastguard Worker props.Device_common_srcs = createSrcs(i.modules, i.tag) 236*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(android.FileGroupFactory, &props) 237*d57664e9SAndroid Build Coastguard Worker } 238*d57664e9SAndroid Build Coastguard Worker} 239*d57664e9SAndroid Build Coastguard Worker 240*d57664e9SAndroid Build Coastguard Workerfunc createMergedPublicStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) { 241*d57664e9SAndroid Build Coastguard Worker modules = modules.Clone() 242*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(modules, "", ".stubs") 243*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 244*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-modules-public-stubs") 245*d57664e9SAndroid Build Coastguard Worker props.Static_libs = modules 246*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 247*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 248*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 249*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 250*d57664e9SAndroid Build Coastguard Worker} 251*d57664e9SAndroid Build Coastguard Worker 252*d57664e9SAndroid Build Coastguard Workerfunc createMergedPublicExportableStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) { 253*d57664e9SAndroid Build Coastguard Worker modules = modules.Clone() 254*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(modules, "", ".stubs.exportable") 255*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 256*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-modules-public-stubs-exportable") 257*d57664e9SAndroid Build Coastguard Worker props.Static_libs = modules 258*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 259*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 260*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 261*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 262*d57664e9SAndroid Build Coastguard Worker} 263*d57664e9SAndroid Build Coastguard Worker 264*d57664e9SAndroid Build Coastguard Workerfunc createMergedSystemStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) { 265*d57664e9SAndroid Build Coastguard Worker // First create the all-updatable-modules-system-stubs 266*d57664e9SAndroid Build Coastguard Worker { 267*d57664e9SAndroid Build Coastguard Worker updatable_modules := modules.Clone() 268*d57664e9SAndroid Build Coastguard Worker removeAll(updatable_modules, non_updatable_modules) 269*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(updatable_modules, "", ".stubs.system") 270*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 271*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-updatable-modules-system-stubs") 272*d57664e9SAndroid Build Coastguard Worker props.Static_libs = updatable_modules 273*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 274*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 275*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 276*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 277*d57664e9SAndroid Build Coastguard Worker } 278*d57664e9SAndroid Build Coastguard Worker // Now merge all-updatable-modules-system-stubs and stubs from non-updatable modules 279*d57664e9SAndroid Build Coastguard Worker // into all-modules-system-stubs. 280*d57664e9SAndroid Build Coastguard Worker { 281*d57664e9SAndroid Build Coastguard Worker static_libs := transformArray(non_updatable_modules, "", ".stubs.system") 282*d57664e9SAndroid Build Coastguard Worker static_libs = append(static_libs, "all-updatable-modules-system-stubs") 283*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 284*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-modules-system-stubs") 285*d57664e9SAndroid Build Coastguard Worker props.Static_libs = proptools.NewSimpleConfigurable(static_libs) 286*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 287*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 288*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 289*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 290*d57664e9SAndroid Build Coastguard Worker } 291*d57664e9SAndroid Build Coastguard Worker} 292*d57664e9SAndroid Build Coastguard Worker 293*d57664e9SAndroid Build Coastguard Workerfunc createMergedSystemExportableStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) { 294*d57664e9SAndroid Build Coastguard Worker // First create the all-updatable-modules-system-stubs 295*d57664e9SAndroid Build Coastguard Worker { 296*d57664e9SAndroid Build Coastguard Worker updatable_modules := modules.Clone() 297*d57664e9SAndroid Build Coastguard Worker removeAll(updatable_modules, non_updatable_modules) 298*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(updatable_modules, "", ".stubs.exportable.system") 299*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 300*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-updatable-modules-system-stubs-exportable") 301*d57664e9SAndroid Build Coastguard Worker props.Static_libs = updatable_modules 302*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 303*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 304*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 305*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 306*d57664e9SAndroid Build Coastguard Worker } 307*d57664e9SAndroid Build Coastguard Worker // Now merge all-updatable-modules-system-stubs and stubs from non-updatable modules 308*d57664e9SAndroid Build Coastguard Worker // into all-modules-system-stubs. 309*d57664e9SAndroid Build Coastguard Worker { 310*d57664e9SAndroid Build Coastguard Worker static_libs := transformArray(non_updatable_modules, "", ".stubs.exportable.system") 311*d57664e9SAndroid Build Coastguard Worker static_libs = append(static_libs, "all-updatable-modules-system-stubs-exportable") 312*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 313*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-modules-system-stubs-exportable") 314*d57664e9SAndroid Build Coastguard Worker props.Static_libs = proptools.NewSimpleConfigurable(static_libs) 315*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 316*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 317*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 318*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 319*d57664e9SAndroid Build Coastguard Worker } 320*d57664e9SAndroid Build Coastguard Worker} 321*d57664e9SAndroid Build Coastguard Worker 322*d57664e9SAndroid Build Coastguard Workerfunc createMergedTestStubsForNonUpdatableModules(ctx android.LoadHookContext) { 323*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 324*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-non-updatable-modules-test-stubs") 325*d57664e9SAndroid Build Coastguard Worker props.Static_libs = proptools.NewSimpleConfigurable(transformArray(non_updatable_modules, "", ".stubs.test")) 326*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 327*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 328*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 329*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 330*d57664e9SAndroid Build Coastguard Worker} 331*d57664e9SAndroid Build Coastguard Worker 332*d57664e9SAndroid Build Coastguard Workerfunc createMergedTestExportableStubsForNonUpdatableModules(ctx android.LoadHookContext) { 333*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 334*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-non-updatable-modules-test-stubs-exportable") 335*d57664e9SAndroid Build Coastguard Worker props.Static_libs = proptools.NewSimpleConfigurable(transformArray(non_updatable_modules, "", ".stubs.exportable.test")) 336*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 337*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 338*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 339*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 340*d57664e9SAndroid Build Coastguard Worker} 341*d57664e9SAndroid Build Coastguard Worker 342*d57664e9SAndroid Build Coastguard Workerfunc createMergedFrameworkImpl(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) { 343*d57664e9SAndroid Build Coastguard Worker modules = modules.Clone() 344*d57664e9SAndroid Build Coastguard Worker // This module is for the "framework-all" module, which should not include the core libraries. 345*d57664e9SAndroid Build Coastguard Worker removeAll(modules, core_libraries_modules) 346*d57664e9SAndroid Build Coastguard Worker // Remove the modules that belong to non-updatable APEXes since those are allowed to compile 347*d57664e9SAndroid Build Coastguard Worker // against unstable APIs. 348*d57664e9SAndroid Build Coastguard Worker removeAll(modules, non_updatable_modules) 349*d57664e9SAndroid Build Coastguard Worker // First create updatable-framework-module-impl, which contains all updatable modules. 350*d57664e9SAndroid Build Coastguard Worker // This module compiles against module_lib SDK. 351*d57664e9SAndroid Build Coastguard Worker { 352*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(modules, "", ".impl") 353*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 354*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("updatable-framework-module-impl") 355*d57664e9SAndroid Build Coastguard Worker props.Static_libs = modules 356*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 357*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 358*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 359*d57664e9SAndroid Build Coastguard Worker } 360*d57664e9SAndroid Build Coastguard Worker 361*d57664e9SAndroid Build Coastguard Worker // Now create all-framework-module-impl, which contains updatable-framework-module-impl 362*d57664e9SAndroid Build Coastguard Worker // and all non-updatable modules. This module compiles against hidden APIs. 363*d57664e9SAndroid Build Coastguard Worker { 364*d57664e9SAndroid Build Coastguard Worker static_libs := transformArray(non_updatable_modules, "", ".impl") 365*d57664e9SAndroid Build Coastguard Worker static_libs = append(static_libs, "updatable-framework-module-impl") 366*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 367*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-framework-module-impl") 368*d57664e9SAndroid Build Coastguard Worker props.Static_libs = proptools.NewSimpleConfigurable(static_libs) 369*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("core_platform") 370*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 371*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 372*d57664e9SAndroid Build Coastguard Worker } 373*d57664e9SAndroid Build Coastguard Worker} 374*d57664e9SAndroid Build Coastguard Worker 375*d57664e9SAndroid Build Coastguard Workerfunc createMergedFrameworkModuleLibExportableStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) { 376*d57664e9SAndroid Build Coastguard Worker modules = modules.Clone() 377*d57664e9SAndroid Build Coastguard Worker // The user of this module compiles against the "core" SDK and against non-updatable modules, 378*d57664e9SAndroid Build Coastguard Worker // so remove to avoid dupes. 379*d57664e9SAndroid Build Coastguard Worker removeAll(modules, core_libraries_modules) 380*d57664e9SAndroid Build Coastguard Worker removeAll(modules, non_updatable_modules) 381*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(modules, "", ".stubs.exportable.module_lib") 382*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 383*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("framework-updatable-stubs-module_libs_api-exportable") 384*d57664e9SAndroid Build Coastguard Worker props.Static_libs = modules 385*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 386*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 387*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 388*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 389*d57664e9SAndroid Build Coastguard Worker} 390*d57664e9SAndroid Build Coastguard Worker 391*d57664e9SAndroid Build Coastguard Workerfunc createMergedFrameworkModuleLibStubs(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) { 392*d57664e9SAndroid Build Coastguard Worker modules = modules.Clone() 393*d57664e9SAndroid Build Coastguard Worker // The user of this module compiles against the "core" SDK and against non-updatable modules, 394*d57664e9SAndroid Build Coastguard Worker // so remove to avoid dupes. 395*d57664e9SAndroid Build Coastguard Worker removeAll(modules, core_libraries_modules) 396*d57664e9SAndroid Build Coastguard Worker removeAll(modules, non_updatable_modules) 397*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(modules, "", ".stubs.module_lib") 398*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 399*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("framework-updatable-stubs-module_libs_api") 400*d57664e9SAndroid Build Coastguard Worker props.Static_libs = modules 401*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("module_current") 402*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 403*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 404*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 405*d57664e9SAndroid Build Coastguard Worker} 406*d57664e9SAndroid Build Coastguard Worker 407*d57664e9SAndroid Build Coastguard Workerfunc createMergedFrameworkSystemServerExportableStubs(ctx android.LoadHookContext, bootclasspath, system_server_classpath proptools.Configurable[[]string]) { 408*d57664e9SAndroid Build Coastguard Worker // The user of this module compiles against the "core" SDK and against non-updatable bootclasspathModules, 409*d57664e9SAndroid Build Coastguard Worker // so remove to avoid dupes. 410*d57664e9SAndroid Build Coastguard Worker bootclasspathModules := bootclasspath.Clone() 411*d57664e9SAndroid Build Coastguard Worker removeAll(bootclasspathModules, core_libraries_modules) 412*d57664e9SAndroid Build Coastguard Worker removeAll(bootclasspathModules, non_updatable_modules) 413*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(bootclasspathModules, "", ".stubs.exportable.module_lib") 414*d57664e9SAndroid Build Coastguard Worker 415*d57664e9SAndroid Build Coastguard Worker system_server_classpath = system_server_classpath.Clone() 416*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(system_server_classpath, "", ".stubs.exportable.system_server") 417*d57664e9SAndroid Build Coastguard Worker 418*d57664e9SAndroid Build Coastguard Worker // Include all the module-lib APIs from the bootclasspath libraries. 419*d57664e9SAndroid Build Coastguard Worker // Then add all the system-server APIs from the service-* libraries. 420*d57664e9SAndroid Build Coastguard Worker bootclasspathModules.Append(system_server_classpath) 421*d57664e9SAndroid Build Coastguard Worker 422*d57664e9SAndroid Build Coastguard Worker props := libraryProps{} 423*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("framework-updatable-stubs-system_server_api-exportable") 424*d57664e9SAndroid Build Coastguard Worker props.Static_libs = bootclasspathModules 425*d57664e9SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr("system_server_current") 426*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 427*d57664e9SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 428*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(java.LibraryFactory, &props) 429*d57664e9SAndroid Build Coastguard Worker} 430*d57664e9SAndroid Build Coastguard Worker 431*d57664e9SAndroid Build Coastguard Workerfunc createPublicStubsSourceFilegroup(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) { 432*d57664e9SAndroid Build Coastguard Worker props := fgProps{} 433*d57664e9SAndroid Build Coastguard Worker props.Name = proptools.StringPtr("all-modules-public-stubs-source-exportable") 434*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(modules, "", ".stubs.source") 435*d57664e9SAndroid Build Coastguard Worker props.Device_common_srcs = createSrcs(modules, "{.exportable}") 436*d57664e9SAndroid Build Coastguard Worker props.Visibility = []string{"//frameworks/base"} 437*d57664e9SAndroid Build Coastguard Worker ctx.CreateModule(android.FileGroupFactory, &props) 438*d57664e9SAndroid Build Coastguard Worker} 439*d57664e9SAndroid Build Coastguard Worker 440*d57664e9SAndroid Build Coastguard Workerfunc createMergedTxts( 441*d57664e9SAndroid Build Coastguard Worker ctx android.LoadHookContext, 442*d57664e9SAndroid Build Coastguard Worker bootclasspath proptools.Configurable[[]string], 443*d57664e9SAndroid Build Coastguard Worker system_server_classpath proptools.Configurable[[]string], 444*d57664e9SAndroid Build Coastguard Worker baseTxtModulePrefix string, 445*d57664e9SAndroid Build Coastguard Worker stubsTypeSuffix string, 446*d57664e9SAndroid Build Coastguard Worker doDist bool, 447*d57664e9SAndroid Build Coastguard Worker) { 448*d57664e9SAndroid Build Coastguard Worker var textFiles []MergedTxtDefinition 449*d57664e9SAndroid Build Coastguard Worker 450*d57664e9SAndroid Build Coastguard Worker tagSuffix := []string{".api.txt}", ".removed-api.txt}"} 451*d57664e9SAndroid Build Coastguard Worker distFilename := []string{"android.txt", "android-removed.txt"} 452*d57664e9SAndroid Build Coastguard Worker for i, f := range []string{"current.txt", "removed.txt"} { 453*d57664e9SAndroid Build Coastguard Worker textFiles = append(textFiles, MergedTxtDefinition{ 454*d57664e9SAndroid Build Coastguard Worker TxtFilename: f, 455*d57664e9SAndroid Build Coastguard Worker DistFilename: distFilename[i], 456*d57664e9SAndroid Build Coastguard Worker BaseTxt: ":" + baseTxtModulePrefix + f, 457*d57664e9SAndroid Build Coastguard Worker Modules: bootclasspath, 458*d57664e9SAndroid Build Coastguard Worker ModuleTag: "{.public" + tagSuffix[i], 459*d57664e9SAndroid Build Coastguard Worker Scope: "public", 460*d57664e9SAndroid Build Coastguard Worker }) 461*d57664e9SAndroid Build Coastguard Worker textFiles = append(textFiles, MergedTxtDefinition{ 462*d57664e9SAndroid Build Coastguard Worker TxtFilename: f, 463*d57664e9SAndroid Build Coastguard Worker DistFilename: distFilename[i], 464*d57664e9SAndroid Build Coastguard Worker BaseTxt: ":" + baseTxtModulePrefix + "system-" + f, 465*d57664e9SAndroid Build Coastguard Worker Modules: bootclasspath, 466*d57664e9SAndroid Build Coastguard Worker ModuleTag: "{.system" + tagSuffix[i], 467*d57664e9SAndroid Build Coastguard Worker Scope: "system", 468*d57664e9SAndroid Build Coastguard Worker }) 469*d57664e9SAndroid Build Coastguard Worker textFiles = append(textFiles, MergedTxtDefinition{ 470*d57664e9SAndroid Build Coastguard Worker TxtFilename: f, 471*d57664e9SAndroid Build Coastguard Worker DistFilename: distFilename[i], 472*d57664e9SAndroid Build Coastguard Worker BaseTxt: ":" + baseTxtModulePrefix + "module-lib-" + f, 473*d57664e9SAndroid Build Coastguard Worker Modules: bootclasspath, 474*d57664e9SAndroid Build Coastguard Worker ModuleTag: "{.module-lib" + tagSuffix[i], 475*d57664e9SAndroid Build Coastguard Worker Scope: "module-lib", 476*d57664e9SAndroid Build Coastguard Worker }) 477*d57664e9SAndroid Build Coastguard Worker textFiles = append(textFiles, MergedTxtDefinition{ 478*d57664e9SAndroid Build Coastguard Worker TxtFilename: f, 479*d57664e9SAndroid Build Coastguard Worker DistFilename: distFilename[i], 480*d57664e9SAndroid Build Coastguard Worker BaseTxt: ":" + baseTxtModulePrefix + "system-server-" + f, 481*d57664e9SAndroid Build Coastguard Worker Modules: system_server_classpath, 482*d57664e9SAndroid Build Coastguard Worker ModuleTag: "{.system-server" + tagSuffix[i], 483*d57664e9SAndroid Build Coastguard Worker Scope: "system-server", 484*d57664e9SAndroid Build Coastguard Worker }) 485*d57664e9SAndroid Build Coastguard Worker } 486*d57664e9SAndroid Build Coastguard Worker for _, txt := range textFiles { 487*d57664e9SAndroid Build Coastguard Worker createMergedTxt(ctx, txt, stubsTypeSuffix, doDist) 488*d57664e9SAndroid Build Coastguard Worker } 489*d57664e9SAndroid Build Coastguard Worker} 490*d57664e9SAndroid Build Coastguard Worker 491*d57664e9SAndroid Build Coastguard Workerfunc (a *CombinedApis) createInternalModules(ctx android.LoadHookContext) { 492*d57664e9SAndroid Build Coastguard Worker bootclasspath := a.properties.Bootclasspath.Clone() 493*d57664e9SAndroid Build Coastguard Worker system_server_classpath := a.properties.System_server_classpath.Clone() 494*d57664e9SAndroid Build Coastguard Worker if ctx.Config().VendorConfig("ANDROID").Bool("include_nonpublic_framework_api") { 495*d57664e9SAndroid Build Coastguard Worker bootclasspath.AppendSimpleValue(a.properties.Conditional_bootclasspath) 496*d57664e9SAndroid Build Coastguard Worker } 497*d57664e9SAndroid Build Coastguard Worker createMergedTxts(ctx, bootclasspath, system_server_classpath, "non-updatable-", "-", false) 498*d57664e9SAndroid Build Coastguard Worker createMergedTxts(ctx, bootclasspath, system_server_classpath, "non-updatable-exportable-", "-exportable-", true) 499*d57664e9SAndroid Build Coastguard Worker 500*d57664e9SAndroid Build Coastguard Worker createMergedPublicStubs(ctx, bootclasspath) 501*d57664e9SAndroid Build Coastguard Worker createMergedSystemStubs(ctx, bootclasspath) 502*d57664e9SAndroid Build Coastguard Worker createMergedTestStubsForNonUpdatableModules(ctx) 503*d57664e9SAndroid Build Coastguard Worker createMergedFrameworkModuleLibStubs(ctx, bootclasspath) 504*d57664e9SAndroid Build Coastguard Worker createMergedFrameworkImpl(ctx, bootclasspath) 505*d57664e9SAndroid Build Coastguard Worker 506*d57664e9SAndroid Build Coastguard Worker createMergedPublicExportableStubs(ctx, bootclasspath) 507*d57664e9SAndroid Build Coastguard Worker createMergedSystemExportableStubs(ctx, bootclasspath) 508*d57664e9SAndroid Build Coastguard Worker createMergedTestExportableStubsForNonUpdatableModules(ctx) 509*d57664e9SAndroid Build Coastguard Worker createMergedFrameworkModuleLibExportableStubs(ctx, bootclasspath) 510*d57664e9SAndroid Build Coastguard Worker createMergedFrameworkSystemServerExportableStubs(ctx, bootclasspath, system_server_classpath) 511*d57664e9SAndroid Build Coastguard Worker 512*d57664e9SAndroid Build Coastguard Worker createMergedAnnotationsFilegroups(ctx, bootclasspath, system_server_classpath) 513*d57664e9SAndroid Build Coastguard Worker 514*d57664e9SAndroid Build Coastguard Worker createPublicStubsSourceFilegroup(ctx, bootclasspath) 515*d57664e9SAndroid Build Coastguard Worker} 516*d57664e9SAndroid Build Coastguard Worker 517*d57664e9SAndroid Build Coastguard Workerfunc combinedApisModuleFactory() android.Module { 518*d57664e9SAndroid Build Coastguard Worker module := &CombinedApis{} 519*d57664e9SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 520*d57664e9SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) 521*d57664e9SAndroid Build Coastguard Worker android.AddLoadHook(module, func(ctx android.LoadHookContext) { module.createInternalModules(ctx) }) 522*d57664e9SAndroid Build Coastguard Worker return module 523*d57664e9SAndroid Build Coastguard Worker} 524*d57664e9SAndroid Build Coastguard Worker 525*d57664e9SAndroid Build Coastguard Worker// Various utility methods below. 526*d57664e9SAndroid Build Coastguard Worker 527*d57664e9SAndroid Build Coastguard Worker// Creates an array of ":<m><tag>" for each m in <modules>. 528*d57664e9SAndroid Build Coastguard Workerfunc createSrcs(modules proptools.Configurable[[]string], tag string) proptools.Configurable[[]string] { 529*d57664e9SAndroid Build Coastguard Worker result := modules.Clone() 530*d57664e9SAndroid Build Coastguard Worker transformConfigurableArray(result, ":", tag) 531*d57664e9SAndroid Build Coastguard Worker return result 532*d57664e9SAndroid Build Coastguard Worker} 533*d57664e9SAndroid Build Coastguard Worker 534*d57664e9SAndroid Build Coastguard Worker// Creates an array of "<prefix><m><suffix>", for each m in <modules>. 535*d57664e9SAndroid Build Coastguard Workerfunc transformArray(modules []string, prefix, suffix string) []string { 536*d57664e9SAndroid Build Coastguard Worker a := make([]string, 0, len(modules)) 537*d57664e9SAndroid Build Coastguard Worker for _, module := range modules { 538*d57664e9SAndroid Build Coastguard Worker a = append(a, prefix+module+suffix) 539*d57664e9SAndroid Build Coastguard Worker } 540*d57664e9SAndroid Build Coastguard Worker return a 541*d57664e9SAndroid Build Coastguard Worker} 542*d57664e9SAndroid Build Coastguard Worker 543*d57664e9SAndroid Build Coastguard Worker// Creates an array of "<prefix><m><suffix>", for each m in <modules>. 544*d57664e9SAndroid Build Coastguard Workerfunc transformConfigurableArray(modules proptools.Configurable[[]string], prefix, suffix string) { 545*d57664e9SAndroid Build Coastguard Worker modules.AddPostProcessor(func(s []string) []string { 546*d57664e9SAndroid Build Coastguard Worker return transformArray(s, prefix, suffix) 547*d57664e9SAndroid Build Coastguard Worker }) 548*d57664e9SAndroid Build Coastguard Worker} 549*d57664e9SAndroid Build Coastguard Worker 550*d57664e9SAndroid Build Coastguard Workerfunc removeAll(s proptools.Configurable[[]string], vs []string) { 551*d57664e9SAndroid Build Coastguard Worker s.AddPostProcessor(func(s []string) []string { 552*d57664e9SAndroid Build Coastguard Worker a := make([]string, 0, len(s)) 553*d57664e9SAndroid Build Coastguard Worker for _, module := range s { 554*d57664e9SAndroid Build Coastguard Worker if !slices.Contains(vs, module) { 555*d57664e9SAndroid Build Coastguard Worker a = append(a, module) 556*d57664e9SAndroid Build Coastguard Worker } 557*d57664e9SAndroid Build Coastguard Worker } 558*d57664e9SAndroid Build Coastguard Worker return a 559*d57664e9SAndroid Build Coastguard Worker }) 560*d57664e9SAndroid Build Coastguard Worker} 561*d57664e9SAndroid Build Coastguard Worker 562*d57664e9SAndroid Build Coastguard Workerfunc remove(s []string, v string) []string { 563*d57664e9SAndroid Build Coastguard Worker s2 := make([]string, 0, len(s)) 564*d57664e9SAndroid Build Coastguard Worker for _, sv := range s { 565*d57664e9SAndroid Build Coastguard Worker if sv != v { 566*d57664e9SAndroid Build Coastguard Worker s2 = append(s2, sv) 567*d57664e9SAndroid Build Coastguard Worker } 568*d57664e9SAndroid Build Coastguard Worker } 569*d57664e9SAndroid Build Coastguard Worker return s2 570*d57664e9SAndroid Build Coastguard Worker} 571