1// Copyright 2015 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package cc 16 17import ( 18 "fmt" 19 "io" 20 "path/filepath" 21 "strings" 22 23 "android/soong/android" 24) 25 26var ( 27 nativeBridgeSuffix = ".native_bridge" 28 productSuffix = ".product" 29 VendorSuffix = ".vendor" 30 ramdiskSuffix = ".ramdisk" 31 VendorRamdiskSuffix = ".vendor_ramdisk" 32 recoverySuffix = ".recovery" 33 sdkSuffix = ".sdk" 34) 35 36type AndroidMkContext interface { 37 BaseModuleName() string 38 Target() android.Target 39 subAndroidMk(*android.AndroidMkEntries, interface{}) 40 Arch() android.Arch 41 Os() android.OsType 42 Host() bool 43 UseVndk() bool 44 VndkVersion() string 45 static() bool 46 InRamdisk() bool 47 InVendorRamdisk() bool 48 InRecovery() bool 49 NotInPlatform() bool 50} 51 52type subAndroidMkProvider interface { 53 AndroidMkEntries(AndroidMkContext, *android.AndroidMkEntries) 54} 55 56func (c *Module) subAndroidMk(entries *android.AndroidMkEntries, obj interface{}) { 57 if c.subAndroidMkOnce == nil { 58 c.subAndroidMkOnce = make(map[subAndroidMkProvider]bool) 59 } 60 if androidmk, ok := obj.(subAndroidMkProvider); ok { 61 if !c.subAndroidMkOnce[androidmk] { 62 c.subAndroidMkOnce[androidmk] = true 63 androidmk.AndroidMkEntries(c, entries) 64 } 65 } 66} 67 68func (c *Module) AndroidMkEntries() []android.AndroidMkEntries { 69 if c.hideApexVariantFromMake || c.Properties.HideFromMake { 70 return []android.AndroidMkEntries{{ 71 Disabled: true, 72 }} 73 } 74 75 entries := android.AndroidMkEntries{ 76 OutputFile: c.outputFile, 77 // TODO(jiyong): add the APEXes providing shared libs to the required 78 // modules Currently, adding c.Properties.ApexesProvidingSharedLibs is 79 // causing multiple ART APEXes (com.android.art and com.android.art.debug) 80 // to be installed. And this is breaking some older devices (like marlin) 81 // where system.img is small. 82 Required: c.Properties.AndroidMkRuntimeLibs, 83 Include: "$(BUILD_SYSTEM)/soong_cc_prebuilt.mk", 84 85 ExtraEntries: []android.AndroidMkExtraEntriesFunc{ 86 func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 87 if len(c.Properties.Logtags) > 0 { 88 entries.AddStrings("LOCAL_LOGTAGS_FILES", c.Properties.Logtags...) 89 } 90 // Note: Pass the exact value of AndroidMkSystemSharedLibs to the Make 91 // world, even if it is an empty list. In the Make world, 92 // LOCAL_SYSTEM_SHARED_LIBRARIES defaults to "none", which is expanded 93 // to the default list of system shared libs by the build system. 94 // Soong computes the exact list of system shared libs, so we have to 95 // override the default value when the list of libs is actually empty. 96 entries.SetString("LOCAL_SYSTEM_SHARED_LIBRARIES", strings.Join(c.Properties.AndroidMkSystemSharedLibs, " ")) 97 if len(c.Properties.AndroidMkSharedLibs) > 0 { 98 entries.AddStrings("LOCAL_SHARED_LIBRARIES", c.Properties.AndroidMkSharedLibs...) 99 } 100 if len(c.Properties.AndroidMkStaticLibs) > 0 { 101 entries.AddStrings("LOCAL_STATIC_LIBRARIES", c.Properties.AndroidMkStaticLibs...) 102 } 103 if len(c.Properties.AndroidMkWholeStaticLibs) > 0 { 104 entries.AddStrings("LOCAL_WHOLE_STATIC_LIBRARIES", c.Properties.AndroidMkWholeStaticLibs...) 105 } 106 if len(c.Properties.AndroidMkHeaderLibs) > 0 { 107 entries.AddStrings("LOCAL_HEADER_LIBRARIES", c.Properties.AndroidMkHeaderLibs...) 108 } 109 entries.SetString("LOCAL_SOONG_LINK_TYPE", c.makeLinkType) 110 if c.UseVndk() { 111 entries.SetBool("LOCAL_USE_VNDK", true) 112 if c.IsVndk() && !c.static() { 113 entries.SetString("LOCAL_SOONG_VNDK_VERSION", c.VndkVersion()) 114 // VNDK libraries available to vendor are not installed because 115 // they are packaged in VNDK APEX and installed by APEX packages (apex/apex.go) 116 if !c.IsVndkExt() { 117 entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) 118 } 119 } 120 } 121 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake { 122 // Make the SDK variant uninstallable so that there are not two rules to install 123 // to the same location. 124 entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) 125 // Add the unsuffixed name to SOONG_SDK_VARIANT_MODULES so that Make can rewrite 126 // dependencies to the .sdk suffix when building a module that uses the SDK. 127 entries.SetString("SOONG_SDK_VARIANT_MODULES", 128 "$(SOONG_SDK_VARIANT_MODULES) $(patsubst %.sdk,%,$(LOCAL_MODULE))") 129 } 130 }, 131 }, 132 ExtraFooters: []android.AndroidMkExtraFootersFunc{ 133 func(w io.Writer, name, prefix, moduleDir string) { 134 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake && 135 c.CcLibraryInterface() && c.Shared() { 136 // Using the SDK variant as a JNI library needs a copy of the .so that 137 // is not named .sdk.so so that it can be packaged into the APK with 138 // the right name. 139 fmt.Fprintln(w, "$(eval $(call copy-one-file,", 140 "$(LOCAL_BUILT_MODULE),", 141 "$(patsubst %.sdk.so,%.so,$(LOCAL_BUILT_MODULE))))") 142 } 143 }, 144 }, 145 } 146 147 for _, feature := range c.features { 148 c.subAndroidMk(&entries, feature) 149 } 150 151 c.subAndroidMk(&entries, c.compiler) 152 c.subAndroidMk(&entries, c.linker) 153 if c.sanitize != nil { 154 c.subAndroidMk(&entries, c.sanitize) 155 } 156 c.subAndroidMk(&entries, c.installer) 157 158 entries.SubName += c.Properties.SubName 159 160 return []android.AndroidMkEntries{entries} 161} 162 163func androidMkWriteExtraTestConfigs(extraTestConfigs android.Paths, entries *android.AndroidMkEntries) { 164 if len(extraTestConfigs) > 0 { 165 entries.ExtraEntries = append(entries.ExtraEntries, 166 func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 167 entries.AddStrings("LOCAL_EXTRA_FULL_TEST_CONFIGS", extraTestConfigs.Strings()...) 168 }) 169 } 170} 171 172func AndroidMkWriteTestData(data []android.DataPath, entries *android.AndroidMkEntries) { 173 testFiles := android.AndroidMkDataPaths(data) 174 if len(testFiles) > 0 { 175 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 176 entries.AddStrings("LOCAL_TEST_DATA", testFiles...) 177 }) 178 } 179} 180 181func makeOverrideModuleNames(ctx AndroidMkContext, overrides []string) []string { 182 if ctx.Target().NativeBridge == android.NativeBridgeEnabled { 183 var result []string 184 for _, override := range overrides { 185 result = append(result, override+nativeBridgeSuffix) 186 } 187 return result 188 } 189 190 return overrides 191} 192 193func (library *libraryDecorator) androidMkWriteExportedFlags(entries *android.AndroidMkEntries) { 194 var exportedFlags []string 195 var includeDirs android.Paths 196 var systemIncludeDirs android.Paths 197 var exportedDeps android.Paths 198 199 if library.flagExporterInfo != nil { 200 exportedFlags = library.flagExporterInfo.Flags 201 includeDirs = library.flagExporterInfo.IncludeDirs 202 systemIncludeDirs = library.flagExporterInfo.SystemIncludeDirs 203 exportedDeps = library.flagExporterInfo.Deps 204 } else { 205 exportedFlags = library.flagExporter.flags 206 includeDirs = library.flagExporter.dirs 207 systemIncludeDirs = library.flagExporter.systemDirs 208 exportedDeps = library.flagExporter.deps 209 } 210 for _, dir := range includeDirs { 211 exportedFlags = append(exportedFlags, "-I"+dir.String()) 212 } 213 for _, dir := range systemIncludeDirs { 214 exportedFlags = append(exportedFlags, "-isystem "+dir.String()) 215 } 216 if len(exportedFlags) > 0 { 217 entries.AddStrings("LOCAL_EXPORT_CFLAGS", exportedFlags...) 218 } 219 if len(exportedDeps) > 0 { 220 entries.AddStrings("LOCAL_EXPORT_C_INCLUDE_DEPS", exportedDeps.Strings()...) 221 } 222} 223 224func (library *libraryDecorator) androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries *android.AndroidMkEntries) { 225 if library.sAbiDiff.Valid() && !library.static() { 226 entries.AddStrings("LOCAL_ADDITIONAL_DEPENDENCIES", library.sAbiDiff.String()) 227 } 228} 229 230// TODO(ccross): remove this once apex/androidmk.go is converted to AndroidMkEntries 231func (library *libraryDecorator) androidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) { 232 if library.sAbiDiff.Valid() && !library.static() { 233 fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES +=", library.sAbiDiff.String()) 234 } 235} 236 237func (library *libraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 238 if library.static() { 239 entries.Class = "STATIC_LIBRARIES" 240 } else if library.shared() { 241 entries.Class = "SHARED_LIBRARIES" 242 entries.ExtraEntries = append(entries.ExtraEntries, func(_ android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 243 entries.SetString("LOCAL_SOONG_TOC", library.toc().String()) 244 if !library.buildStubs() { 245 entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", library.unstrippedOutputFile.String()) 246 } 247 if len(library.Properties.Overrides) > 0 { 248 entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, library.Properties.Overrides), " ")) 249 } 250 if len(library.postInstallCmds) > 0 { 251 entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(library.postInstallCmds, "&& ")) 252 } 253 }) 254 } else if library.header() { 255 entries.Class = "HEADER_LIBRARIES" 256 } 257 258 if library.distFile != nil { 259 entries.DistFiles = android.MakeDefaultDistFiles(library.distFile) 260 } 261 262 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 263 library.androidMkWriteExportedFlags(entries) 264 library.androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries) 265 266 _, _, ext := android.SplitFileExt(entries.OutputFile.Path().Base()) 267 268 entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext) 269 270 if library.coverageOutputFile.Valid() { 271 entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", library.coverageOutputFile.String()) 272 } 273 274 if library.useCoreVariant { 275 entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) 276 entries.SetBool("LOCAL_NO_NOTICE_FILE", true) 277 entries.SetBool("LOCAL_VNDK_DEPEND_ON_CORE_VARIANT", true) 278 } 279 if library.checkSameCoreVariant { 280 entries.SetBool("LOCAL_CHECK_SAME_VNDK_VARIANTS", true) 281 } 282 }) 283 284 if library.shared() && !library.buildStubs() { 285 ctx.subAndroidMk(entries, library.baseInstaller) 286 } else { 287 if library.buildStubs() && library.stubsVersion() != "" { 288 entries.SubName = "." + library.stubsVersion() 289 } 290 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 291 // library.makeUninstallable() depends on this to bypass HideFromMake() for 292 // static libraries. 293 entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) 294 if library.buildStubs() { 295 entries.SetBool("LOCAL_NO_NOTICE_FILE", true) 296 } 297 }) 298 } 299 // If a library providing a stub is included in an APEX, the private APIs of the library 300 // is accessible only inside the APEX. From outside of the APEX, clients can only use the 301 // public APIs via the stub. To enforce this, the (latest version of the) stub gets the 302 // name of the library. The impl library instead gets the `.bootstrap` suffix to so that 303 // they can be exceptionally used directly when APEXes are not available (e.g. during the 304 // very early stage in the boot process). 305 if len(library.Properties.Stubs.Versions) > 0 && !ctx.Host() && ctx.NotInPlatform() && 306 !ctx.InRamdisk() && !ctx.InVendorRamdisk() && !ctx.InRecovery() && !ctx.UseVndk() && !ctx.static() { 307 if library.buildStubs() && library.isLatestStubVersion() { 308 entries.SubName = "" 309 } 310 if !library.buildStubs() { 311 entries.SubName = ".bootstrap" 312 } 313 } 314} 315 316func (object *objectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 317 entries.Class = "STATIC_LIBRARIES" 318 entries.ExtraFooters = append(entries.ExtraFooters, 319 func(w io.Writer, name, prefix, moduleDir string) { 320 out := entries.OutputFile.Path() 321 varname := fmt.Sprintf("SOONG_%sOBJECT_%s%s", prefix, name, entries.SubName) 322 323 fmt.Fprintf(w, "\n%s := %s\n", varname, out.String()) 324 fmt.Fprintln(w, ".KATI_READONLY: "+varname) 325 }) 326} 327 328func (binary *binaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 329 ctx.subAndroidMk(entries, binary.baseInstaller) 330 331 entries.Class = "EXECUTABLES" 332 entries.DistFiles = binary.distFiles 333 entries.ExtraEntries = append(entries.ExtraEntries, func(_ android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 334 entries.SetString("LOCAL_SOONG_UNSTRIPPED_BINARY", binary.unstrippedOutputFile.String()) 335 if len(binary.symlinks) > 0 { 336 entries.AddStrings("LOCAL_MODULE_SYMLINKS", binary.symlinks...) 337 } 338 339 if binary.coverageOutputFile.Valid() { 340 entries.SetString("LOCAL_PREBUILT_COVERAGE_ARCHIVE", binary.coverageOutputFile.String()) 341 } 342 343 if len(binary.Properties.Overrides) > 0 { 344 entries.SetString("LOCAL_OVERRIDES_MODULES", strings.Join(makeOverrideModuleNames(ctx, binary.Properties.Overrides), " ")) 345 } 346 if len(binary.postInstallCmds) > 0 { 347 entries.SetString("LOCAL_POST_INSTALL_CMD", strings.Join(binary.postInstallCmds, "&& ")) 348 } 349 }) 350} 351 352func (benchmark *benchmarkDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 353 ctx.subAndroidMk(entries, benchmark.binaryDecorator) 354 entries.Class = "NATIVE_TESTS" 355 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 356 if len(benchmark.Properties.Test_suites) > 0 { 357 entries.AddCompatibilityTestSuites(benchmark.Properties.Test_suites...) 358 } 359 if benchmark.testConfig != nil { 360 entries.SetString("LOCAL_FULL_TEST_CONFIG", benchmark.testConfig.String()) 361 } 362 entries.SetBool("LOCAL_NATIVE_BENCHMARK", true) 363 if !BoolDefault(benchmark.Properties.Auto_gen_config, true) { 364 entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true) 365 } 366 }) 367 dataPaths := []android.DataPath{} 368 for _, srcPath := range benchmark.data { 369 dataPaths = append(dataPaths, android.DataPath{SrcPath: srcPath}) 370 } 371 AndroidMkWriteTestData(dataPaths, entries) 372} 373 374func (test *testBinary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 375 ctx.subAndroidMk(entries, test.binaryDecorator) 376 entries.Class = "NATIVE_TESTS" 377 if Bool(test.Properties.Test_per_src) { 378 entries.SubName = "_" + String(test.binaryDecorator.Properties.Stem) 379 } 380 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 381 if len(test.Properties.Test_suites) > 0 { 382 entries.AddCompatibilityTestSuites(test.Properties.Test_suites...) 383 } 384 if test.testConfig != nil { 385 entries.SetString("LOCAL_FULL_TEST_CONFIG", test.testConfig.String()) 386 } 387 if !BoolDefault(test.Properties.Auto_gen_config, true) { 388 entries.SetBool("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", true) 389 } 390 entries.AddStrings("LOCAL_TEST_MAINLINE_MODULES", test.Properties.Test_mainline_modules...) 391 if Bool(test.Properties.Test_options.Unit_test) { 392 entries.SetBool("LOCAL_IS_UNIT_TEST", true) 393 } 394 }) 395 396 AndroidMkWriteTestData(test.data, entries) 397 androidMkWriteExtraTestConfigs(test.extraTestConfigs, entries) 398} 399 400func (fuzz *fuzzBinary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 401 ctx.subAndroidMk(entries, fuzz.binaryDecorator) 402 403 var fuzzFiles []string 404 for _, d := range fuzz.corpus { 405 fuzzFiles = append(fuzzFiles, 406 filepath.Dir(fuzz.corpusIntermediateDir.String())+":corpus/"+d.Base()) 407 } 408 409 for _, d := range fuzz.data { 410 fuzzFiles = append(fuzzFiles, 411 filepath.Dir(fuzz.dataIntermediateDir.String())+":data/"+d.Rel()) 412 } 413 414 if fuzz.dictionary != nil { 415 fuzzFiles = append(fuzzFiles, 416 filepath.Dir(fuzz.dictionary.String())+":"+fuzz.dictionary.Base()) 417 } 418 419 if fuzz.config != nil { 420 fuzzFiles = append(fuzzFiles, 421 filepath.Dir(fuzz.config.String())+":config.json") 422 } 423 424 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 425 entries.SetBool("LOCAL_IS_FUZZ_TARGET", true) 426 if len(fuzzFiles) > 0 { 427 entries.AddStrings("LOCAL_TEST_DATA", fuzzFiles...) 428 } 429 if fuzz.installedSharedDeps != nil { 430 entries.AddStrings("LOCAL_FUZZ_INSTALLED_SHARED_DEPS", fuzz.installedSharedDeps...) 431 } 432 }) 433} 434 435func (test *testLibrary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 436 ctx.subAndroidMk(entries, test.libraryDecorator) 437} 438 439func (library *toolchainLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 440 entries.Class = "STATIC_LIBRARIES" 441 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 442 _, suffix, _ := android.SplitFileExt(entries.OutputFile.Path().Base()) 443 entries.SetString("LOCAL_MODULE_SUFFIX", suffix) 444 }) 445} 446 447func (installer *baseInstaller) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 448 if installer.path == (android.InstallPath{}) { 449 return 450 } 451 // Soong installation is only supported for host modules. Have Make 452 // installation trigger Soong installation. 453 if ctx.Target().Os.Class == android.Host { 454 entries.OutputFile = android.OptionalPathForPath(installer.path) 455 } 456 457 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 458 path, file := filepath.Split(installer.path.ToMakePath().String()) 459 stem, suffix, _ := android.SplitFileExt(file) 460 entries.SetString("LOCAL_MODULE_SUFFIX", suffix) 461 entries.SetString("LOCAL_MODULE_PATH", path) 462 entries.SetString("LOCAL_MODULE_STEM", stem) 463 }) 464} 465 466func (c *stubDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 467 entries.SubName = ndkLibrarySuffix + "." + c.apiLevel.String() 468 entries.Class = "SHARED_LIBRARIES" 469 470 if !c.buildStubs() { 471 entries.Disabled = true 472 return 473 } 474 475 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 476 path, file := filepath.Split(c.installPath.String()) 477 stem, suffix, _ := android.SplitFileExt(file) 478 entries.SetString("LOCAL_MODULE_SUFFIX", suffix) 479 entries.SetString("LOCAL_MODULE_PATH", path) 480 entries.SetString("LOCAL_MODULE_STEM", stem) 481 entries.SetBool("LOCAL_NO_NOTICE_FILE", true) 482 if c.parsedCoverageXmlPath.String() != "" { 483 entries.SetString("SOONG_NDK_API_XML", "$(SOONG_NDK_API_XML) "+c.parsedCoverageXmlPath.String()) 484 } 485 }) 486} 487 488func (c *vndkPrebuiltLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 489 entries.Class = "SHARED_LIBRARIES" 490 491 entries.SubName = c.androidMkSuffix 492 493 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 494 c.libraryDecorator.androidMkWriteExportedFlags(entries) 495 496 // Specifying stem is to pass check_elf_files when vendor modules link against vndk prebuilt. 497 // We can't use install path because VNDKs are not installed. Instead, Srcs is directly used. 498 _, file := filepath.Split(c.properties.Srcs[0]) 499 stem, suffix, ext := android.SplitFileExt(file) 500 entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext) 501 entries.SetString("LOCAL_MODULE_SUFFIX", suffix) 502 entries.SetString("LOCAL_MODULE_STEM", stem) 503 504 if c.tocFile.Valid() { 505 entries.SetString("LOCAL_SOONG_TOC", c.tocFile.String()) 506 } 507 508 // VNDK libraries available to vendor are not installed because 509 // they are packaged in VNDK APEX and installed by APEX packages (apex/apex.go) 510 entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) 511 }) 512} 513 514func (c *snapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 515 // Each vendor snapshot is exported to androidMk only when BOARD_VNDK_VERSION != current 516 // and the version of the prebuilt is same as BOARD_VNDK_VERSION. 517 if c.shared() { 518 entries.Class = "SHARED_LIBRARIES" 519 } else if c.static() { 520 entries.Class = "STATIC_LIBRARIES" 521 } else if c.header() { 522 entries.Class = "HEADER_LIBRARIES" 523 } 524 525 entries.SubName = "" 526 527 if c.sanitizerProperties.CfiEnabled { 528 entries.SubName += ".cfi" 529 } 530 531 entries.SubName += c.baseProperties.Androidmk_suffix 532 533 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 534 c.libraryDecorator.androidMkWriteExportedFlags(entries) 535 536 if c.shared() || c.static() { 537 path, file := filepath.Split(c.path.ToMakePath().String()) 538 stem, suffix, ext := android.SplitFileExt(file) 539 entries.SetString("LOCAL_BUILT_MODULE_STEM", "$(LOCAL_MODULE)"+ext) 540 entries.SetString("LOCAL_MODULE_SUFFIX", suffix) 541 entries.SetString("LOCAL_MODULE_STEM", stem) 542 if c.shared() { 543 entries.SetString("LOCAL_MODULE_PATH", path) 544 } 545 if c.tocFile.Valid() { 546 entries.SetString("LOCAL_SOONG_TOC", c.tocFile.String()) 547 } 548 } 549 550 if !c.shared() { // static or header 551 entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) 552 } 553 }) 554} 555 556func (c *snapshotBinaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 557 entries.Class = "EXECUTABLES" 558 entries.SubName = c.baseProperties.Androidmk_suffix 559 560 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 561 entries.AddStrings("LOCAL_MODULE_SYMLINKS", c.Properties.Symlinks...) 562 }) 563} 564 565func (c *snapshotObjectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 566 entries.Class = "STATIC_LIBRARIES" 567 entries.SubName = c.baseProperties.Androidmk_suffix 568 569 entries.ExtraFooters = append(entries.ExtraFooters, 570 func(w io.Writer, name, prefix, moduleDir string) { 571 out := entries.OutputFile.Path() 572 varname := fmt.Sprintf("SOONG_%sOBJECT_%s%s", prefix, name, entries.SubName) 573 574 fmt.Fprintf(w, "\n%s := %s\n", varname, out.String()) 575 fmt.Fprintln(w, ".KATI_READONLY: "+varname) 576 }) 577} 578 579func (c *ndkPrebuiltStlLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 580 entries.Class = "SHARED_LIBRARIES" 581} 582 583func (p *prebuiltLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 584 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 585 if p.properties.Check_elf_files != nil { 586 entries.SetBool("LOCAL_CHECK_ELF_FILES", *p.properties.Check_elf_files) 587 } else { 588 // soong_cc_prebuilt.mk does not include check_elf_file.mk by default 589 // because cc_library_shared and cc_binary use soong_cc_prebuilt.mk as well. 590 // In order to turn on prebuilt ABI checker, set `LOCAL_CHECK_ELF_FILES` to 591 // true if `p.properties.Check_elf_files` is not specified. 592 entries.SetBool("LOCAL_CHECK_ELF_FILES", true) 593 } 594 }) 595} 596 597func (p *prebuiltLibraryLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 598 ctx.subAndroidMk(entries, p.libraryDecorator) 599 if p.shared() { 600 ctx.subAndroidMk(entries, &p.prebuiltLinker) 601 androidMkWriteAllowUndefinedSymbols(p.baseLinker, entries) 602 } 603} 604 605func (p *prebuiltBinaryLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { 606 ctx.subAndroidMk(entries, p.binaryDecorator) 607 ctx.subAndroidMk(entries, &p.prebuiltLinker) 608 androidMkWriteAllowUndefinedSymbols(p.baseLinker, entries) 609} 610 611func androidMkWriteAllowUndefinedSymbols(linker *baseLinker, entries *android.AndroidMkEntries) { 612 allow := linker.Properties.Allow_undefined_symbols 613 if allow != nil { 614 entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 615 entries.SetBool("LOCAL_ALLOW_UNDEFINED_SYMBOLS", *allow) 616 }) 617 } 618} 619