1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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 cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "io" 20*333d2b36SAndroid Build Coastguard Worker "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "strings" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workervar ( 27*333d2b36SAndroid Build Coastguard Worker NativeBridgeSuffix = ".native_bridge" 28*333d2b36SAndroid Build Coastguard Worker ProductSuffix = ".product" 29*333d2b36SAndroid Build Coastguard Worker VendorSuffix = ".vendor" 30*333d2b36SAndroid Build Coastguard Worker RamdiskSuffix = ".ramdisk" 31*333d2b36SAndroid Build Coastguard Worker VendorRamdiskSuffix = ".vendor_ramdisk" 32*333d2b36SAndroid Build Coastguard Worker RecoverySuffix = ".recovery" 33*333d2b36SAndroid Build Coastguard Worker sdkSuffix = ".sdk" 34*333d2b36SAndroid Build Coastguard Worker) 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Workertype AndroidMkContext interface { 37*333d2b36SAndroid Build Coastguard Worker BaseModuleName() string 38*333d2b36SAndroid Build Coastguard Worker Target() android.Target 39*333d2b36SAndroid Build Coastguard Worker subAndroidMk(android.Config, *android.AndroidMkInfo, interface{}) 40*333d2b36SAndroid Build Coastguard Worker Arch() android.Arch 41*333d2b36SAndroid Build Coastguard Worker Os() android.OsType 42*333d2b36SAndroid Build Coastguard Worker Host() bool 43*333d2b36SAndroid Build Coastguard Worker UseVndk() bool 44*333d2b36SAndroid Build Coastguard Worker VndkVersion() string 45*333d2b36SAndroid Build Coastguard Worker static() bool 46*333d2b36SAndroid Build Coastguard Worker InRamdisk() bool 47*333d2b36SAndroid Build Coastguard Worker InVendorRamdisk() bool 48*333d2b36SAndroid Build Coastguard Worker InRecovery() bool 49*333d2b36SAndroid Build Coastguard Worker NotInPlatform() bool 50*333d2b36SAndroid Build Coastguard Worker InVendorOrProduct() bool 51*333d2b36SAndroid Build Coastguard Worker ArchSpecific() bool 52*333d2b36SAndroid Build Coastguard Worker} 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Workertype subAndroidMkProviderInfoProducer interface { 55*333d2b36SAndroid Build Coastguard Worker prepareAndroidMKProviderInfo(android.Config, AndroidMkContext, *android.AndroidMkInfo) 56*333d2b36SAndroid Build Coastguard Worker} 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Workertype subAndroidMkFooterInfoProducer interface { 59*333d2b36SAndroid Build Coastguard Worker prepareAndroidMKFooterInfo(android.Config, AndroidMkContext, *android.AndroidMkInfo) 60*333d2b36SAndroid Build Coastguard Worker} 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) subAndroidMk(config android.Config, entries *android.AndroidMkInfo, obj interface{}) { 63*333d2b36SAndroid Build Coastguard Worker if c.subAndroidMkOnce == nil { 64*333d2b36SAndroid Build Coastguard Worker c.subAndroidMkOnce = make(map[subAndroidMkProviderInfoProducer]bool) 65*333d2b36SAndroid Build Coastguard Worker } 66*333d2b36SAndroid Build Coastguard Worker if androidmk, ok := obj.(subAndroidMkProviderInfoProducer); ok { 67*333d2b36SAndroid Build Coastguard Worker if !c.subAndroidMkOnce[androidmk] { 68*333d2b36SAndroid Build Coastguard Worker c.subAndroidMkOnce[androidmk] = true 69*333d2b36SAndroid Build Coastguard Worker androidmk.prepareAndroidMKProviderInfo(config, c, entries) 70*333d2b36SAndroid Build Coastguard Worker } 71*333d2b36SAndroid Build Coastguard Worker } 72*333d2b36SAndroid Build Coastguard Worker} 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Workervar _ android.AndroidMkProviderInfoProducer = (*Module)(nil) 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Workerfunc (c *Module) PrepareAndroidMKProviderInfo(config android.Config) *android.AndroidMkProviderInfo { 77*333d2b36SAndroid Build Coastguard Worker if c.hideApexVariantFromMake || c.Properties.HideFromMake { 78*333d2b36SAndroid Build Coastguard Worker return &android.AndroidMkProviderInfo{ 79*333d2b36SAndroid Build Coastguard Worker PrimaryInfo: android.AndroidMkInfo{ 80*333d2b36SAndroid Build Coastguard Worker Disabled: true, 81*333d2b36SAndroid Build Coastguard Worker }, 82*333d2b36SAndroid Build Coastguard Worker } 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker providerData := android.AndroidMkProviderInfo{ 86*333d2b36SAndroid Build Coastguard Worker PrimaryInfo: android.AndroidMkInfo{ 87*333d2b36SAndroid Build Coastguard Worker OutputFile: c.outputFile, 88*333d2b36SAndroid Build Coastguard Worker Required: c.Properties.AndroidMkRuntimeLibs, 89*333d2b36SAndroid Build Coastguard Worker OverrideName: c.BaseModuleName(), 90*333d2b36SAndroid Build Coastguard Worker Include: "$(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk", 91*333d2b36SAndroid Build Coastguard Worker EntryMap: make(map[string][]string), 92*333d2b36SAndroid Build Coastguard Worker }, 93*333d2b36SAndroid Build Coastguard Worker } 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker entries := &providerData.PrimaryInfo 96*333d2b36SAndroid Build Coastguard Worker if len(c.Properties.Logtags) > 0 { 97*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_SOONG_LOGTAGS_FILES", c.logtagsPaths.Strings()...) 98*333d2b36SAndroid Build Coastguard Worker } 99*333d2b36SAndroid Build Coastguard Worker // Note: Pass the exact value of AndroidMkSystemSharedLibs to the Make 100*333d2b36SAndroid Build Coastguard Worker // world, even if it is an empty list. In the Make world, 101*333d2b36SAndroid Build Coastguard Worker // LOCAL_SYSTEM_SHARED_LIBRARIES defaults to "none", which is expanded 102*333d2b36SAndroid Build Coastguard Worker // to the default list of system shared libs by the build system. 103*333d2b36SAndroid Build Coastguard Worker // Soong computes the exact list of system shared libs, so we have to 104*333d2b36SAndroid Build Coastguard Worker // override the default value when the list of libs is actually empty. 105*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_SYSTEM_SHARED_LIBRARIES", strings.Join(c.Properties.AndroidMkSystemSharedLibs, " ")) 106*333d2b36SAndroid Build Coastguard Worker if len(c.Properties.AndroidMkSharedLibs) > 0 { 107*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_SHARED_LIBRARIES", c.Properties.AndroidMkSharedLibs...) 108*333d2b36SAndroid Build Coastguard Worker } 109*333d2b36SAndroid Build Coastguard Worker if len(c.Properties.AndroidMkRuntimeLibs) > 0 { 110*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_RUNTIME_LIBRARIES", c.Properties.AndroidMkRuntimeLibs...) 111*333d2b36SAndroid Build Coastguard Worker } 112*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_SOONG_LINK_TYPE", c.makeLinkType) 113*333d2b36SAndroid Build Coastguard Worker if c.InVendor() { 114*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_IN_VENDOR", true) 115*333d2b36SAndroid Build Coastguard Worker } else if c.InProduct() { 116*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_IN_PRODUCT", true) 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker if c.Properties.SdkAndPlatformVariantVisibleToMake { 119*333d2b36SAndroid Build Coastguard Worker // Add the unsuffixed name to SOONG_SDK_VARIANT_MODULES so that Make can rewrite 120*333d2b36SAndroid Build Coastguard Worker // dependencies to the .sdk suffix when building a module that uses the SDK. 121*333d2b36SAndroid Build Coastguard Worker entries.SetString("SOONG_SDK_VARIANT_MODULES", 122*333d2b36SAndroid Build Coastguard Worker "$(SOONG_SDK_VARIANT_MODULES) $(patsubst %.sdk,%,$(LOCAL_MODULE))") 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", c.IsSkipInstall()) 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Worker for _, feature := range c.features { 127*333d2b36SAndroid Build Coastguard Worker c.subAndroidMk(config, entries, feature) 128*333d2b36SAndroid Build Coastguard Worker } 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Worker c.subAndroidMk(config, entries, c.compiler) 131*333d2b36SAndroid Build Coastguard Worker c.subAndroidMk(config, entries, c.linker) 132*333d2b36SAndroid Build Coastguard Worker if c.sanitize != nil { 133*333d2b36SAndroid Build Coastguard Worker c.subAndroidMk(config, entries, c.sanitize) 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker c.subAndroidMk(config, entries, c.installer) 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Worker entries.SubName += c.Properties.SubName 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Worker // The footer info comes at the last step, previously it was achieved by 140*333d2b36SAndroid Build Coastguard Worker // calling some extra footer function that were added earlier. Because we no 141*333d2b36SAndroid Build Coastguard Worker // longer use these extra footer functions, we need to put this step at the 142*333d2b36SAndroid Build Coastguard Worker // last one. 143*333d2b36SAndroid Build Coastguard Worker if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake && 144*333d2b36SAndroid Build Coastguard Worker c.CcLibraryInterface() && c.Shared() { 145*333d2b36SAndroid Build Coastguard Worker // Using the SDK variant as a JNI library needs a copy of the .so that 146*333d2b36SAndroid Build Coastguard Worker // is not named .sdk.so so that it can be packaged into the APK with 147*333d2b36SAndroid Build Coastguard Worker // the right name. 148*333d2b36SAndroid Build Coastguard Worker entries.FooterStrings = []string{ 149*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("%s %s %s", "$(eval $(call copy-one-file,", 150*333d2b36SAndroid Build Coastguard Worker "$(LOCAL_BUILT_MODULE),", 151*333d2b36SAndroid Build Coastguard Worker "$(patsubst %.sdk.so,%.so,$(LOCAL_BUILT_MODULE))))")} 152*333d2b36SAndroid Build Coastguard Worker } 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Worker for _, obj := range []interface{}{c.compiler, c.linker, c.sanitize, c.installer} { 155*333d2b36SAndroid Build Coastguard Worker if obj == nil { 156*333d2b36SAndroid Build Coastguard Worker continue 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker if p, ok := obj.(subAndroidMkFooterInfoProducer); ok { 159*333d2b36SAndroid Build Coastguard Worker p.prepareAndroidMKFooterInfo(config, c, entries) 160*333d2b36SAndroid Build Coastguard Worker } 161*333d2b36SAndroid Build Coastguard Worker } 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Worker return &providerData 164*333d2b36SAndroid Build Coastguard Worker} 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Workerfunc androidMkWriteExtraTestConfigs(extraTestConfigs android.Paths, entries *android.AndroidMkInfo) { 167*333d2b36SAndroid Build Coastguard Worker if len(extraTestConfigs) > 0 { 168*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_EXTRA_FULL_TEST_CONFIGS", extraTestConfigs.Strings()...) 169*333d2b36SAndroid Build Coastguard Worker } 170*333d2b36SAndroid Build Coastguard Worker} 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Workerfunc makeOverrideModuleNames(ctx AndroidMkContext, overrides []string) []string { 173*333d2b36SAndroid Build Coastguard Worker if ctx.Target().NativeBridge == android.NativeBridgeEnabled { 174*333d2b36SAndroid Build Coastguard Worker var result []string 175*333d2b36SAndroid Build Coastguard Worker for _, override := range overrides { 176*333d2b36SAndroid Build Coastguard Worker result = append(result, override+NativeBridgeSuffix) 177*333d2b36SAndroid Build Coastguard Worker } 178*333d2b36SAndroid Build Coastguard Worker return result 179*333d2b36SAndroid Build Coastguard Worker } 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Worker return overrides 182*333d2b36SAndroid Build Coastguard Worker} 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) androidMkWriteExportedFlags(entries *android.AndroidMkInfo) { 185*333d2b36SAndroid Build Coastguard Worker var exportedFlags []string 186*333d2b36SAndroid Build Coastguard Worker var includeDirs android.Paths 187*333d2b36SAndroid Build Coastguard Worker var systemIncludeDirs android.Paths 188*333d2b36SAndroid Build Coastguard Worker var exportedDeps android.Paths 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Worker if library.flagExporterInfo != nil { 191*333d2b36SAndroid Build Coastguard Worker exportedFlags = library.flagExporterInfo.Flags 192*333d2b36SAndroid Build Coastguard Worker includeDirs = library.flagExporterInfo.IncludeDirs 193*333d2b36SAndroid Build Coastguard Worker systemIncludeDirs = library.flagExporterInfo.SystemIncludeDirs 194*333d2b36SAndroid Build Coastguard Worker exportedDeps = library.flagExporterInfo.Deps 195*333d2b36SAndroid Build Coastguard Worker } else { 196*333d2b36SAndroid Build Coastguard Worker exportedFlags = library.flagExporter.flags 197*333d2b36SAndroid Build Coastguard Worker includeDirs = library.flagExporter.dirs 198*333d2b36SAndroid Build Coastguard Worker systemIncludeDirs = library.flagExporter.systemDirs 199*333d2b36SAndroid Build Coastguard Worker exportedDeps = library.flagExporter.deps 200*333d2b36SAndroid Build Coastguard Worker } 201*333d2b36SAndroid Build Coastguard Worker for _, dir := range includeDirs { 202*333d2b36SAndroid Build Coastguard Worker exportedFlags = append(exportedFlags, "-I"+dir.String()) 203*333d2b36SAndroid Build Coastguard Worker } 204*333d2b36SAndroid Build Coastguard Worker for _, dir := range systemIncludeDirs { 205*333d2b36SAndroid Build Coastguard Worker exportedFlags = append(exportedFlags, "-isystem "+dir.String()) 206*333d2b36SAndroid Build Coastguard Worker } 207*333d2b36SAndroid Build Coastguard Worker if len(exportedFlags) > 0 { 208*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_EXPORT_CFLAGS", exportedFlags...) 209*333d2b36SAndroid Build Coastguard Worker } 210*333d2b36SAndroid Build Coastguard Worker if len(exportedDeps) > 0 { 211*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_EXPORT_C_INCLUDE_DEPS", exportedDeps.Strings()...) 212*333d2b36SAndroid Build Coastguard Worker } 213*333d2b36SAndroid Build Coastguard Worker} 214*333d2b36SAndroid Build Coastguard Worker 215*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries *android.AndroidMkInfo) { 216*333d2b36SAndroid Build Coastguard Worker if !library.static() { 217*333d2b36SAndroid Build Coastguard Worker entries.AddPaths("LOCAL_ADDITIONAL_DEPENDENCIES", library.sAbiDiff) 218*333d2b36SAndroid Build Coastguard Worker } 219*333d2b36SAndroid Build Coastguard Worker} 220*333d2b36SAndroid Build Coastguard Worker 221*333d2b36SAndroid Build Coastguard Worker// TODO(ccross): remove this once apex/androidmk.go is converted to AndroidMkEntries 222*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) androidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) { 223*333d2b36SAndroid Build Coastguard Worker if !library.static() { 224*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES +=", strings.Join(library.sAbiDiff.Strings(), " ")) 225*333d2b36SAndroid Build Coastguard Worker } 226*333d2b36SAndroid Build Coastguard Worker} 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 229*333d2b36SAndroid Build Coastguard Worker if library.static() { 230*333d2b36SAndroid Build Coastguard Worker entries.Class = "STATIC_LIBRARIES" 231*333d2b36SAndroid Build Coastguard Worker } else if library.shared() { 232*333d2b36SAndroid Build Coastguard Worker entries.Class = "SHARED_LIBRARIES" 233*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_SOONG_TOC", library.toc().String()) 234*333d2b36SAndroid Build Coastguard Worker if !library.buildStubs() && library.unstrippedOutputFile != nil { 235*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", library.unstrippedOutputFile.String()) 236*333d2b36SAndroid Build Coastguard Worker } 237*333d2b36SAndroid Build Coastguard Worker if len(library.Properties.Overrides) > 0 { 238*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, library.Properties.Overrides), " ")) 239*333d2b36SAndroid Build Coastguard Worker } 240*333d2b36SAndroid Build Coastguard Worker if len(library.postInstallCmds) > 0 { 241*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(library.postInstallCmds, "&& ")) 242*333d2b36SAndroid Build Coastguard Worker } 243*333d2b36SAndroid Build Coastguard Worker } else if library.header() { 244*333d2b36SAndroid Build Coastguard Worker entries.Class = "HEADER_LIBRARIES" 245*333d2b36SAndroid Build Coastguard Worker } 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Worker if library.distFile != nil { 248*333d2b36SAndroid Build Coastguard Worker entries.DistFiles = android.MakeDefaultDistFiles(library.distFile) 249*333d2b36SAndroid Build Coastguard Worker } 250*333d2b36SAndroid Build Coastguard Worker 251*333d2b36SAndroid Build Coastguard Worker library.androidMkWriteExportedFlags(entries) 252*333d2b36SAndroid Build Coastguard Worker library.androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries) 253*333d2b36SAndroid Build Coastguard Worker 254*333d2b36SAndroid Build Coastguard Worker if entries.OutputFile.Valid() { 255*333d2b36SAndroid Build Coastguard Worker _, _, ext := android.SplitFileExt(entries.OutputFile.Path().Base()) 256*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext) 257*333d2b36SAndroid Build Coastguard Worker } 258*333d2b36SAndroid Build Coastguard Worker 259*333d2b36SAndroid Build Coastguard Worker if library.coverageOutputFile.Valid() { 260*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", library.coverageOutputFile.String()) 261*333d2b36SAndroid Build Coastguard Worker } 262*333d2b36SAndroid Build Coastguard Worker 263*333d2b36SAndroid Build Coastguard Worker if library.shared() && !library.buildStubs() { 264*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, library.baseInstaller) 265*333d2b36SAndroid Build Coastguard Worker } else { 266*333d2b36SAndroid Build Coastguard Worker if library.buildStubs() && library.stubsVersion() != "" { 267*333d2b36SAndroid Build Coastguard Worker entries.SubName = "." + library.stubsVersion() 268*333d2b36SAndroid Build Coastguard Worker } 269*333d2b36SAndroid Build Coastguard Worker // library.makeUninstallable() depends on this to bypass HideFromMake() for 270*333d2b36SAndroid Build Coastguard Worker // static libraries. 271*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) 272*333d2b36SAndroid Build Coastguard Worker if library.buildStubs() { 273*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_NO_NOTICE_FILE", true) 274*333d2b36SAndroid Build Coastguard Worker } 275*333d2b36SAndroid Build Coastguard Worker } 276*333d2b36SAndroid Build Coastguard Worker // If a library providing a stub is included in an APEX, the private APIs of the library 277*333d2b36SAndroid Build Coastguard Worker // is accessible only inside the APEX. From outside of the APEX, clients can only use the 278*333d2b36SAndroid Build Coastguard Worker // public APIs via the stub. To enforce this, the (latest version of the) stub gets the 279*333d2b36SAndroid Build Coastguard Worker // name of the library. The impl library instead gets the `.bootstrap` suffix to so that 280*333d2b36SAndroid Build Coastguard Worker // they can be exceptionally used directly when APEXes are not available (e.g. during the 281*333d2b36SAndroid Build Coastguard Worker // very early stage in the boot process). 282*333d2b36SAndroid Build Coastguard Worker if len(library.Properties.Stubs.Versions) > 0 && !ctx.Host() && ctx.NotInPlatform() && 283*333d2b36SAndroid Build Coastguard Worker !ctx.InRamdisk() && !ctx.InVendorRamdisk() && !ctx.InRecovery() && !ctx.InVendorOrProduct() && !ctx.static() { 284*333d2b36SAndroid Build Coastguard Worker if library.buildStubs() && library.isLatestStubVersion() { 285*333d2b36SAndroid Build Coastguard Worker entries.SubName = "" 286*333d2b36SAndroid Build Coastguard Worker } 287*333d2b36SAndroid Build Coastguard Worker if !library.buildStubs() { 288*333d2b36SAndroid Build Coastguard Worker entries.SubName = ".bootstrap" 289*333d2b36SAndroid Build Coastguard Worker } 290*333d2b36SAndroid Build Coastguard Worker } 291*333d2b36SAndroid Build Coastguard Worker} 292*333d2b36SAndroid Build Coastguard Worker 293*333d2b36SAndroid Build Coastguard Workerfunc (object *objectLinker) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 294*333d2b36SAndroid Build Coastguard Worker entries.Class = "STATIC_LIBRARIES" 295*333d2b36SAndroid Build Coastguard Worker} 296*333d2b36SAndroid Build Coastguard Worker 297*333d2b36SAndroid Build Coastguard Workerfunc (object *objectLinker) prepareAndroidMKFooterInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 298*333d2b36SAndroid Build Coastguard Worker out := entries.OutputFile.Path() 299*333d2b36SAndroid Build Coastguard Worker name := ctx.BaseModuleName() 300*333d2b36SAndroid Build Coastguard Worker if entries.OverrideName != "" { 301*333d2b36SAndroid Build Coastguard Worker name = entries.OverrideName 302*333d2b36SAndroid Build Coastguard Worker } 303*333d2b36SAndroid Build Coastguard Worker 304*333d2b36SAndroid Build Coastguard Worker prefix := "" 305*333d2b36SAndroid Build Coastguard Worker if ctx.ArchSpecific() { 306*333d2b36SAndroid Build Coastguard Worker switch ctx.Os().Class { 307*333d2b36SAndroid Build Coastguard Worker case android.Host: 308*333d2b36SAndroid Build Coastguard Worker if ctx.Target().HostCross { 309*333d2b36SAndroid Build Coastguard Worker prefix = "HOST_CROSS_" 310*333d2b36SAndroid Build Coastguard Worker } else { 311*333d2b36SAndroid Build Coastguard Worker prefix = "HOST_" 312*333d2b36SAndroid Build Coastguard Worker } 313*333d2b36SAndroid Build Coastguard Worker case android.Device: 314*333d2b36SAndroid Build Coastguard Worker prefix = "TARGET_" 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker } 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Worker if ctx.Arch().ArchType != config.Targets[ctx.Os()][0].Arch.ArchType { 319*333d2b36SAndroid Build Coastguard Worker prefix = "2ND_" + prefix 320*333d2b36SAndroid Build Coastguard Worker } 321*333d2b36SAndroid Build Coastguard Worker } 322*333d2b36SAndroid Build Coastguard Worker 323*333d2b36SAndroid Build Coastguard Worker varname := fmt.Sprintf("SOONG_%sOBJECT_%s%s", prefix, name, entries.SubName) 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Worker entries.FooterStrings = append(entries.FooterStrings, 326*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("\n%s := %s\n.KATI_READONLY: %s", varname, out.String(), varname)) 327*333d2b36SAndroid Build Coastguard Worker} 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Workerfunc (test *testDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 330*333d2b36SAndroid Build Coastguard Worker if len(test.InstallerProperties.Test_suites) > 0 { 331*333d2b36SAndroid Build Coastguard Worker entries.AddCompatibilityTestSuites(test.InstallerProperties.Test_suites...) 332*333d2b36SAndroid Build Coastguard Worker } 333*333d2b36SAndroid Build Coastguard Worker} 334*333d2b36SAndroid Build Coastguard Worker 335*333d2b36SAndroid Build Coastguard Workerfunc (binary *binaryDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 336*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, binary.baseInstaller) 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Worker entries.Class = "EXECUTABLES" 339*333d2b36SAndroid Build Coastguard Worker entries.DistFiles = binary.distFiles 340*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", binary.unstrippedOutputFile.String()) 341*333d2b36SAndroid Build Coastguard Worker if len(binary.symlinks) > 0 { 342*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_MODULE_SYMLINKS", binary.symlinks...) 343*333d2b36SAndroid Build Coastguard Worker } 344*333d2b36SAndroid Build Coastguard Worker 345*333d2b36SAndroid Build Coastguard Worker if binary.coverageOutputFile.Valid() { 346*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", binary.coverageOutputFile.String()) 347*333d2b36SAndroid Build Coastguard Worker } 348*333d2b36SAndroid Build Coastguard Worker 349*333d2b36SAndroid Build Coastguard Worker if len(binary.Properties.Overrides) > 0 { 350*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, binary.Properties.Overrides), " ")) 351*333d2b36SAndroid Build Coastguard Worker } 352*333d2b36SAndroid Build Coastguard Worker if len(binary.postInstallCmds) > 0 { 353*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(binary.postInstallCmds, "&& ")) 354*333d2b36SAndroid Build Coastguard Worker } 355*333d2b36SAndroid Build Coastguard Worker} 356*333d2b36SAndroid Build Coastguard Worker 357*333d2b36SAndroid Build Coastguard Workerfunc (benchmark *benchmarkDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 358*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, benchmark.binaryDecorator) 359*333d2b36SAndroid Build Coastguard Worker entries.Class = "NATIVE_TESTS" 360*333d2b36SAndroid Build Coastguard Worker if len(benchmark.Properties.Test_suites) > 0 { 361*333d2b36SAndroid Build Coastguard Worker entries.AddCompatibilityTestSuites(benchmark.Properties.Test_suites...) 362*333d2b36SAndroid Build Coastguard Worker } 363*333d2b36SAndroid Build Coastguard Worker if benchmark.testConfig != nil { 364*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_FULL_TEST_CONFIG", benchmark.testConfig.String()) 365*333d2b36SAndroid Build Coastguard Worker } 366*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_NATIVE_BENCHMARK", true) 367*333d2b36SAndroid Build Coastguard Worker if !BoolDefault(benchmark.Properties.Auto_gen_config, true) { 368*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true) 369*333d2b36SAndroid Build Coastguard Worker } 370*333d2b36SAndroid Build Coastguard Worker} 371*333d2b36SAndroid Build Coastguard Worker 372*333d2b36SAndroid Build Coastguard Workerfunc (test *testBinary) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 373*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, test.binaryDecorator) 374*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, test.testDecorator) 375*333d2b36SAndroid Build Coastguard Worker 376*333d2b36SAndroid Build Coastguard Worker entries.Class = "NATIVE_TESTS" 377*333d2b36SAndroid Build Coastguard Worker if test.testConfig != nil { 378*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_FULL_TEST_CONFIG", test.testConfig.String()) 379*333d2b36SAndroid Build Coastguard Worker } 380*333d2b36SAndroid Build Coastguard Worker if !BoolDefault(test.Properties.Auto_gen_config, true) { 381*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true) 382*333d2b36SAndroid Build Coastguard Worker } 383*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_TEST_MAINLINE_MODULES", test.Properties.Test_mainline_modules...) 384*333d2b36SAndroid Build Coastguard Worker 385*333d2b36SAndroid Build Coastguard Worker entries.SetBoolIfTrue("LOCAL_COMPATIBILITY_PER_TESTCASE_DIRECTORY", Bool(test.Properties.Per_testcase_directory)) 386*333d2b36SAndroid Build Coastguard Worker if len(test.Properties.Data_bins) > 0 { 387*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_TEST_DATA_BINS", test.Properties.Data_bins...) 388*333d2b36SAndroid Build Coastguard Worker } 389*333d2b36SAndroid Build Coastguard Worker 390*333d2b36SAndroid Build Coastguard Worker test.Properties.Test_options.CommonTestOptions.SetAndroidMkInfoEntries(entries) 391*333d2b36SAndroid Build Coastguard Worker 392*333d2b36SAndroid Build Coastguard Worker androidMkWriteExtraTestConfigs(test.extraTestConfigs, entries) 393*333d2b36SAndroid Build Coastguard Worker} 394*333d2b36SAndroid Build Coastguard Worker 395*333d2b36SAndroid Build Coastguard Workerfunc (fuzz *fuzzBinary) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 396*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, fuzz.binaryDecorator) 397*333d2b36SAndroid Build Coastguard Worker 398*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_IS_FUZZ_TARGET", true) 399*333d2b36SAndroid Build Coastguard Worker if fuzz.installedSharedDeps != nil { 400*333d2b36SAndroid Build Coastguard Worker // TOOD: move to install dep 401*333d2b36SAndroid Build Coastguard Worker entries.AddStrings("LOCAL_FUZZ_INSTALLED_SHARED_DEPS", fuzz.installedSharedDeps...) 402*333d2b36SAndroid Build Coastguard Worker } 403*333d2b36SAndroid Build Coastguard Worker} 404*333d2b36SAndroid Build Coastguard Worker 405*333d2b36SAndroid Build Coastguard Workerfunc (test *testLibrary) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 406*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, test.libraryDecorator) 407*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, test.testDecorator) 408*333d2b36SAndroid Build Coastguard Worker} 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Workerfunc (installer *baseInstaller) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 411*333d2b36SAndroid Build Coastguard Worker if installer.path == (android.InstallPath{}) { 412*333d2b36SAndroid Build Coastguard Worker return 413*333d2b36SAndroid Build Coastguard Worker } 414*333d2b36SAndroid Build Coastguard Worker 415*333d2b36SAndroid Build Coastguard Worker path, file := filepath.Split(installer.path.String()) 416*333d2b36SAndroid Build Coastguard Worker stem, suffix, _ := android.SplitFileExt(file) 417*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_SUFFIX", suffix) 418*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_PATH", path) 419*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_STEM", stem) 420*333d2b36SAndroid Build Coastguard Worker} 421*333d2b36SAndroid Build Coastguard Worker 422*333d2b36SAndroid Build Coastguard Workerfunc (c *stubDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 423*333d2b36SAndroid Build Coastguard Worker entries.SubName = ndkLibrarySuffix + "." + c.apiLevel.String() 424*333d2b36SAndroid Build Coastguard Worker entries.Class = "SHARED_LIBRARIES" 425*333d2b36SAndroid Build Coastguard Worker 426*333d2b36SAndroid Build Coastguard Worker if !c.buildStubs() { 427*333d2b36SAndroid Build Coastguard Worker entries.Disabled = true 428*333d2b36SAndroid Build Coastguard Worker return 429*333d2b36SAndroid Build Coastguard Worker } 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Worker path, file := filepath.Split(c.installPath.String()) 432*333d2b36SAndroid Build Coastguard Worker stem, suffix, _ := android.SplitFileExt(file) 433*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_SUFFIX", suffix) 434*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_PATH", path) 435*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_STEM", stem) 436*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_NO_NOTICE_FILE", true) 437*333d2b36SAndroid Build Coastguard Worker if c.parsedCoverageXmlPath.String() != "" { 438*333d2b36SAndroid Build Coastguard Worker entries.SetString("SOONG_NDK_API_XML", "$(SOONG_NDK_API_XML) "+c.parsedCoverageXmlPath.String()) 439*333d2b36SAndroid Build Coastguard Worker } 440*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) // Stubs should not be installed 441*333d2b36SAndroid Build Coastguard Worker} 442*333d2b36SAndroid Build Coastguard Worker 443*333d2b36SAndroid Build Coastguard Workerfunc (c *vndkPrebuiltLibraryDecorator) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 444*333d2b36SAndroid Build Coastguard Worker entries.Class = "SHARED_LIBRARIES" 445*333d2b36SAndroid Build Coastguard Worker 446*333d2b36SAndroid Build Coastguard Worker entries.SubName = c.androidMkSuffix 447*333d2b36SAndroid Build Coastguard Worker 448*333d2b36SAndroid Build Coastguard Worker c.libraryDecorator.androidMkWriteExportedFlags(entries) 449*333d2b36SAndroid Build Coastguard Worker 450*333d2b36SAndroid Build Coastguard Worker // Specifying stem is to pass check_elf_files when vendor modules link against vndk prebuilt. 451*333d2b36SAndroid Build Coastguard Worker // We can't use install path because VNDKs are not installed. Instead, Srcs is directly used. 452*333d2b36SAndroid Build Coastguard Worker _, file := filepath.Split(c.properties.Srcs[0]) 453*333d2b36SAndroid Build Coastguard Worker stem, suffix, ext := android.SplitFileExt(file) 454*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext) 455*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_SUFFIX", suffix) 456*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_STEM", stem) 457*333d2b36SAndroid Build Coastguard Worker 458*333d2b36SAndroid Build Coastguard Worker if c.tocFile.Valid() { 459*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_SOONG_TOC", c.tocFile.String()) 460*333d2b36SAndroid Build Coastguard Worker } 461*333d2b36SAndroid Build Coastguard Worker 462*333d2b36SAndroid Build Coastguard Worker // VNDK libraries available to vendor are not installed because 463*333d2b36SAndroid Build Coastguard Worker // they are packaged in VNDK APEX and installed by APEX packages (apex/apex.go) 464*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) 465*333d2b36SAndroid Build Coastguard Worker} 466*333d2b36SAndroid Build Coastguard Worker 467*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLinker) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 468*333d2b36SAndroid Build Coastguard Worker if p.properties.Check_elf_files != nil { 469*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_CHECK_ELF_FILES", *p.properties.Check_elf_files) 470*333d2b36SAndroid Build Coastguard Worker } else { 471*333d2b36SAndroid Build Coastguard Worker // soong_cc_rust_prebuilt.mk does not include check_elf_file.mk by default 472*333d2b36SAndroid Build Coastguard Worker // because cc_library_shared and cc_binary use soong_cc_rust_prebuilt.mk as well. 473*333d2b36SAndroid Build Coastguard Worker // In order to turn on prebuilt ABI checker, set `LOCAL_CHECK_ELF_FILES` to 474*333d2b36SAndroid Build Coastguard Worker // true if `p.properties.Check_elf_files` is not specified. 475*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_CHECK_ELF_FILES", true) 476*333d2b36SAndroid Build Coastguard Worker } 477*333d2b36SAndroid Build Coastguard Worker} 478*333d2b36SAndroid Build Coastguard Worker 479*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 480*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, p.libraryDecorator) 481*333d2b36SAndroid Build Coastguard Worker if p.shared() { 482*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, &p.prebuiltLinker) 483*333d2b36SAndroid Build Coastguard Worker androidMkWritePrebuiltOptions(p.baseLinker, entries) 484*333d2b36SAndroid Build Coastguard Worker } 485*333d2b36SAndroid Build Coastguard Worker} 486*333d2b36SAndroid Build Coastguard Worker 487*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltBinaryLinker) prepareAndroidMKProviderInfo(config android.Config, ctx AndroidMkContext, entries *android.AndroidMkInfo) { 488*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, p.binaryDecorator) 489*333d2b36SAndroid Build Coastguard Worker ctx.subAndroidMk(config, entries, &p.prebuiltLinker) 490*333d2b36SAndroid Build Coastguard Worker androidMkWritePrebuiltOptions(p.baseLinker, entries) 491*333d2b36SAndroid Build Coastguard Worker} 492*333d2b36SAndroid Build Coastguard Worker 493*333d2b36SAndroid Build Coastguard Workerfunc androidMkWritePrebuiltOptions(linker *baseLinker, entries *android.AndroidMkInfo) { 494*333d2b36SAndroid Build Coastguard Worker allow := linker.Properties.Allow_undefined_symbols 495*333d2b36SAndroid Build Coastguard Worker if allow != nil { 496*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_ALLOW_UNDEFINED_SYMBOLS", *allow) 497*333d2b36SAndroid Build Coastguard Worker } 498*333d2b36SAndroid Build Coastguard Worker ignore := linker.Properties.Ignore_max_page_size 499*333d2b36SAndroid Build Coastguard Worker if ignore != nil { 500*333d2b36SAndroid Build Coastguard Worker entries.SetBool("LOCAL_IGNORE_MAX_PAGE_SIZE", *ignore) 501*333d2b36SAndroid Build Coastguard Worker } 502*333d2b36SAndroid Build Coastguard Worker} 503