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 17// This file contains the module types for compiling C/C++ for Android, and converts the properties 18// into the flags and filenames necessary to pass to the compiler. The final creation of the rules 19// is handled in builder.go 20 21import ( 22 "fmt" 23 "io" 24 "strconv" 25 "strings" 26 27 "github.com/google/blueprint" 28 "github.com/google/blueprint/proptools" 29 30 "android/soong/android" 31 "android/soong/bazel/cquery" 32 "android/soong/cc/config" 33 "android/soong/fuzz" 34 "android/soong/genrule" 35 "android/soong/multitree" 36 "android/soong/snapshot" 37) 38 39func init() { 40 RegisterCCBuildComponents(android.InitRegistrationContext) 41 42 pctx.Import("android/soong/cc/config") 43} 44 45func RegisterCCBuildComponents(ctx android.RegistrationContext) { 46 ctx.RegisterModuleType("cc_defaults", defaultsFactory) 47 48 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { 49 ctx.BottomUp("sdk", sdkMutator).Parallel() 50 ctx.BottomUp("vndk", VndkMutator).Parallel() 51 ctx.BottomUp("link", LinkageMutator).Parallel() 52 ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel() 53 ctx.BottomUp("version", versionMutator).Parallel() 54 ctx.BottomUp("begin", BeginMutator).Parallel() 55 ctx.BottomUp("fdo_profile", fdoProfileMutator) 56 }) 57 58 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { 59 for _, san := range Sanitizers { 60 san.registerMutators(ctx) 61 } 62 63 ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel() 64 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel() 65 66 ctx.TopDown("fuzz_deps", fuzzMutatorDeps) 67 68 ctx.BottomUp("coverage", coverageMutator).Parallel() 69 70 ctx.TopDown("afdo_deps", afdoDepsMutator) 71 ctx.BottomUp("afdo", afdoMutator).Parallel() 72 73 ctx.TopDown("lto_deps", ltoDepsMutator) 74 ctx.BottomUp("lto", ltoMutator).Parallel() 75 76 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel() 77 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel() 78 }) 79 80 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) { 81 // sabi mutator needs to be run after apex mutator finishes. 82 ctx.TopDown("sabi_deps", sabiDepsMutator) 83 }) 84 85 ctx.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory) 86} 87 88// Deps is a struct containing module names of dependencies, separated by the kind of dependency. 89// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency 90// edges to these modules. 91// This object is constructed in DepsMutator, by calling to various module delegates to set 92// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific 93// dependencies. 94// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()` 95// (or its sibling methods) to set real dependencies on the given modules. 96type Deps struct { 97 SharedLibs, LateSharedLibs []string 98 StaticLibs, LateStaticLibs, WholeStaticLibs []string 99 HeaderLibs []string 100 RuntimeLibs []string 101 102 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to 103 // prevent automatically exporting symbols. 104 UnexportedStaticLibs []string 105 106 // Used for data dependencies adjacent to tests 107 DataLibs []string 108 DataBins []string 109 110 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py. 111 SystemSharedLibs []string 112 113 // If true, statically link the unwinder into native libraries/binaries. 114 StaticUnwinderIfLegacy bool 115 116 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string 117 118 ObjFiles []string 119 120 GeneratedSources []string 121 GeneratedHeaders []string 122 GeneratedDeps []string 123 124 ReexportGeneratedHeaders []string 125 126 CrtBegin, CrtEnd []string 127 128 // Used for host bionic 129 DynamicLinker string 130 131 // List of libs that need to be excluded for APEX variant 132 ExcludeLibsForApex []string 133} 134 135// PathDeps is a struct containing file paths to dependencies of a module. 136// It's constructed in depsToPath() by traversing the direct dependencies of the current module. 137// It's used to construct flags for various build statements (such as for compiling and linking). 138// It is then passed to module decorator functions responsible for registering build statements 139// (such as `module.compiler.compile()`).` 140type PathDeps struct { 141 // Paths to .so files 142 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths 143 // Paths to the dependencies to use for .so files (.so.toc files) 144 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths 145 // Paths to .a files 146 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths 147 148 // Transitive static library dependencies of static libraries for use in ordering. 149 TranstiveStaticLibrariesForOrdering *android.DepSet 150 151 // Paths to .o files 152 Objs Objects 153 // Paths to .o files in dependencies that provide them. Note that these lists 154 // aren't complete since prebuilt modules don't provide the .o files. 155 StaticLibObjs Objects 156 WholeStaticLibObjs Objects 157 158 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain 159 // the libs from all whole_static_lib dependencies. 160 WholeStaticLibsFromPrebuilts android.Paths 161 162 // Paths to generated source files 163 GeneratedSources android.Paths 164 GeneratedDeps android.Paths 165 166 Flags []string 167 LdFlags []string 168 IncludeDirs android.Paths 169 SystemIncludeDirs android.Paths 170 ReexportedDirs android.Paths 171 ReexportedSystemDirs android.Paths 172 ReexportedFlags []string 173 ReexportedGeneratedHeaders android.Paths 174 ReexportedDeps android.Paths 175 176 // Paths to crt*.o files 177 CrtBegin, CrtEnd android.Paths 178 179 // Path to the dynamic linker binary 180 DynamicLinker android.OptionalPath 181 182 // For Darwin builds, the path to the second architecture's output that should 183 // be combined with this architectures's output into a FAT MachO file. 184 DarwinSecondArchOutput android.OptionalPath 185} 186 187// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module 188// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the 189// command line so they can be overridden by the local module flags). 190type LocalOrGlobalFlags struct { 191 CommonFlags []string // Flags that apply to C, C++, and assembly source files 192 AsFlags []string // Flags that apply to assembly source files 193 YasmFlags []string // Flags that apply to yasm assembly source files 194 CFlags []string // Flags that apply to C and C++ source files 195 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools 196 ConlyFlags []string // Flags that apply to C source files 197 CppFlags []string // Flags that apply to C++ source files 198 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools 199 LdFlags []string // Flags that apply to linker command lines 200} 201 202// Flags contains various types of command line flags (and settings) for use in building build 203// statements related to C++. 204type Flags struct { 205 // Local flags (which individual modules are responsible for). These may override global flags. 206 Local LocalOrGlobalFlags 207 // Global flags (which build system or toolchain is responsible for). 208 Global LocalOrGlobalFlags 209 210 aidlFlags []string // Flags that apply to aidl source files 211 rsFlags []string // Flags that apply to renderscript source files 212 libFlags []string // Flags to add libraries early to the link order 213 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags 214 TidyFlags []string // Flags that apply to clang-tidy 215 SAbiFlags []string // Flags that apply to header-abi-dumper 216 217 // Global include flags that apply to C, C++, and assembly source files 218 // These must be after any module include flags, which will be in CommonFlags. 219 SystemIncludeFlags []string 220 221 Toolchain config.Toolchain 222 Tidy bool // True if ninja .tidy rules should be generated. 223 NeedTidyFiles bool // True if module link should depend on .tidy files 224 GcovCoverage bool // True if coverage files should be generated. 225 SAbiDump bool // True if header abi dumps should be generated. 226 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe 227 228 // The instruction set required for clang ("arm" or "thumb"). 229 RequiredInstructionSet string 230 // The target-device system path to the dynamic linker. 231 DynamicLinker string 232 233 CFlagsDeps android.Paths // Files depended on by compiler flags 234 LdFlagsDeps android.Paths // Files depended on by linker flags 235 236 // True if .s files should be processed with the c preprocessor. 237 AssemblerWithCpp bool 238 239 proto android.ProtoFlags 240 protoC bool // Whether to use C instead of C++ 241 protoOptionsFile bool // Whether to look for a .options file next to the .proto 242 243 Yacc *YaccProperties 244 Lex *LexProperties 245} 246 247// Properties used to compile all C or C++ modules 248type BaseProperties struct { 249 // Deprecated. true is the default, false is invalid. 250 Clang *bool `android:"arch_variant"` 251 252 // The API level that this module is built against. The APIs of this API level will be 253 // visible at build time, but use of any APIs newer than min_sdk_version will render the 254 // module unloadable on older devices. In the future it will be possible to weakly-link new 255 // APIs, making the behavior match Java: such modules will load on older devices, but 256 // calling new APIs on devices that do not support them will result in a crash. 257 // 258 // This property has the same behavior as sdk_version does for Java modules. For those 259 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion 260 // does for Java code. 261 // 262 // In addition, setting this property causes two variants to be built, one for the platform 263 // and one for apps. 264 Sdk_version *string 265 266 // Minimum OS API level supported by this C or C++ module. This property becomes the value 267 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK, 268 // this property is also used to ensure that the min_sdk_version of the containing module is 269 // not older (i.e. less) than this module's min_sdk_version. When not set, this property 270 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks 271 // min_sdk_version of the containing APEX. When the module 272 // is not built for an APEX, "apex_inherit" defaults to sdk_version. 273 Min_sdk_version *string 274 275 // If true, always create an sdk variant and don't create a platform variant. 276 Sdk_variant_only *bool 277 278 AndroidMkSharedLibs []string `blueprint:"mutated"` 279 AndroidMkStaticLibs []string `blueprint:"mutated"` 280 AndroidMkRuntimeLibs []string `blueprint:"mutated"` 281 AndroidMkWholeStaticLibs []string `blueprint:"mutated"` 282 AndroidMkHeaderLibs []string `blueprint:"mutated"` 283 HideFromMake bool `blueprint:"mutated"` 284 PreventInstall bool `blueprint:"mutated"` 285 ApexesProvidingSharedLibs []string `blueprint:"mutated"` 286 287 // Set by DepsMutator. 288 AndroidMkSystemSharedLibs []string `blueprint:"mutated"` 289 290 // The name of the image this module is built for, suffixed with a '.' 291 ImageVariationPrefix string `blueprint:"mutated"` 292 293 // The VNDK version this module is built against. If empty, the module is not 294 // build against the VNDK. 295 VndkVersion string `blueprint:"mutated"` 296 297 // Suffix for the name of Android.mk entries generated by this module 298 SubName string `blueprint:"mutated"` 299 300 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags 301 // file 302 Logtags []string 303 304 // Make this module available when building for ramdisk. 305 // On device without a dedicated recovery partition, the module is only 306 // available after switching root into 307 // /first_stage_ramdisk. To expose the module before switching root, install 308 // the recovery variant instead. 309 Ramdisk_available *bool 310 311 // Make this module available when building for vendor ramdisk. 312 // On device without a dedicated recovery partition, the module is only 313 // available after switching root into 314 // /first_stage_ramdisk. To expose the module before switching root, install 315 // the recovery variant instead. 316 Vendor_ramdisk_available *bool 317 318 // Make this module available when building for recovery 319 Recovery_available *bool 320 321 // Used by imageMutator, set by ImageMutatorBegin() 322 CoreVariantNeeded bool `blueprint:"mutated"` 323 RamdiskVariantNeeded bool `blueprint:"mutated"` 324 VendorRamdiskVariantNeeded bool `blueprint:"mutated"` 325 RecoveryVariantNeeded bool `blueprint:"mutated"` 326 327 // A list of variations for the "image" mutator of the form 328 //<image name> '.' <version char>, for example, 'vendor.S' 329 ExtraVersionedImageVariations []string `blueprint:"mutated"` 330 331 // Allows this module to use non-APEX version of libraries. Useful 332 // for building binaries that are started before APEXes are activated. 333 Bootstrap *bool 334 335 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant. 336 // see soong/cc/config/vndk.go 337 MustUseVendorVariant bool `blueprint:"mutated"` 338 339 // Used by vendor snapshot to record dependencies from snapshot modules. 340 SnapshotSharedLibs []string `blueprint:"mutated"` 341 SnapshotStaticLibs []string `blueprint:"mutated"` 342 SnapshotRuntimeLibs []string `blueprint:"mutated"` 343 344 Installable *bool `android:"arch_variant"` 345 346 // Set by factories of module types that can only be referenced from variants compiled against 347 // the SDK. 348 AlwaysSdk bool `blueprint:"mutated"` 349 350 // Variant is an SDK variant created by sdkMutator 351 IsSdkVariant bool `blueprint:"mutated"` 352 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK 353 // variant to have a ".sdk" suffix. 354 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"` 355 356 // Normally Soong uses the directory structure to decide which modules 357 // should be included (framework) or excluded (non-framework) from the 358 // different snapshots (vendor, recovery, etc.), but this property 359 // allows a partner to exclude a module normally thought of as a 360 // framework module from the vendor snapshot. 361 Exclude_from_vendor_snapshot *bool 362 363 // Normally Soong uses the directory structure to decide which modules 364 // should be included (framework) or excluded (non-framework) from the 365 // different snapshots (vendor, recovery, etc.), but this property 366 // allows a partner to exclude a module normally thought of as a 367 // framework module from the recovery snapshot. 368 Exclude_from_recovery_snapshot *bool 369 370 // List of APEXes that this module has private access to for testing purpose. The module 371 // can depend on libraries that are not exported by the APEXes and use private symbols 372 // from the exported libraries. 373 Test_for []string `android:"arch_variant"` 374 375 Target struct { 376 Platform struct { 377 // List of modules required by the core variant. 378 Required []string `android:"arch_variant"` 379 380 // List of modules not required by the core variant. 381 Exclude_required []string `android:"arch_variant"` 382 } `android:"arch_variant"` 383 384 Recovery struct { 385 // List of modules required by the recovery variant. 386 Required []string `android:"arch_variant"` 387 388 // List of modules not required by the recovery variant. 389 Exclude_required []string `android:"arch_variant"` 390 } `android:"arch_variant"` 391 } `android:"arch_variant"` 392} 393 394type VendorProperties struct { 395 // whether this module should be allowed to be directly depended by other 396 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`. 397 // If set to true, two variants will be built separately, one like 398 // normal, and the other limited to the set of libraries and headers 399 // that are exposed to /vendor modules. 400 // 401 // The vendor variant may be used with a different (newer) /system, 402 // so it shouldn't have any unversioned runtime dependencies, or 403 // make assumptions about the system that may not be true in the 404 // future. 405 // 406 // If set to false, this module becomes inaccessible from /vendor modules. 407 // 408 // The modules with vndk: {enabled: true} must define 'vendor_available' 409 // to 'true'. 410 // 411 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk 412 Vendor_available *bool 413 414 // This is the same as the "vendor_available" except that the install path 415 // of the vendor variant is /odm or /vendor/odm. 416 // By replacing "vendor_available: true" with "odm_available: true", the 417 // module will install its vendor variant to the /odm partition or /vendor/odm. 418 // As the modules with "odm_available: true" still create the vendor variants, 419 // they can link to the other vendor modules as the vendor_available modules do. 420 // Also, the vendor modules can link to odm_available modules. 421 // 422 // It may not be used for VNDK modules. 423 Odm_available *bool 424 425 // whether this module should be allowed to be directly depended by other 426 // modules with `product_specific: true` or `product_available: true`. 427 // If set to true, an additional product variant will be built separately 428 // that is limited to the set of libraries and headers that are exposed to 429 // /product modules. 430 // 431 // The product variant may be used with a different (newer) /system, 432 // so it shouldn't have any unversioned runtime dependencies, or 433 // make assumptions about the system that may not be true in the 434 // future. 435 // 436 // If set to false, this module becomes inaccessible from /product modules. 437 // 438 // Different from the 'vendor_available' property, the modules with 439 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK 440 // library without 'product_available' may not be depended on by any other 441 // modules that has product variants including the product available VNDKs. 442 // 443 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk 444 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set. 445 Product_available *bool 446 447 // whether this module is capable of being loaded with other instance 448 // (possibly an older version) of the same module in the same process. 449 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true}) 450 // can be double loaded in a vendor process if the library is also a 451 // (direct and indirect) dependency of an LLNDK library. Such libraries must be 452 // explicitly marked as `double_loadable: true` by the owner, or the dependency 453 // from the LLNDK lib should be cut if the lib is not designed to be double loaded. 454 Double_loadable *bool 455 456 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs. 457 IsLLNDK bool `blueprint:"mutated"` 458 459 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is 460 // set and the module is not listed in VndkMustUseVendorVariantList. 461 IsVNDKUsingCoreVariant bool `blueprint:"mutated"` 462 463 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property. 464 IsVNDKCore bool `blueprint:"mutated"` 465 466 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property. 467 IsVNDKSP bool `blueprint:"mutated"` 468 469 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK 470 // module sets the llndk.private property. 471 IsVNDKPrivate bool `blueprint:"mutated"` 472 473 // IsVNDKProduct is set if a VNDK module sets the product_available property. 474 IsVNDKProduct bool `blueprint:"mutated"` 475 476 // IsVendorPublicLibrary is set for the core and product variants of a library that has 477 // vendor_public_library stubs. 478 IsVendorPublicLibrary bool `blueprint:"mutated"` 479} 480 481// ModuleContextIntf is an interface (on a module context helper) consisting of functions related 482// to understanding details about the type of the current module. 483// For example, one might call these functions to determine whether the current module is a static 484// library and/or is installed in vendor directories. 485type ModuleContextIntf interface { 486 static() bool 487 staticBinary() bool 488 testBinary() bool 489 testLibrary() bool 490 header() bool 491 binary() bool 492 object() bool 493 toolchain() config.Toolchain 494 canUseSdk() bool 495 useSdk() bool 496 sdkVersion() string 497 minSdkVersion() string 498 isSdkVariant() bool 499 useVndk() bool 500 isNdk(config android.Config) bool 501 IsLlndk() bool 502 IsLlndkPublic() bool 503 isImplementationForLLNDKPublic() bool 504 IsVndkPrivate() bool 505 isVndk() bool 506 isVndkSp() bool 507 IsVndkExt() bool 508 IsVendorPublicLibrary() bool 509 inProduct() bool 510 inVendor() bool 511 inRamdisk() bool 512 inVendorRamdisk() bool 513 inRecovery() bool 514 selectedStl() string 515 baseModuleName() string 516 getVndkExtendsModuleName() string 517 isAfdoCompile() bool 518 isPgoCompile() bool 519 isCfi() bool 520 isNDKStubLibrary() bool 521 useClangLld(actx ModuleContext) bool 522 isForPlatform() bool 523 apexVariationName() string 524 apexSdkVersion() android.ApiLevel 525 bootstrap() bool 526 mustUseVendorVariant() bool 527 nativeCoverage() bool 528 directlyInAnyApex() bool 529 isPreventInstall() bool 530 isCfiAssemblySupportEnabled() bool 531 getSharedFlags() *SharedFlags 532} 533 534type SharedFlags struct { 535 numSharedFlags int 536 flagsMap map[string]string 537} 538 539type ModuleContext interface { 540 android.ModuleContext 541 ModuleContextIntf 542} 543 544type BaseModuleContext interface { 545 android.BaseModuleContext 546 ModuleContextIntf 547} 548 549type DepsContext interface { 550 android.BottomUpMutatorContext 551 ModuleContextIntf 552} 553 554// feature represents additional (optional) steps to building cc-related modules, such as invocation 555// of clang-tidy. 556type feature interface { 557 flags(ctx ModuleContext, flags Flags) Flags 558 props() []interface{} 559} 560 561// compiler is the interface for a compiler helper object. Different module decorators may implement 562// this helper differently. 563type compiler interface { 564 compilerInit(ctx BaseModuleContext) 565 compilerDeps(ctx DepsContext, deps Deps) Deps 566 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags 567 compilerProps() []interface{} 568 569 appendCflags([]string) 570 appendAsflags([]string) 571 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects 572} 573 574// linker is the interface for a linker decorator object. Individual module types can provide 575// their own implementation for this decorator, and thus specify custom logic regarding build 576// statements pertaining to linking. 577type linker interface { 578 linkerInit(ctx BaseModuleContext) 579 linkerDeps(ctx DepsContext, deps Deps) Deps 580 linkerFlags(ctx ModuleContext, flags Flags) Flags 581 linkerProps() []interface{} 582 useClangLld(actx ModuleContext) bool 583 584 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path 585 appendLdflags([]string) 586 unstrippedOutputFilePath() android.Path 587 588 nativeCoverage() bool 589 coverageOutputFilePath() android.OptionalPath 590 591 // Get the deps that have been explicitly specified in the properties. 592 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps 593} 594 595// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker. 596type specifiedDeps struct { 597 sharedLibs []string 598 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually 599 // libc, libm, etc.) 600 systemSharedLibs []string 601} 602 603// installer is the interface for an installer helper object. This helper is responsible for 604// copying build outputs to the appropriate locations so that they may be installed on device. 605type installer interface { 606 installerProps() []interface{} 607 install(ctx ModuleContext, path android.Path) 608 everInstallable() bool 609 inData() bool 610 inSanitizerDir() bool 611 hostToolPath() android.OptionalPath 612 relativeInstallPath() string 613 makeUninstallable(mod *Module) 614 installInRoot() bool 615} 616 617type xref interface { 618 XrefCcFiles() android.Paths 619} 620 621type overridable interface { 622 overriddenModules() []string 623} 624 625type libraryDependencyKind int 626 627const ( 628 headerLibraryDependency = iota 629 sharedLibraryDependency 630 staticLibraryDependency 631) 632 633func (k libraryDependencyKind) String() string { 634 switch k { 635 case headerLibraryDependency: 636 return "headerLibraryDependency" 637 case sharedLibraryDependency: 638 return "sharedLibraryDependency" 639 case staticLibraryDependency: 640 return "staticLibraryDependency" 641 default: 642 panic(fmt.Errorf("unknown libraryDependencyKind %d", k)) 643 } 644} 645 646type libraryDependencyOrder int 647 648const ( 649 earlyLibraryDependency = -1 650 normalLibraryDependency = 0 651 lateLibraryDependency = 1 652) 653 654func (o libraryDependencyOrder) String() string { 655 switch o { 656 case earlyLibraryDependency: 657 return "earlyLibraryDependency" 658 case normalLibraryDependency: 659 return "normalLibraryDependency" 660 case lateLibraryDependency: 661 return "lateLibraryDependency" 662 default: 663 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o)) 664 } 665} 666 667// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency 668// tags that have a set of predefined tag objects that are reused for each dependency, a 669// libraryDependencyTag is designed to contain extra metadata and is constructed as needed. 670// That means that comparing a libraryDependencyTag for equality will only be equal if all 671// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and 672// then check individual metadata fields instead. 673type libraryDependencyTag struct { 674 blueprint.BaseDependencyTag 675 676 // These are exported so that fmt.Printf("%#v") can call their String methods. 677 Kind libraryDependencyKind 678 Order libraryDependencyOrder 679 680 wholeStatic bool 681 682 reexportFlags bool 683 explicitlyVersioned bool 684 dataLib bool 685 ndk bool 686 687 staticUnwinder bool 688 689 makeSuffix string 690 691 // Whether or not this dependency should skip the apex dependency check 692 skipApexAllowedDependenciesCheck bool 693 694 // Whether or not this dependency has to be followed for the apex variants 695 excludeInApex bool 696 697 // If true, don't automatically export symbols from the static library into a shared library. 698 unexportedSymbols bool 699} 700 701// header returns true if the libraryDependencyTag is tagging a header lib dependency. 702func (d libraryDependencyTag) header() bool { 703 return d.Kind == headerLibraryDependency 704} 705 706// shared returns true if the libraryDependencyTag is tagging a shared lib dependency. 707func (d libraryDependencyTag) shared() bool { 708 return d.Kind == sharedLibraryDependency 709} 710 711// shared returns true if the libraryDependencyTag is tagging a static lib dependency. 712func (d libraryDependencyTag) static() bool { 713 return d.Kind == staticLibraryDependency 714} 715 716func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation { 717 if d.shared() { 718 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency} 719 } 720 return nil 721} 722 723var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{} 724 725// InstallDepNeeded returns true for shared libraries so that shared library dependencies of 726// binaries or other shared libraries are installed as dependencies. 727func (d libraryDependencyTag) InstallDepNeeded() bool { 728 return d.shared() 729} 730 731var _ android.InstallNeededDependencyTag = libraryDependencyTag{} 732 733// dependencyTag is used for tagging miscellaneous dependency types that don't fit into 734// libraryDependencyTag. Each tag object is created globally and reused for multiple 735// dependencies (although since the object contains no references, assigning a tag to a 736// variable and modifying it will not modify the original). Users can compare the tag 737// returned by ctx.OtherModuleDependencyTag against the global original 738type dependencyTag struct { 739 blueprint.BaseDependencyTag 740 name string 741} 742 743// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into 744// libraryDependencyTag, but where the dependency needs to be installed when the parent is 745// installed. 746type installDependencyTag struct { 747 blueprint.BaseDependencyTag 748 android.InstallAlwaysNeededDependencyTag 749 name string 750} 751 752var ( 753 genSourceDepTag = dependencyTag{name: "gen source"} 754 genHeaderDepTag = dependencyTag{name: "gen header"} 755 genHeaderExportDepTag = dependencyTag{name: "gen header export"} 756 objDepTag = dependencyTag{name: "obj"} 757 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"} 758 reuseObjTag = dependencyTag{name: "reuse objects"} 759 staticVariantTag = dependencyTag{name: "static variant"} 760 vndkExtDepTag = dependencyTag{name: "vndk extends"} 761 dataLibDepTag = dependencyTag{name: "data lib"} 762 dataBinDepTag = dependencyTag{name: "data bin"} 763 runtimeDepTag = installDependencyTag{name: "runtime lib"} 764 testPerSrcDepTag = dependencyTag{name: "test_per_src"} 765 stubImplDepTag = dependencyTag{name: "stub_impl"} 766 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"} 767 FdoProfileTag = dependencyTag{name: "fdo_profile"} 768) 769 770func IsSharedDepTag(depTag blueprint.DependencyTag) bool { 771 ccLibDepTag, ok := depTag.(libraryDependencyTag) 772 return ok && ccLibDepTag.shared() 773} 774 775func IsStaticDepTag(depTag blueprint.DependencyTag) bool { 776 ccLibDepTag, ok := depTag.(libraryDependencyTag) 777 return ok && ccLibDepTag.static() 778} 779 780func IsHeaderDepTag(depTag blueprint.DependencyTag) bool { 781 ccLibDepTag, ok := depTag.(libraryDependencyTag) 782 return ok && ccLibDepTag.header() 783} 784 785func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool { 786 return depTag == runtimeDepTag 787} 788 789func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool { 790 ccDepTag, ok := depTag.(dependencyTag) 791 return ok && ccDepTag == testPerSrcDepTag 792} 793 794// bazelHandler is the interface for a helper object related to deferring to Bazel for 795// processing a cc module (during Bazel mixed builds). Individual module types should define 796// their own bazel handler if they support being handled by Bazel. 797type BazelHandler interface { 798 // QueueBazelCall invokes request-queueing functions on the BazelContext 799 //so that these requests are handled when Bazel's cquery is invoked. 800 QueueBazelCall(ctx android.BaseModuleContext, label string) 801 802 // ProcessBazelQueryResponse uses information retrieved from Bazel to set properties 803 // on the current module with given label. 804 ProcessBazelQueryResponse(ctx android.ModuleContext, label string) 805} 806 807// Module contains the properties and members used by all C/C++ module types, and implements 808// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces 809// to construct the output file. Behavior can be customized with a Customizer, or "decorator", 810// interface. 811// 812// To define a C/C++ related module, construct a new Module object and point its delegates to 813// type-specific structs. These delegates will be invoked to register module-specific build 814// statements which may be unique to the module type. For example, module.compiler.compile() should 815// be defined so as to register build statements which are responsible for compiling the module. 816// 817// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct 818// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer` 819// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and 820// installer logic. 821type Module struct { 822 fuzz.FuzzModule 823 824 android.BazelModuleBase 825 826 VendorProperties VendorProperties 827 Properties BaseProperties 828 829 // initialize before calling Init 830 hod android.HostOrDeviceSupported 831 multilib android.Multilib 832 bazelable bool 833 834 // Allowable SdkMemberTypes of this module type. 835 sdkMemberTypes []android.SdkMemberType 836 837 // decorator delegates, initialize before calling Init 838 // these may contain module-specific implementations, and effectively allow for custom 839 // type-specific logic. These members may reference different objects or the same object. 840 // Functions of these decorators will be invoked to initialize and register type-specific 841 // build statements. 842 compiler compiler 843 linker linker 844 installer installer 845 bazelHandler BazelHandler 846 847 features []feature 848 stl *stl 849 sanitize *sanitize 850 coverage *coverage 851 fuzzer *fuzzer 852 sabi *sabi 853 vndkdep *vndkdep 854 lto *lto 855 afdo *afdo 856 pgo *pgo 857 858 library libraryInterface 859 860 outputFile android.OptionalPath 861 862 cachedToolchain config.Toolchain 863 864 subAndroidMkOnce map[subAndroidMkProvider]bool 865 866 // Flags used to compile this module 867 flags Flags 868 869 // Shared flags among build rules of this module 870 sharedFlags SharedFlags 871 872 // only non-nil when this is a shared library that reuses the objects of a static library 873 staticAnalogue *StaticLibraryInfo 874 875 makeLinkType string 876 // Kythe (source file indexer) paths for this compilation module 877 kytheFiles android.Paths 878 // Object .o file output paths for this compilation module 879 objFiles android.Paths 880 // Tidy .tidy file output paths for this compilation module 881 tidyFiles android.Paths 882 883 // For apex variants, this is set as apex.min_sdk_version 884 apexSdkVersion android.ApiLevel 885 886 hideApexVariantFromMake bool 887} 888 889func (c *Module) AddJSONData(d *map[string]interface{}) { 890 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool 891 if b, ok := c.compiler.(*baseCompiler); ok { 892 hasAidl = b.hasSrcExt(".aidl") 893 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll") 894 hasProto = b.hasSrcExt(".proto") 895 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs") 896 hasSysprop = b.hasSrcExt(".sysprop") 897 hasWinMsg = b.hasSrcExt(".mc") 898 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy") 899 } 900 c.AndroidModuleBase().AddJSONData(d) 901 (*d)["Cc"] = map[string]interface{}{ 902 "SdkVersion": c.SdkVersion(), 903 "MinSdkVersion": c.MinSdkVersion(), 904 "VndkVersion": c.VndkVersion(), 905 "ProductSpecific": c.ProductSpecific(), 906 "SocSpecific": c.SocSpecific(), 907 "DeviceSpecific": c.DeviceSpecific(), 908 "InProduct": c.InProduct(), 909 "InVendor": c.InVendor(), 910 "InRamdisk": c.InRamdisk(), 911 "InVendorRamdisk": c.InVendorRamdisk(), 912 "InRecovery": c.InRecovery(), 913 "VendorAvailable": c.VendorAvailable(), 914 "ProductAvailable": c.ProductAvailable(), 915 "RamdiskAvailable": c.RamdiskAvailable(), 916 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(), 917 "RecoveryAvailable": c.RecoveryAvailable(), 918 "OdmAvailable": c.OdmAvailable(), 919 "InstallInData": c.InstallInData(), 920 "InstallInRamdisk": c.InstallInRamdisk(), 921 "InstallInSanitizerDir": c.InstallInSanitizerDir(), 922 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(), 923 "InstallInRecovery": c.InstallInRecovery(), 924 "InstallInRoot": c.InstallInRoot(), 925 "IsVndk": c.IsVndk(), 926 "IsVndkExt": c.IsVndkExt(), 927 "IsVndkPrivate": c.IsVndkPrivate(), 928 "IsVndkSp": c.IsVndkSp(), 929 "IsLlndk": c.IsLlndk(), 930 "IsLlndkPublic": c.IsLlndkPublic(), 931 "IsSnapshotLibrary": c.IsSnapshotLibrary(), 932 "IsSnapshotPrebuilt": c.IsSnapshotPrebuilt(), 933 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(), 934 "ApexSdkVersion": c.apexSdkVersion, 935 "TestFor": c.TestFor(), 936 "AidlSrcs": hasAidl, 937 "LexSrcs": hasLex, 938 "ProtoSrcs": hasProto, 939 "RenderscriptSrcs": hasRenderscript, 940 "SyspropSrcs": hasSysprop, 941 "WinMsgSrcs": hasWinMsg, 942 "YaccSrsc": hasYacc, 943 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc), 944 } 945} 946 947func (c *Module) SetPreventInstall() { 948 c.Properties.PreventInstall = true 949} 950 951func (c *Module) SetHideFromMake() { 952 c.Properties.HideFromMake = true 953} 954 955func (c *Module) HiddenFromMake() bool { 956 return c.Properties.HideFromMake 957} 958 959func (c *Module) RequiredModuleNames() []string { 960 required := android.CopyOf(c.ModuleBase.RequiredModuleNames()) 961 if c.ImageVariation().Variation == android.CoreVariation { 962 required = append(required, c.Properties.Target.Platform.Required...) 963 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required) 964 } else if c.InRecovery() { 965 required = append(required, c.Properties.Target.Recovery.Required...) 966 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required) 967 } 968 return android.FirstUniqueStrings(required) 969} 970 971func (c *Module) Toc() android.OptionalPath { 972 if c.linker != nil { 973 if library, ok := c.linker.(libraryInterface); ok { 974 return library.toc() 975 } 976 } 977 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName())) 978} 979 980func (c *Module) ApiLevel() string { 981 if c.linker != nil { 982 if stub, ok := c.linker.(*stubDecorator); ok { 983 return stub.apiLevel.String() 984 } 985 } 986 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName())) 987} 988 989func (c *Module) Static() bool { 990 if c.linker != nil { 991 if library, ok := c.linker.(libraryInterface); ok { 992 return library.static() 993 } 994 } 995 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName())) 996} 997 998func (c *Module) Shared() bool { 999 if c.linker != nil { 1000 if library, ok := c.linker.(libraryInterface); ok { 1001 return library.shared() 1002 } 1003 } 1004 1005 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName())) 1006} 1007 1008func (c *Module) SelectedStl() string { 1009 if c.stl != nil { 1010 return c.stl.Properties.SelectedStl 1011 } 1012 return "" 1013} 1014 1015func (c *Module) NdkPrebuiltStl() bool { 1016 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok { 1017 return true 1018 } 1019 return false 1020} 1021 1022func (c *Module) StubDecorator() bool { 1023 if _, ok := c.linker.(*stubDecorator); ok { 1024 return true 1025 } 1026 return false 1027} 1028 1029func (c *Module) SdkVersion() string { 1030 return String(c.Properties.Sdk_version) 1031} 1032 1033func (c *Module) MinSdkVersion() string { 1034 return String(c.Properties.Min_sdk_version) 1035} 1036 1037func (c *Module) isCrt() bool { 1038 if linker, ok := c.linker.(*objectLinker); ok { 1039 return linker.isCrt() 1040 } 1041 return false 1042} 1043 1044func (c *Module) SplitPerApiLevel() bool { 1045 return c.canUseSdk() && c.isCrt() 1046} 1047 1048func (c *Module) AlwaysSdk() bool { 1049 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only) 1050} 1051 1052func (c *Module) CcLibrary() bool { 1053 if c.linker != nil { 1054 if _, ok := c.linker.(*libraryDecorator); ok { 1055 return true 1056 } 1057 if _, ok := c.linker.(*prebuiltLibraryLinker); ok { 1058 return true 1059 } 1060 } 1061 return false 1062} 1063 1064func (c *Module) CcLibraryInterface() bool { 1065 if _, ok := c.linker.(libraryInterface); ok { 1066 return true 1067 } 1068 return false 1069} 1070 1071func (c *Module) IsFuzzModule() bool { 1072 if _, ok := c.compiler.(*fuzzBinary); ok { 1073 return true 1074 } 1075 return false 1076} 1077 1078func (c *Module) FuzzModuleStruct() fuzz.FuzzModule { 1079 return c.FuzzModule 1080} 1081 1082func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule { 1083 if fuzzer, ok := c.compiler.(*fuzzBinary); ok { 1084 return fuzzer.fuzzPackagedModule 1085 } 1086 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName())) 1087} 1088 1089func (c *Module) FuzzSharedLibraries() android.Paths { 1090 if fuzzer, ok := c.compiler.(*fuzzBinary); ok { 1091 return fuzzer.sharedLibraries 1092 } 1093 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName())) 1094} 1095 1096func (c *Module) NonCcVariants() bool { 1097 return false 1098} 1099 1100func (c *Module) SetStatic() { 1101 if c.linker != nil { 1102 if library, ok := c.linker.(libraryInterface); ok { 1103 library.setStatic() 1104 return 1105 } 1106 } 1107 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName())) 1108} 1109 1110func (c *Module) SetShared() { 1111 if c.linker != nil { 1112 if library, ok := c.linker.(libraryInterface); ok { 1113 library.setShared() 1114 return 1115 } 1116 } 1117 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName())) 1118} 1119 1120func (c *Module) BuildStaticVariant() bool { 1121 if c.linker != nil { 1122 if library, ok := c.linker.(libraryInterface); ok { 1123 return library.buildStatic() 1124 } 1125 } 1126 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName())) 1127} 1128 1129func (c *Module) BuildSharedVariant() bool { 1130 if c.linker != nil { 1131 if library, ok := c.linker.(libraryInterface); ok { 1132 return library.buildShared() 1133 } 1134 } 1135 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName())) 1136} 1137 1138func (c *Module) Module() android.Module { 1139 return c 1140} 1141 1142func (c *Module) OutputFile() android.OptionalPath { 1143 return c.outputFile 1144} 1145 1146func (c *Module) CoverageFiles() android.Paths { 1147 if c.linker != nil { 1148 if library, ok := c.linker.(libraryInterface); ok { 1149 return library.objs().coverageFiles 1150 } 1151 } 1152 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName())) 1153} 1154 1155var _ LinkableInterface = (*Module)(nil) 1156 1157func (c *Module) UnstrippedOutputFile() android.Path { 1158 if c.linker != nil { 1159 return c.linker.unstrippedOutputFilePath() 1160 } 1161 return nil 1162} 1163 1164func (c *Module) CoverageOutputFile() android.OptionalPath { 1165 if c.linker != nil { 1166 return c.linker.coverageOutputFilePath() 1167 } 1168 return android.OptionalPath{} 1169} 1170 1171func (c *Module) RelativeInstallPath() string { 1172 if c.installer != nil { 1173 return c.installer.relativeInstallPath() 1174 } 1175 return "" 1176} 1177 1178func (c *Module) VndkVersion() string { 1179 return c.Properties.VndkVersion 1180} 1181 1182func (c *Module) Init() android.Module { 1183 c.AddProperties(&c.Properties, &c.VendorProperties) 1184 if c.compiler != nil { 1185 c.AddProperties(c.compiler.compilerProps()...) 1186 } 1187 if c.linker != nil { 1188 c.AddProperties(c.linker.linkerProps()...) 1189 } 1190 if c.installer != nil { 1191 c.AddProperties(c.installer.installerProps()...) 1192 } 1193 if c.stl != nil { 1194 c.AddProperties(c.stl.props()...) 1195 } 1196 if c.sanitize != nil { 1197 c.AddProperties(c.sanitize.props()...) 1198 } 1199 if c.coverage != nil { 1200 c.AddProperties(c.coverage.props()...) 1201 } 1202 if c.fuzzer != nil { 1203 c.AddProperties(c.fuzzer.props()...) 1204 } 1205 if c.sabi != nil { 1206 c.AddProperties(c.sabi.props()...) 1207 } 1208 if c.vndkdep != nil { 1209 c.AddProperties(c.vndkdep.props()...) 1210 } 1211 if c.lto != nil { 1212 c.AddProperties(c.lto.props()...) 1213 } 1214 if c.afdo != nil { 1215 c.AddProperties(c.afdo.props()...) 1216 } 1217 if c.pgo != nil { 1218 c.AddProperties(c.pgo.props()...) 1219 } 1220 for _, feature := range c.features { 1221 c.AddProperties(feature.props()...) 1222 } 1223 1224 android.InitAndroidArchModule(c, c.hod, c.multilib) 1225 if c.bazelable { 1226 android.InitBazelModule(c) 1227 } 1228 android.InitApexModule(c) 1229 android.InitDefaultableModule(c) 1230 1231 return c 1232} 1233 1234// UseVndk() returns true if this module is built against VNDK. 1235// This means the vendor and product variants of a module. 1236func (c *Module) UseVndk() bool { 1237 return c.Properties.VndkVersion != "" 1238} 1239 1240func (c *Module) canUseSdk() bool { 1241 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled && 1242 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk() 1243} 1244 1245func (c *Module) UseSdk() bool { 1246 if c.canUseSdk() { 1247 return String(c.Properties.Sdk_version) != "" 1248 } 1249 return false 1250} 1251 1252func (c *Module) isCoverageVariant() bool { 1253 return c.coverage.Properties.IsCoverageVariant 1254} 1255 1256func (c *Module) IsNdk(config android.Config) bool { 1257 return inList(c.BaseModuleName(), *getNDKKnownLibs(config)) 1258} 1259 1260func (c *Module) IsLlndk() bool { 1261 return c.VendorProperties.IsLLNDK 1262} 1263 1264func (c *Module) IsLlndkPublic() bool { 1265 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate 1266} 1267 1268func (m *Module) NeedsLlndkVariants() bool { 1269 lib := moduleLibraryInterface(m) 1270 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders()) 1271} 1272 1273func (m *Module) NeedsVendorPublicLibraryVariants() bool { 1274 lib := moduleLibraryInterface(m) 1275 return lib != nil && (lib.hasVendorPublicLibrary()) 1276} 1277 1278// IsVendorPublicLibrary returns true for vendor public libraries. 1279func (c *Module) IsVendorPublicLibrary() bool { 1280 return c.VendorProperties.IsVendorPublicLibrary 1281} 1282 1283func (c *Module) IsVndkPrebuiltLibrary() bool { 1284 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok { 1285 return true 1286 } 1287 return false 1288} 1289 1290func (c *Module) SdkAndPlatformVariantVisibleToMake() bool { 1291 return c.Properties.SdkAndPlatformVariantVisibleToMake 1292} 1293 1294func (c *Module) HasLlndkStubs() bool { 1295 lib := moduleLibraryInterface(c) 1296 return lib != nil && lib.hasLLNDKStubs() 1297} 1298 1299func (c *Module) StubsVersion() string { 1300 if lib, ok := c.linker.(versionedInterface); ok { 1301 return lib.stubsVersion() 1302 } 1303 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName())) 1304} 1305 1306// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs 1307// and does not set llndk.vendor_available: false. 1308func (c *Module) isImplementationForLLNDKPublic() bool { 1309 library, _ := c.library.(*libraryDecorator) 1310 return library != nil && library.hasLLNDKStubs() && 1311 !Bool(library.Properties.Llndk.Private) 1312} 1313 1314// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private. 1315func (c *Module) IsVndkPrivate() bool { 1316 // Check if VNDK-core-private or VNDK-SP-private 1317 if c.IsVndk() { 1318 return Bool(c.vndkdep.Properties.Vndk.Private) 1319 } 1320 1321 // Check if LLNDK-private 1322 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() { 1323 return Bool(library.Properties.Llndk.Private) 1324 } 1325 1326 return false 1327} 1328 1329// IsVndk() returns true if this module has a vndk variant. 1330// Note that IsVndk() returns true for all variants of vndk-enabled libraries. Not only vendor variant, 1331// but also platform and product variants of vndk-enabled libraries return true for IsVndk(). 1332func (c *Module) IsVndk() bool { 1333 if vndkdep := c.vndkdep; vndkdep != nil { 1334 return vndkdep.isVndk() 1335 } 1336 return false 1337} 1338 1339func (c *Module) isAfdoCompile() bool { 1340 if afdo := c.afdo; afdo != nil { 1341 return afdo.Properties.FdoProfilePath != nil 1342 } 1343 return false 1344} 1345 1346func (c *Module) isPgoCompile() bool { 1347 if pgo := c.pgo; pgo != nil { 1348 return pgo.Properties.PgoCompile 1349 } 1350 return false 1351} 1352 1353func (c *Module) isCfi() bool { 1354 if sanitize := c.sanitize; sanitize != nil { 1355 return Bool(sanitize.Properties.Sanitize.Cfi) 1356 } 1357 return false 1358} 1359 1360func (c *Module) isNDKStubLibrary() bool { 1361 if _, ok := c.compiler.(*stubDecorator); ok { 1362 return true 1363 } 1364 return false 1365} 1366 1367func (c *Module) IsVndkSp() bool { 1368 if vndkdep := c.vndkdep; vndkdep != nil { 1369 return vndkdep.isVndkSp() 1370 } 1371 return false 1372} 1373 1374func (c *Module) IsVndkExt() bool { 1375 if vndkdep := c.vndkdep; vndkdep != nil { 1376 return vndkdep.isVndkExt() 1377 } 1378 return false 1379} 1380 1381func (c *Module) SubName() string { 1382 return c.Properties.SubName 1383} 1384 1385func (c *Module) MustUseVendorVariant() bool { 1386 return c.IsVndkSp() || c.Properties.MustUseVendorVariant 1387} 1388 1389func (c *Module) getVndkExtendsModuleName() string { 1390 if vndkdep := c.vndkdep; vndkdep != nil { 1391 return vndkdep.getVndkExtendsModuleName() 1392 } 1393 return "" 1394} 1395 1396func (c *Module) IsStubs() bool { 1397 if lib := c.library; lib != nil { 1398 return lib.buildStubs() 1399 } 1400 return false 1401} 1402 1403func (c *Module) HasStubsVariants() bool { 1404 if lib := c.library; lib != nil { 1405 return lib.hasStubsVariants() 1406 } 1407 return false 1408} 1409 1410func (c *Module) IsStubsImplementationRequired() bool { 1411 if lib := c.library; lib != nil { 1412 return lib.isStubsImplementationRequired() 1413 } 1414 return false 1415} 1416 1417// If this is a stubs library, ImplementationModuleName returns the name of the module that contains 1418// the implementation. If it is an implementation library it returns its own name. 1419func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string { 1420 name := ctx.OtherModuleName(c) 1421 if versioned, ok := c.linker.(versionedInterface); ok { 1422 name = versioned.implementationModuleName(name) 1423 } 1424 return name 1425} 1426 1427// Similar to ImplementationModuleName, but uses the Make variant of the module 1428// name as base name, for use in AndroidMk output. E.g. for a prebuilt module 1429// where the Soong name is prebuilt_foo, this returns foo (which works in Make 1430// under the premise that the prebuilt module overrides its source counterpart 1431// if it is exposed to Make). 1432func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string { 1433 name := c.BaseModuleName() 1434 if versioned, ok := c.linker.(versionedInterface); ok { 1435 name = versioned.implementationModuleName(name) 1436 } 1437 return name 1438} 1439 1440func (c *Module) Bootstrap() bool { 1441 return Bool(c.Properties.Bootstrap) 1442} 1443 1444func (c *Module) nativeCoverage() bool { 1445 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage 1446 if c.Target().NativeBridge == android.NativeBridgeEnabled { 1447 return false 1448 } 1449 return c.linker != nil && c.linker.nativeCoverage() 1450} 1451 1452func (c *Module) IsSnapshotPrebuilt() bool { 1453 if p, ok := c.linker.(SnapshotInterface); ok { 1454 return p.IsSnapshotPrebuilt() 1455 } 1456 return false 1457} 1458 1459func (c *Module) ExcludeFromVendorSnapshot() bool { 1460 return Bool(c.Properties.Exclude_from_vendor_snapshot) 1461} 1462 1463func (c *Module) ExcludeFromRecoverySnapshot() bool { 1464 return Bool(c.Properties.Exclude_from_recovery_snapshot) 1465} 1466 1467func isBionic(name string) bool { 1468 switch name { 1469 case "libc", "libm", "libdl", "libdl_android", "linker": 1470 return true 1471 } 1472 return false 1473} 1474 1475func InstallToBootstrap(name string, config android.Config) bool { 1476 // NOTE: also update //build/bazel/rules/apex/cc.bzl#_installed_to_bootstrap 1477 // if this list is updated. 1478 if name == "libclang_rt.hwasan" || name == "libc_hwasan" { 1479 return true 1480 } 1481 return isBionic(name) 1482} 1483 1484func (c *Module) XrefCcFiles() android.Paths { 1485 return c.kytheFiles 1486} 1487 1488func (c *Module) isCfiAssemblySupportEnabled() bool { 1489 return c.sanitize != nil && 1490 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support) 1491} 1492 1493func (c *Module) InstallInRoot() bool { 1494 return c.installer != nil && c.installer.installInRoot() 1495} 1496 1497type baseModuleContext struct { 1498 android.BaseModuleContext 1499 moduleContextImpl 1500} 1501 1502type depsContext struct { 1503 android.BottomUpMutatorContext 1504 moduleContextImpl 1505} 1506 1507type moduleContext struct { 1508 android.ModuleContext 1509 moduleContextImpl 1510} 1511 1512type moduleContextImpl struct { 1513 mod *Module 1514 ctx BaseModuleContext 1515} 1516 1517func (ctx *moduleContextImpl) toolchain() config.Toolchain { 1518 return ctx.mod.toolchain(ctx.ctx) 1519} 1520 1521func (ctx *moduleContextImpl) static() bool { 1522 return ctx.mod.static() 1523} 1524 1525func (ctx *moduleContextImpl) staticBinary() bool { 1526 return ctx.mod.staticBinary() 1527} 1528 1529func (ctx *moduleContextImpl) testBinary() bool { 1530 return ctx.mod.testBinary() 1531} 1532 1533func (ctx *moduleContextImpl) testLibrary() bool { 1534 return ctx.mod.testLibrary() 1535} 1536 1537func (ctx *moduleContextImpl) header() bool { 1538 return ctx.mod.Header() 1539} 1540 1541func (ctx *moduleContextImpl) binary() bool { 1542 return ctx.mod.Binary() 1543} 1544 1545func (ctx *moduleContextImpl) object() bool { 1546 return ctx.mod.Object() 1547} 1548 1549func (ctx *moduleContextImpl) canUseSdk() bool { 1550 return ctx.mod.canUseSdk() 1551} 1552 1553func (ctx *moduleContextImpl) useSdk() bool { 1554 return ctx.mod.UseSdk() 1555} 1556 1557func (ctx *moduleContextImpl) sdkVersion() string { 1558 if ctx.ctx.Device() { 1559 if ctx.useVndk() { 1560 vndkVer := ctx.mod.VndkVersion() 1561 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) { 1562 return "current" 1563 } 1564 return vndkVer 1565 } 1566 return String(ctx.mod.Properties.Sdk_version) 1567 } 1568 return "" 1569} 1570 1571func (ctx *moduleContextImpl) minSdkVersion() string { 1572 ver := ctx.mod.MinSdkVersion() 1573 if ver == "apex_inherit" && !ctx.isForPlatform() { 1574 ver = ctx.apexSdkVersion().String() 1575 } 1576 if ver == "apex_inherit" || ver == "" { 1577 ver = ctx.sdkVersion() 1578 } 1579 // For crt objects, the meaning of min_sdk_version is very different from other types of 1580 // module. For them, min_sdk_version defines the oldest version that the build system will 1581 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of 1582 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version 1583 // and min_sdk_version properties of the variants are set to the corresponding version 1584 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left 1585 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to 1586 // support such an old version. The version is set to the later version in case when the 1587 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if 1588 // it's for an APEX. 1589 if ctx.mod.isCrt() && !ctx.isSdkVariant() { 1590 if ctx.isForPlatform() { 1591 ver = strconv.Itoa(android.FutureApiLevelInt) 1592 } else { // for apex 1593 ver = ctx.apexSdkVersion().String() 1594 if ver == "" { // in case when min_sdk_version was not set by the APEX 1595 ver = ctx.sdkVersion() 1596 } 1597 } 1598 } 1599 1600 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers 1601 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion()) 1602 minSdkVersionInt, err2 := strconv.Atoi(ver) 1603 if err == nil && err2 == nil { 1604 if sdkVersionInt < minSdkVersionInt { 1605 return strconv.Itoa(sdkVersionInt) 1606 } 1607 } 1608 return ver 1609} 1610 1611func (ctx *moduleContextImpl) isSdkVariant() bool { 1612 return ctx.mod.IsSdkVariant() 1613} 1614 1615func (ctx *moduleContextImpl) useVndk() bool { 1616 return ctx.mod.UseVndk() 1617} 1618 1619func (ctx *moduleContextImpl) isNdk(config android.Config) bool { 1620 return ctx.mod.IsNdk(config) 1621} 1622 1623func (ctx *moduleContextImpl) IsLlndk() bool { 1624 return ctx.mod.IsLlndk() 1625} 1626 1627func (ctx *moduleContextImpl) IsLlndkPublic() bool { 1628 return ctx.mod.IsLlndkPublic() 1629} 1630 1631func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool { 1632 return ctx.mod.isImplementationForLLNDKPublic() 1633} 1634 1635func (ctx *moduleContextImpl) IsVndkPrivate() bool { 1636 return ctx.mod.IsVndkPrivate() 1637} 1638 1639func (ctx *moduleContextImpl) isVndk() bool { 1640 return ctx.mod.IsVndk() 1641} 1642 1643func (ctx *moduleContextImpl) isAfdoCompile() bool { 1644 return ctx.mod.isAfdoCompile() 1645} 1646 1647func (ctx *moduleContextImpl) isPgoCompile() bool { 1648 return ctx.mod.isPgoCompile() 1649} 1650 1651func (ctx *moduleContextImpl) isCfi() bool { 1652 return ctx.mod.isCfi() 1653} 1654 1655func (ctx *moduleContextImpl) isNDKStubLibrary() bool { 1656 return ctx.mod.isNDKStubLibrary() 1657} 1658 1659func (ctx *moduleContextImpl) isVndkSp() bool { 1660 return ctx.mod.IsVndkSp() 1661} 1662 1663func (ctx *moduleContextImpl) IsVndkExt() bool { 1664 return ctx.mod.IsVndkExt() 1665} 1666 1667func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool { 1668 return ctx.mod.IsVendorPublicLibrary() 1669} 1670 1671func (ctx *moduleContextImpl) mustUseVendorVariant() bool { 1672 return ctx.mod.MustUseVendorVariant() 1673} 1674 1675func (ctx *moduleContextImpl) selectedStl() string { 1676 if stl := ctx.mod.stl; stl != nil { 1677 return stl.Properties.SelectedStl 1678 } 1679 return "" 1680} 1681 1682func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool { 1683 return ctx.mod.linker.useClangLld(actx) 1684} 1685 1686func (ctx *moduleContextImpl) baseModuleName() string { 1687 return ctx.mod.ModuleBase.BaseModuleName() 1688} 1689 1690func (ctx *moduleContextImpl) getVndkExtendsModuleName() string { 1691 return ctx.mod.getVndkExtendsModuleName() 1692} 1693 1694func (ctx *moduleContextImpl) isForPlatform() bool { 1695 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() 1696} 1697 1698func (ctx *moduleContextImpl) apexVariationName() string { 1699 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName 1700} 1701 1702func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel { 1703 return ctx.mod.apexSdkVersion 1704} 1705 1706func (ctx *moduleContextImpl) bootstrap() bool { 1707 return ctx.mod.Bootstrap() 1708} 1709 1710func (ctx *moduleContextImpl) nativeCoverage() bool { 1711 return ctx.mod.nativeCoverage() 1712} 1713 1714func (ctx *moduleContextImpl) directlyInAnyApex() bool { 1715 return ctx.mod.DirectlyInAnyApex() 1716} 1717 1718func (ctx *moduleContextImpl) isPreventInstall() bool { 1719 return ctx.mod.Properties.PreventInstall 1720} 1721 1722func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags { 1723 shared := &ctx.mod.sharedFlags 1724 if shared.flagsMap == nil { 1725 shared.numSharedFlags = 0 1726 shared.flagsMap = make(map[string]string) 1727 } 1728 return shared 1729} 1730 1731func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool { 1732 return ctx.mod.isCfiAssemblySupportEnabled() 1733} 1734 1735func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module { 1736 return &Module{ 1737 hod: hod, 1738 multilib: multilib, 1739 } 1740} 1741 1742func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module { 1743 module := newBaseModule(hod, multilib) 1744 module.features = []feature{ 1745 &tidyFeature{}, 1746 } 1747 module.stl = &stl{} 1748 module.sanitize = &sanitize{} 1749 module.coverage = &coverage{} 1750 module.fuzzer = &fuzzer{} 1751 module.sabi = &sabi{} 1752 module.vndkdep = &vndkdep{} 1753 module.lto = <o{} 1754 module.afdo = &afdo{} 1755 module.pgo = &pgo{} 1756 return module 1757} 1758 1759func (c *Module) Prebuilt() *android.Prebuilt { 1760 if p, ok := c.linker.(prebuiltLinkerInterface); ok { 1761 return p.prebuilt() 1762 } 1763 return nil 1764} 1765 1766func (c *Module) IsPrebuilt() bool { 1767 return c.Prebuilt() != nil 1768} 1769 1770func (c *Module) Name() string { 1771 name := c.ModuleBase.Name() 1772 if p, ok := c.linker.(interface { 1773 Name(string) string 1774 }); ok { 1775 name = p.Name(name) 1776 } 1777 return name 1778} 1779 1780func (c *Module) Symlinks() []string { 1781 if p, ok := c.installer.(interface { 1782 symlinkList() []string 1783 }); ok { 1784 return p.symlinkList() 1785 } 1786 return nil 1787} 1788 1789func (c *Module) IsTestPerSrcAllTestsVariation() bool { 1790 test, ok := c.linker.(testPerSrc) 1791 return ok && test.isAllTestsVariation() 1792} 1793 1794func (c *Module) DataPaths() []android.DataPath { 1795 if p, ok := c.installer.(interface { 1796 dataPaths() []android.DataPath 1797 }); ok { 1798 return p.dataPaths() 1799 } 1800 return nil 1801} 1802 1803func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string { 1804 // Returns the name suffix for product and vendor variants. If the VNDK version is not 1805 // "current", it will append the VNDK version to the name suffix. 1806 var vndkVersion string 1807 var nameSuffix string 1808 if c.InProduct() { 1809 if c.ProductSpecific() { 1810 // If the module is product specific with 'product_specific: true', 1811 // do not add a name suffix because it is a base module. 1812 return "" 1813 } 1814 vndkVersion = ctx.DeviceConfig().ProductVndkVersion() 1815 nameSuffix = ProductSuffix 1816 } else { 1817 vndkVersion = ctx.DeviceConfig().VndkVersion() 1818 nameSuffix = VendorSuffix 1819 } 1820 if vndkVersion == "current" { 1821 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion() 1822 } 1823 if c.VndkVersion() != vndkVersion && c.VndkVersion() != "" { 1824 // add version suffix only if the module is using different vndk version than the 1825 // version in product or vendor partition. 1826 nameSuffix += "." + c.VndkVersion() 1827 } 1828 return nameSuffix 1829} 1830 1831func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string { 1832 var subName = "" 1833 1834 if c.Target().NativeBridge == android.NativeBridgeEnabled { 1835 subName += NativeBridgeSuffix 1836 } 1837 1838 llndk := c.IsLlndk() 1839 if llndk || (c.UseVndk() && c.HasNonSystemVariants()) { 1840 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is 1841 // added for product variant only when we have vendor and product variants with core 1842 // variant. The suffix is not added for vendor-only or product-only module. 1843 subName += getNameSuffixWithVndkVersion(actx, c) 1844 } else if c.IsVendorPublicLibrary() { 1845 subName += vendorPublicLibrarySuffix 1846 } else if c.IsVndkPrebuiltLibrary() { 1847 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with 1848 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp. 1849 subName += VendorSuffix 1850 } else if c.InRamdisk() && !c.OnlyInRamdisk() { 1851 subName += RamdiskSuffix 1852 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() { 1853 subName += VendorRamdiskSuffix 1854 } else if c.InRecovery() && !c.OnlyInRecovery() { 1855 subName += RecoverySuffix 1856 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) { 1857 subName += sdkSuffix 1858 if c.SplitPerApiLevel() { 1859 subName += "." + c.SdkVersion() 1860 } 1861 } else if c.IsStubs() && c.IsSdkVariant() { 1862 // Public API surface (NDK) 1863 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant. 1864 subName = sdkSuffix 1865 } 1866 1867 return subName 1868} 1869 1870var _ android.MixedBuildBuildable = (*Module)(nil) 1871 1872func (c *Module) getBazelModuleLabel(ctx android.BaseModuleContext) string { 1873 var bazelModuleLabel string 1874 if c.typ() == fullLibrary && c.static() { 1875 // cc_library is a special case in bp2build; two targets are generated -- one for each 1876 // of the shared and static variants. The shared variant keeps the module name, but the 1877 // static variant uses a different suffixed name. 1878 bazelModuleLabel = bazelLabelForStaticModule(ctx, c) 1879 } else { 1880 bazelModuleLabel = c.GetBazelLabel(ctx, c) 1881 } 1882 labelNoPrebuilt := bazelModuleLabel 1883 if c.IsPrebuilt() { 1884 labelNoPrebuilt = android.RemoveOptionalPrebuiltPrefixFromBazelLabel(bazelModuleLabel) 1885 } 1886 return labelNoPrebuilt 1887} 1888 1889func (c *Module) QueueBazelCall(ctx android.BaseModuleContext) { 1890 c.bazelHandler.QueueBazelCall(ctx, c.getBazelModuleLabel(ctx)) 1891} 1892 1893var ( 1894 mixedBuildSupportedCcTest = []string{ 1895 "adbd_test", 1896 "adb_crypto_test", 1897 "adb_pairing_auth_test", 1898 "adb_pairing_connection_test", 1899 "adb_tls_connection_test", 1900 } 1901) 1902 1903// IsMixedBuildSupported returns true if the module should be analyzed by Bazel 1904// in any of the --bazel-mode(s). This filters at the module level and takes 1905// precedence over the allowlists in allowlists/allowlists.go. 1906func (c *Module) IsMixedBuildSupported(ctx android.BaseModuleContext) bool { 1907 _, isForTesting := ctx.Config().BazelContext.(android.MockBazelContext) 1908 if c.testBinary() && !android.InList(c.Name(), mixedBuildSupportedCcTest) && !isForTesting { 1909 // Per-module rollout of mixed-builds for cc_test modules. 1910 return false 1911 } 1912 1913 // TODO(b/261058727): Remove this (enable mixed builds for modules with UBSan) 1914 // Currently we can only support ubsan when minimum runtime is used. 1915 return c.bazelHandler != nil && (!isUbsanEnabled(c) || c.MinimalRuntimeNeeded()) 1916} 1917 1918func isUbsanEnabled(c *Module) bool { 1919 if c.sanitize == nil { 1920 return false 1921 } 1922 sanitizeProps := &c.sanitize.Properties.SanitizeMutated 1923 return Bool(sanitizeProps.Integer_overflow) || len(sanitizeProps.Misc_undefined) > 0 1924} 1925 1926func GetApexConfigKey(ctx android.BaseModuleContext) *android.ApexConfigKey { 1927 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) 1928 if !apexInfo.IsForPlatform() { 1929 if !ctx.Config().BazelContext.IsModuleDclaAllowed(ctx.Module().Name()) { 1930 return nil 1931 } 1932 apexKey := android.ApexConfigKey{ 1933 WithinApex: true, 1934 ApexSdkVersion: findApexSdkVersion(ctx, apexInfo).String(), 1935 } 1936 return &apexKey 1937 } 1938 1939 return nil 1940} 1941 1942func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) { 1943 bazelModuleLabel := c.getBazelModuleLabel(ctx) 1944 c.bazelHandler.ProcessBazelQueryResponse(ctx, bazelModuleLabel) 1945 1946 c.Properties.SubName = GetSubnameProperty(ctx, c) 1947 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) 1948 if !apexInfo.IsForPlatform() { 1949 c.hideApexVariantFromMake = true 1950 } 1951 1952 c.makeLinkType = GetMakeLinkType(ctx, c) 1953 1954 mctx := &moduleContext{ 1955 ModuleContext: ctx, 1956 moduleContextImpl: moduleContextImpl{ 1957 mod: c, 1958 }, 1959 } 1960 mctx.ctx = mctx 1961 1962 // TODO(b/244432500): Get the tradefed config from the bazel target instead 1963 // of generating it with Soong. 1964 c.maybeInstall(mctx, apexInfo) 1965} 1966 1967func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext { 1968 ctx := &moduleContext{ 1969 ModuleContext: actx, 1970 moduleContextImpl: moduleContextImpl{ 1971 mod: c, 1972 }, 1973 } 1974 ctx.ctx = ctx 1975 return ctx 1976} 1977 1978func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { 1979 // Handle the case of a test module split by `test_per_src` mutator. 1980 // 1981 // The `test_per_src` mutator adds an extra variation named "", depending on all the other 1982 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this 1983 // module and return early, as this module does not produce an output file per se. 1984 if c.IsTestPerSrcAllTestsVariation() { 1985 c.outputFile = android.OptionalPath{} 1986 return 1987 } 1988 1989 c.Properties.SubName = GetSubnameProperty(actx, c) 1990 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo) 1991 if !apexInfo.IsForPlatform() { 1992 c.hideApexVariantFromMake = true 1993 } 1994 1995 c.makeLinkType = GetMakeLinkType(actx, c) 1996 1997 ctx := moduleContextFromAndroidModuleContext(actx, c) 1998 1999 deps := c.depsToPaths(ctx) 2000 if ctx.Failed() { 2001 return 2002 } 2003 2004 if c.Properties.Clang != nil && *c.Properties.Clang == false { 2005 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported") 2006 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() { 2007 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file") 2008 } 2009 2010 flags := Flags{ 2011 Toolchain: c.toolchain(ctx), 2012 EmitXrefs: ctx.Config().EmitXrefRules(), 2013 } 2014 if c.compiler != nil { 2015 flags = c.compiler.compilerFlags(ctx, flags, deps) 2016 } 2017 if c.linker != nil { 2018 flags = c.linker.linkerFlags(ctx, flags) 2019 } 2020 if c.stl != nil { 2021 flags = c.stl.flags(ctx, flags) 2022 } 2023 if c.sanitize != nil { 2024 flags = c.sanitize.flags(ctx, flags) 2025 } 2026 if c.coverage != nil { 2027 flags, deps = c.coverage.flags(ctx, flags, deps) 2028 } 2029 if c.fuzzer != nil { 2030 flags = c.fuzzer.flags(ctx, flags) 2031 } 2032 if c.lto != nil { 2033 flags = c.lto.flags(ctx, flags) 2034 } 2035 if c.afdo != nil { 2036 flags = c.afdo.flags(ctx, flags) 2037 } 2038 if c.pgo != nil { 2039 flags = c.pgo.flags(ctx, flags) 2040 } 2041 for _, feature := range c.features { 2042 flags = feature.flags(ctx, flags) 2043 } 2044 if ctx.Failed() { 2045 return 2046 } 2047 2048 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags) 2049 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags) 2050 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags) 2051 2052 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...) 2053 2054 for _, dir := range deps.IncludeDirs { 2055 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String()) 2056 } 2057 for _, dir := range deps.SystemIncludeDirs { 2058 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String()) 2059 } 2060 2061 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...) 2062 2063 c.flags = flags 2064 // We need access to all the flags seen by a source file. 2065 if c.sabi != nil { 2066 flags = c.sabi.flags(ctx, flags) 2067 } 2068 2069 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags) 2070 2071 var objs Objects 2072 if c.compiler != nil { 2073 objs = c.compiler.compile(ctx, flags, deps) 2074 if ctx.Failed() { 2075 return 2076 } 2077 c.kytheFiles = objs.kytheFiles 2078 c.objFiles = objs.objFiles 2079 c.tidyFiles = objs.tidyFiles 2080 } 2081 2082 if c.linker != nil { 2083 outputFile := c.linker.link(ctx, flags, deps, objs) 2084 if ctx.Failed() { 2085 return 2086 } 2087 c.outputFile = android.OptionalPathForPath(outputFile) 2088 2089 c.maybeUnhideFromMake() 2090 2091 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or 2092 // RECOVERY_SNAPSHOT_VERSION is current. 2093 if i, ok := c.linker.(snapshotLibraryInterface); ok { 2094 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) { 2095 i.collectHeadersForSnapshot(ctx) 2096 } 2097 } 2098 } 2099 2100 c.maybeInstall(ctx, apexInfo) 2101} 2102 2103func (c *Module) maybeUnhideFromMake() { 2104 // If a lib is directly included in any of the APEXes or is not available to the 2105 // platform (which is often the case when the stub is provided as a prebuilt), 2106 // unhide the stubs variant having the latest version gets visible to make. In 2107 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to 2108 // force anything in the make world to link against the stubs library. (unless it 2109 // is explicitly referenced via .bootstrap suffix or the module is marked with 2110 // 'bootstrap: true'). 2111 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() && 2112 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() && 2113 c.IsStubs() && !c.InVendorRamdisk() { 2114 c.Properties.HideFromMake = false // unhide 2115 // Note: this is still non-installable 2116 } 2117} 2118 2119// maybeInstall is called at the end of both GenerateAndroidBuildActions and 2120// ProcessBazelQueryResponse to run the install hooks for installable modules, 2121// like binaries and tests. 2122func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) { 2123 if !proptools.BoolDefault(c.Installable(), true) { 2124 // If the module has been specifically configure to not be installed then 2125 // hide from make as otherwise it will break when running inside make 2126 // as the output path to install will not be specified. Not all uninstallable 2127 // modules can be hidden from make as some are needed for resolving make side 2128 // dependencies. 2129 c.HideFromMake() 2130 } else if !installable(c, apexInfo) { 2131 c.SkipInstall() 2132 } 2133 2134 // Still call c.installer.install though, the installs will be stored as PackageSpecs 2135 // to allow using the outputs in a genrule. 2136 if c.installer != nil && c.outputFile.Valid() { 2137 c.installer.install(ctx, c.outputFile.Path()) 2138 if ctx.Failed() { 2139 return 2140 } 2141 } 2142} 2143 2144func (c *Module) setAndroidMkVariablesFromCquery(info cquery.CcAndroidMkInfo) { 2145 c.Properties.AndroidMkSharedLibs = info.LocalSharedLibs 2146 c.Properties.AndroidMkStaticLibs = info.LocalStaticLibs 2147 c.Properties.AndroidMkWholeStaticLibs = info.LocalWholeStaticLibs 2148} 2149 2150func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain { 2151 if c.cachedToolchain == nil { 2152 c.cachedToolchain = config.FindToolchainWithContext(ctx) 2153 } 2154 return c.cachedToolchain 2155} 2156 2157func (c *Module) begin(ctx BaseModuleContext) { 2158 if c.compiler != nil { 2159 c.compiler.compilerInit(ctx) 2160 } 2161 if c.linker != nil { 2162 c.linker.linkerInit(ctx) 2163 } 2164 if c.stl != nil { 2165 c.stl.begin(ctx) 2166 } 2167 if c.sanitize != nil { 2168 c.sanitize.begin(ctx) 2169 } 2170 if c.coverage != nil { 2171 c.coverage.begin(ctx) 2172 } 2173 if c.lto != nil { 2174 c.lto.begin(ctx) 2175 } 2176 if c.pgo != nil { 2177 c.pgo.begin(ctx) 2178 } 2179 if ctx.useSdk() && c.IsSdkVariant() { 2180 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion()) 2181 if err != nil { 2182 ctx.PropertyErrorf("sdk_version", err.Error()) 2183 c.Properties.Sdk_version = nil 2184 } else { 2185 c.Properties.Sdk_version = StringPtr(version.String()) 2186 } 2187 } 2188} 2189 2190func (c *Module) deps(ctx DepsContext) Deps { 2191 deps := Deps{} 2192 2193 if c.compiler != nil { 2194 deps = c.compiler.compilerDeps(ctx, deps) 2195 } 2196 if c.linker != nil { 2197 deps = c.linker.linkerDeps(ctx, deps) 2198 } 2199 if c.stl != nil { 2200 deps = c.stl.deps(ctx, deps) 2201 } 2202 if c.coverage != nil { 2203 deps = c.coverage.deps(ctx, deps) 2204 } 2205 2206 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs) 2207 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs) 2208 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs) 2209 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs) 2210 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs) 2211 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs) 2212 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs) 2213 2214 for _, lib := range deps.ReexportSharedLibHeaders { 2215 if !inList(lib, deps.SharedLibs) { 2216 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib) 2217 } 2218 } 2219 2220 for _, lib := range deps.ReexportStaticLibHeaders { 2221 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) { 2222 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs or whole_static_libs: '%s'", lib) 2223 } 2224 } 2225 2226 for _, lib := range deps.ReexportHeaderLibHeaders { 2227 if !inList(lib, deps.HeaderLibs) { 2228 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib) 2229 } 2230 } 2231 2232 for _, gen := range deps.ReexportGeneratedHeaders { 2233 if !inList(gen, deps.GeneratedHeaders) { 2234 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen) 2235 } 2236 } 2237 2238 return deps 2239} 2240 2241func (c *Module) beginMutator(actx android.BottomUpMutatorContext) { 2242 ctx := &baseModuleContext{ 2243 BaseModuleContext: actx, 2244 moduleContextImpl: moduleContextImpl{ 2245 mod: c, 2246 }, 2247 } 2248 ctx.ctx = ctx 2249 2250 if !actx.Host() || !ctx.static() || ctx.staticBinary() { 2251 c.afdo.addDep(ctx, actx) 2252 } 2253 2254 c.begin(ctx) 2255} 2256 2257// Split name#version into name and version 2258func StubsLibNameAndVersion(name string) (string, string) { 2259 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 { 2260 version := name[sharp+1:] 2261 libname := name[:sharp] 2262 return libname, version 2263 } 2264 return name, "" 2265} 2266 2267func GetCrtVariations(ctx android.BottomUpMutatorContext, 2268 m LinkableInterface) []blueprint.Variation { 2269 if ctx.Os() != android.Android { 2270 return nil 2271 } 2272 if m.UseSdk() { 2273 // Choose the CRT that best satisfies the min_sdk_version requirement of this module 2274 minSdkVersion := m.MinSdkVersion() 2275 if minSdkVersion == "" || minSdkVersion == "apex_inherit" { 2276 minSdkVersion = m.SdkVersion() 2277 } 2278 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion) 2279 if err != nil { 2280 ctx.PropertyErrorf("min_sdk_version", err.Error()) 2281 } 2282 2283 // Raise the minSdkVersion to the minimum supported for the architecture. 2284 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType) 2285 if apiLevel.LessThan(minApiForArch) { 2286 apiLevel = minApiForArch 2287 } 2288 2289 return []blueprint.Variation{ 2290 {Mutator: "sdk", Variation: "sdk"}, 2291 {Mutator: "version", Variation: apiLevel.String()}, 2292 } 2293 } 2294 return []blueprint.Variation{ 2295 {Mutator: "sdk", Variation: ""}, 2296 } 2297} 2298 2299func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface, 2300 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) { 2301 2302 variations = append([]blueprint.Variation(nil), variations...) 2303 2304 if version != "" && canBeOrLinkAgainstVersionVariants(mod) { 2305 // Version is explicitly specified. i.e. libFoo#30 2306 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version}) 2307 if tag, ok := depTag.(libraryDependencyTag); ok { 2308 tag.explicitlyVersioned = true 2309 } else { 2310 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag)) 2311 } 2312 } 2313 2314 if far { 2315 ctx.AddFarVariationDependencies(variations, depTag, name) 2316 } else { 2317 ctx.AddVariationDependencies(variations, depTag, name) 2318 } 2319} 2320 2321func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo { 2322 apiImportInfo := multitree.ApiImportInfo{} 2323 2324 if c.Device() { 2325 var apiImportModule []blueprint.Module 2326 if actx.OtherModuleExists("api_imports") { 2327 apiImportModule = actx.AddDependency(c, nil, "api_imports") 2328 if len(apiImportModule) > 0 && apiImportModule[0] != nil { 2329 apiInfo := actx.OtherModuleProvider(apiImportModule[0], multitree.ApiImportsProvider).(multitree.ApiImportInfo) 2330 apiImportInfo = apiInfo 2331 actx.SetProvider(multitree.ApiImportsProvider, apiInfo) 2332 } 2333 } 2334 } 2335 2336 return apiImportInfo 2337} 2338 2339func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo { 2340 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of 2341 // SnapshotInfo, which provides no mappings. 2342 if *snapshotInfo == nil && c.Device() { 2343 // Only retrieve the snapshot on demand in order to avoid circular dependencies 2344 // between the modules in the snapshot and the snapshot itself. 2345 var snapshotModule []blueprint.Module 2346 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() { 2347 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot") 2348 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() { 2349 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot") 2350 } 2351 if len(snapshotModule) > 0 && snapshotModule[0] != nil { 2352 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo) 2353 *snapshotInfo = &snapshot 2354 // republish the snapshot for use in later mutators on this module 2355 actx.SetProvider(SnapshotInfoProvider, snapshot) 2356 } 2357 } 2358 if *snapshotInfo == nil { 2359 *snapshotInfo = &SnapshotInfo{} 2360 } 2361 return **snapshotInfo 2362} 2363 2364func GetReplaceModuleName(lib string, replaceMap map[string]string) string { 2365 if snapshot, ok := replaceMap[lib]; ok { 2366 return snapshot 2367 } 2368 2369 return lib 2370} 2371 2372// RewriteLibs takes a list of names of shared libraries and scans it for three types 2373// of names: 2374// 2375// 1. Name of an NDK library that refers to a prebuilt module. 2376// 2377// For each of these, it adds the name of the prebuilt module (which will be in 2378// prebuilts/ndk) to the list of nonvariant libs. 2379// 2380// 2. Name of an NDK library that refers to an ndk_library module. 2381// 2382// For each of these, it adds the name of the ndk_library module to the list of 2383// variant libs. 2384// 2385// 3. Anything else (so anything that isn't an NDK library). 2386// 2387// It adds these to the nonvariantLibs list. 2388// 2389// The caller can then know to add the variantLibs dependencies differently from the 2390// nonvariantLibs 2391func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) { 2392 variantLibs = []string{} 2393 2394 nonvariantLibs = []string{} 2395 for _, entry := range list { 2396 // strip #version suffix out 2397 name, _ := StubsLibNameAndVersion(entry) 2398 if c.InRecovery() { 2399 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs)) 2400 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) { 2401 variantLibs = append(variantLibs, name+ndkLibrarySuffix) 2402 } else if c.UseVndk() { 2403 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs)) 2404 } else { 2405 // put name#version back 2406 nonvariantLibs = append(nonvariantLibs, entry) 2407 } 2408 } 2409 return nonvariantLibs, variantLibs 2410} 2411 2412func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) { 2413 nonVariantLibs := []string{} 2414 variantLibs := []string{} 2415 2416 for _, lib := range libs { 2417 replaceLibName := GetReplaceModuleName(lib, replaceList) 2418 if replaceLibName == lib { 2419 // Do not handle any libs which are not in API imports 2420 nonVariantLibs = append(nonVariantLibs, replaceLibName) 2421 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) { 2422 variantLibs = append(variantLibs, replaceLibName) 2423 } else { 2424 nonVariantLibs = append(nonVariantLibs, replaceLibName) 2425 } 2426 } 2427 2428 return nonVariantLibs, variantLibs 2429} 2430 2431func (c *Module) shouldUseApiSurface() bool { 2432 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled { 2433 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant { 2434 // LLNDK Variant 2435 return true 2436 } 2437 2438 if c.Properties.IsSdkVariant { 2439 // NDK Variant 2440 return true 2441 } 2442 2443 if c.isImportedApiLibrary() { 2444 // API Library should depend on API headers 2445 return true 2446 } 2447 } 2448 2449 return false 2450} 2451 2452func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { 2453 if !c.Enabled() { 2454 return 2455 } 2456 2457 ctx := &depsContext{ 2458 BottomUpMutatorContext: actx, 2459 moduleContextImpl: moduleContextImpl{ 2460 mod: c, 2461 }, 2462 } 2463 ctx.ctx = ctx 2464 2465 deps := c.deps(ctx) 2466 apiImportInfo := GetApiImports(c, actx) 2467 2468 apiNdkLibs := []string{} 2469 apiLateNdkLibs := []string{} 2470 2471 if c.shouldUseApiSurface() { 2472 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config()) 2473 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config()) 2474 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config()) 2475 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config()) 2476 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config()) 2477 } 2478 2479 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs 2480 2481 var snapshotInfo *SnapshotInfo 2482 2483 variantNdkLibs := []string{} 2484 variantLateNdkLibs := []string{} 2485 if ctx.Os() == android.Android { 2486 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs) 2487 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs) 2488 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders) 2489 2490 for idx, lib := range deps.RuntimeLibs { 2491 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs) 2492 } 2493 } 2494 2495 for _, lib := range deps.HeaderLibs { 2496 depTag := libraryDependencyTag{Kind: headerLibraryDependency} 2497 if inList(lib, deps.ReexportHeaderLibHeaders) { 2498 depTag.reexportFlags = true 2499 } 2500 2501 // Check header lib replacement from API surface first, and then check again with VSDK 2502 if c.shouldUseApiSurface() { 2503 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs) 2504 } 2505 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs) 2506 2507 if c.isNDKStubLibrary() { 2508 // ndk_headers do not have any variations 2509 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib) 2510 } else if c.IsStubs() && !c.isImportedApiLibrary() { 2511 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()), 2512 depTag, lib) 2513 } else { 2514 actx.AddVariationDependencies(nil, depTag, lib) 2515 } 2516 } 2517 2518 if c.isNDKStubLibrary() { 2519 // NDK stubs depend on their implementation because the ABI dumps are 2520 // generated from the implementation library. 2521 2522 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), 2523 c.ImageVariation(), 2524 blueprint.Variation{Mutator: "link", Variation: "shared"}, 2525 ), stubImplementation, c.BaseModuleName()) 2526 } 2527 2528 for _, lib := range deps.WholeStaticLibs { 2529 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true} 2530 2531 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs) 2532 2533 actx.AddVariationDependencies([]blueprint.Variation{ 2534 {Mutator: "link", Variation: "static"}, 2535 }, depTag, lib) 2536 } 2537 2538 for _, lib := range deps.StaticLibs { 2539 depTag := libraryDependencyTag{Kind: staticLibraryDependency} 2540 if inList(lib, deps.ReexportStaticLibHeaders) { 2541 depTag.reexportFlags = true 2542 } 2543 if inList(lib, deps.ExcludeLibsForApex) { 2544 depTag.excludeInApex = true 2545 } 2546 2547 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs) 2548 2549 actx.AddVariationDependencies([]blueprint.Variation{ 2550 {Mutator: "link", Variation: "static"}, 2551 }, depTag, lib) 2552 } 2553 2554 // staticUnwinderDep is treated as staticDep for Q apexes 2555 // so that native libraries/binaries are linked with static unwinder 2556 // because Q libc doesn't have unwinder APIs 2557 if deps.StaticUnwinderIfLegacy { 2558 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true} 2559 actx.AddVariationDependencies([]blueprint.Variation{ 2560 {Mutator: "link", Variation: "static"}, 2561 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs)) 2562 } 2563 2564 // shared lib names without the #version suffix 2565 var sharedLibNames []string 2566 2567 for _, lib := range deps.SharedLibs { 2568 depTag := libraryDependencyTag{Kind: sharedLibraryDependency} 2569 if inList(lib, deps.ReexportSharedLibHeaders) { 2570 depTag.reexportFlags = true 2571 } 2572 if inList(lib, deps.ExcludeLibsForApex) { 2573 depTag.excludeInApex = true 2574 } 2575 2576 name, version := StubsLibNameAndVersion(lib) 2577 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) { 2578 name = apiLibraryName 2579 } 2580 sharedLibNames = append(sharedLibNames, name) 2581 2582 variations := []blueprint.Variation{ 2583 {Mutator: "link", Variation: "shared"}, 2584 } 2585 2586 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) { 2587 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false) 2588 } 2589 2590 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok { 2591 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false) 2592 } 2593 } 2594 2595 for _, lib := range deps.LateStaticLibs { 2596 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency} 2597 actx.AddVariationDependencies([]blueprint.Variation{ 2598 {Mutator: "link", Variation: "static"}, 2599 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)) 2600 } 2601 2602 for _, lib := range deps.UnexportedStaticLibs { 2603 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true} 2604 actx.AddVariationDependencies([]blueprint.Variation{ 2605 {Mutator: "link", Variation: "static"}, 2606 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)) 2607 } 2608 2609 for _, lib := range deps.LateSharedLibs { 2610 if inList(lib, sharedLibNames) { 2611 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...) 2612 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be 2613 // linking against both the stubs lib and the non-stubs lib at the same time. 2614 continue 2615 } 2616 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency} 2617 variations := []blueprint.Variation{ 2618 {Mutator: "link", Variation: "shared"}, 2619 } 2620 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false) 2621 } 2622 2623 actx.AddVariationDependencies([]blueprint.Variation{ 2624 {Mutator: "link", Variation: "shared"}, 2625 }, dataLibDepTag, deps.DataLibs...) 2626 2627 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...) 2628 2629 actx.AddVariationDependencies([]blueprint.Variation{ 2630 {Mutator: "link", Variation: "shared"}, 2631 }, runtimeDepTag, deps.RuntimeLibs...) 2632 2633 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...) 2634 2635 for _, gen := range deps.GeneratedHeaders { 2636 depTag := genHeaderDepTag 2637 if inList(gen, deps.ReexportGeneratedHeaders) { 2638 depTag = genHeaderExportDepTag 2639 } 2640 actx.AddDependency(c, depTag, gen) 2641 } 2642 2643 crtVariations := GetCrtVariations(ctx, c) 2644 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...) 2645 for _, crt := range deps.CrtBegin { 2646 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag, 2647 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects)) 2648 } 2649 for _, crt := range deps.CrtEnd { 2650 actx.AddVariationDependencies(crtVariations, CrtEndDepTag, 2651 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects)) 2652 } 2653 if deps.DynamicLinker != "" { 2654 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker) 2655 } 2656 2657 version := ctx.sdkVersion() 2658 2659 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version} 2660 actx.AddVariationDependencies([]blueprint.Variation{ 2661 {Mutator: "version", Variation: version}, 2662 {Mutator: "link", Variation: "shared"}, 2663 }, ndkStubDepTag, variantNdkLibs...) 2664 actx.AddVariationDependencies([]blueprint.Variation{ 2665 {Mutator: "version", Variation: version}, 2666 {Mutator: "link", Variation: "shared"}, 2667 }, ndkStubDepTag, apiNdkLibs...) 2668 2669 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version} 2670 actx.AddVariationDependencies([]blueprint.Variation{ 2671 {Mutator: "version", Variation: version}, 2672 {Mutator: "link", Variation: "shared"}, 2673 }, ndkLateStubDepTag, variantLateNdkLibs...) 2674 actx.AddVariationDependencies([]blueprint.Variation{ 2675 {Mutator: "version", Variation: version}, 2676 {Mutator: "link", Variation: "shared"}, 2677 }, ndkLateStubDepTag, apiLateNdkLibs...) 2678 2679 if vndkdep := c.vndkdep; vndkdep != nil { 2680 if vndkdep.isVndkExt() { 2681 actx.AddVariationDependencies([]blueprint.Variation{ 2682 c.ImageVariation(), 2683 {Mutator: "link", Variation: "shared"}, 2684 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs)) 2685 } 2686 } 2687 2688 updateImportedLibraryDependency(ctx) 2689} 2690 2691func BeginMutator(ctx android.BottomUpMutatorContext) { 2692 if c, ok := ctx.Module().(*Module); ok && c.Enabled() { 2693 c.beginMutator(ctx) 2694 } 2695} 2696 2697// Whether a module can link to another module, taking into 2698// account NDK linking. 2699func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface, 2700 tag blueprint.DependencyTag) { 2701 2702 switch t := tag.(type) { 2703 case dependencyTag: 2704 if t != vndkExtDepTag { 2705 return 2706 } 2707 case libraryDependencyTag: 2708 default: 2709 return 2710 } 2711 2712 if from.Target().Os != android.Android { 2713 // Host code is not restricted 2714 return 2715 } 2716 2717 // VNDK is cc.Module supported only for now. 2718 if ccFrom, ok := from.(*Module); ok && from.UseVndk() { 2719 // Though allowed dependency is limited by the image mutator, 2720 // each vendor and product module needs to check link-type 2721 // for VNDK. 2722 if ccTo, ok := to.(*Module); ok { 2723 if ccFrom.vndkdep != nil { 2724 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag) 2725 } 2726 } else if _, ok := to.(LinkableInterface); !ok { 2727 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type") 2728 } 2729 return 2730 } 2731 // TODO(b/244244438) : Remove this once all variants are implemented 2732 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() { 2733 return 2734 } 2735 if from.SdkVersion() == "" { 2736 // Platform code can link to anything 2737 return 2738 } 2739 if from.InRamdisk() { 2740 // Ramdisk code is not NDK 2741 return 2742 } 2743 if from.InVendorRamdisk() { 2744 // Vendor ramdisk code is not NDK 2745 return 2746 } 2747 if from.InRecovery() { 2748 // Recovery code is not NDK 2749 return 2750 } 2751 if c, ok := to.(*Module); ok { 2752 if c.NdkPrebuiltStl() { 2753 // These are allowed, but they don't set sdk_version 2754 return 2755 } 2756 if c.StubDecorator() { 2757 // These aren't real libraries, but are the stub shared libraries that are included in 2758 // the NDK. 2759 return 2760 } 2761 if c.isImportedApiLibrary() { 2762 // Imported library from the API surface is a stub library built against interface definition. 2763 return 2764 } 2765 } 2766 2767 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" { 2768 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version) 2769 // to link to libc++ (non-NDK and without sdk_version). 2770 return 2771 } 2772 2773 if to.SdkVersion() == "" { 2774 // NDK code linking to platform code is never okay. 2775 ctx.ModuleErrorf("depends on non-NDK-built library %q", 2776 ctx.OtherModuleName(to.Module())) 2777 return 2778 } 2779 2780 // At this point we know we have two NDK libraries, but we need to 2781 // check that we're not linking against anything built against a higher 2782 // API level, as it is only valid to link against older or equivalent 2783 // APIs. 2784 2785 // Current can link against anything. 2786 if from.SdkVersion() != "current" { 2787 // Otherwise we need to check. 2788 if to.SdkVersion() == "current" { 2789 // Current can't be linked against by anything else. 2790 ctx.ModuleErrorf("links %q built against newer API version %q", 2791 ctx.OtherModuleName(to.Module()), "current") 2792 } else { 2793 fromApi, err := strconv.Atoi(from.SdkVersion()) 2794 if err != nil { 2795 ctx.PropertyErrorf("sdk_version", 2796 "Invalid sdk_version value (must be int or current): %q", 2797 from.SdkVersion()) 2798 } 2799 toApi, err := strconv.Atoi(to.SdkVersion()) 2800 if err != nil { 2801 ctx.PropertyErrorf("sdk_version", 2802 "Invalid sdk_version value (must be int or current): %q", 2803 to.SdkVersion()) 2804 } 2805 2806 if toApi > fromApi { 2807 ctx.ModuleErrorf("links %q built against newer API version %q", 2808 ctx.OtherModuleName(to.Module()), to.SdkVersion()) 2809 } 2810 } 2811 } 2812 2813 // Also check that the two STL choices are compatible. 2814 fromStl := from.SelectedStl() 2815 toStl := to.SelectedStl() 2816 if fromStl == "" || toStl == "" { 2817 // Libraries that don't use the STL are unrestricted. 2818 } else if fromStl == "ndk_system" || toStl == "ndk_system" { 2819 // We can be permissive with the system "STL" since it is only the C++ 2820 // ABI layer, but in the future we should make sure that everyone is 2821 // using either libc++ or nothing. 2822 } else if getNdkStlFamily(from) != getNdkStlFamily(to) { 2823 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q", 2824 from.SelectedStl(), ctx.OtherModuleName(to.Module()), 2825 to.SelectedStl()) 2826 } 2827} 2828 2829func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) { 2830 if c, ok := ctx.Module().(*Module); ok { 2831 ctx.VisitDirectDeps(func(dep android.Module) { 2832 depTag := ctx.OtherModuleDependencyTag(dep) 2833 ccDep, ok := dep.(LinkableInterface) 2834 if ok { 2835 checkLinkType(ctx, c, ccDep, depTag) 2836 } 2837 }) 2838 } 2839} 2840 2841// Tests whether the dependent library is okay to be double loaded inside a single process. 2842// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library, 2843// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true 2844// or as vndk-sp (vndk: { enabled: true, support_system_process: true}). 2845func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) { 2846 check := func(child, parent android.Module) bool { 2847 to, ok := child.(*Module) 2848 if !ok { 2849 return false 2850 } 2851 2852 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() { 2853 return false 2854 } 2855 2856 // These dependencies are not excercised at runtime. Tracking these will give us 2857 // false negative, so skip. 2858 depTag := ctx.OtherModuleDependencyTag(child) 2859 if IsHeaderDepTag(depTag) { 2860 return false 2861 } 2862 if depTag == staticVariantTag { 2863 return false 2864 } 2865 if depTag == stubImplDepTag { 2866 return false 2867 } 2868 2869 // Even if target lib has no vendor variant, keep checking dependency 2870 // graph in case it depends on vendor_available or product_available 2871 // but not double_loadable transtively. 2872 if !to.HasNonSystemVariants() { 2873 return true 2874 } 2875 2876 // The happy path. Keep tracking dependencies until we hit a non double-loadable 2877 // one. 2878 if Bool(to.VendorProperties.Double_loadable) { 2879 return true 2880 } 2881 2882 if to.IsVndkSp() || to.IsLlndk() { 2883 return false 2884 } 2885 2886 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+ 2887 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+ 2888 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false)) 2889 return false 2890 } 2891 if module, ok := ctx.Module().(*Module); ok { 2892 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() { 2893 if lib.hasLLNDKStubs() { 2894 ctx.WalkDeps(check) 2895 } 2896 } 2897 } 2898} 2899 2900func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel { 2901 // For the dependency from platform to apex, use the latest stubs 2902 apexSdkVersion := android.FutureApiLevel 2903 if !apexInfo.IsForPlatform() { 2904 apexSdkVersion = apexInfo.MinSdkVersion 2905 } 2906 2907 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) { 2908 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000) 2909 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)). 2910 // (b/144430859) 2911 apexSdkVersion = android.FutureApiLevel 2912 } 2913 2914 return apexSdkVersion 2915} 2916 2917// Convert dependencies to paths. Returns a PathDeps containing paths 2918func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { 2919 var depPaths PathDeps 2920 2921 var directStaticDeps []StaticLibraryInfo 2922 var directSharedDeps []SharedLibraryInfo 2923 2924 reexportExporter := func(exporter FlagExporterInfo) { 2925 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...) 2926 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...) 2927 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...) 2928 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...) 2929 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...) 2930 } 2931 2932 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) 2933 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo) 2934 2935 skipModuleList := map[string]bool{} 2936 2937 var apiImportInfo multitree.ApiImportInfo 2938 hasApiImportInfo := false 2939 2940 ctx.VisitDirectDeps(func(dep android.Module) { 2941 if dep.Name() == "api_imports" { 2942 apiImportInfo = ctx.OtherModuleProvider(dep, multitree.ApiImportsProvider).(multitree.ApiImportInfo) 2943 hasApiImportInfo = true 2944 } 2945 }) 2946 2947 if hasApiImportInfo { 2948 targetStubModuleList := map[string]string{} 2949 targetOrigModuleList := map[string]string{} 2950 2951 // Search for dependency which both original module and API imported library with APEX stub exists 2952 ctx.VisitDirectDeps(func(dep android.Module) { 2953 depName := ctx.OtherModuleName(dep) 2954 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok { 2955 targetStubModuleList[apiLibrary] = depName 2956 } 2957 }) 2958 ctx.VisitDirectDeps(func(dep android.Module) { 2959 depName := ctx.OtherModuleName(dep) 2960 if origLibrary, ok := targetStubModuleList[depName]; ok { 2961 targetOrigModuleList[origLibrary] = depName 2962 } 2963 }) 2964 2965 // Decide which library should be used between original and API imported library 2966 ctx.VisitDirectDeps(func(dep android.Module) { 2967 depName := ctx.OtherModuleName(dep) 2968 if apiLibrary, ok := targetOrigModuleList[depName]; ok { 2969 if ShouldUseStubForApex(ctx, dep) { 2970 skipModuleList[depName] = true 2971 } else { 2972 skipModuleList[apiLibrary] = true 2973 } 2974 } 2975 }) 2976 } 2977 2978 ctx.VisitDirectDeps(func(dep android.Module) { 2979 depName := ctx.OtherModuleName(dep) 2980 depTag := ctx.OtherModuleDependencyTag(dep) 2981 2982 if _, ok := skipModuleList[depName]; ok { 2983 // skip this module because original module or API imported module matching with this should be used instead. 2984 return 2985 } 2986 2987 if depTag == android.DarwinUniversalVariantTag { 2988 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile() 2989 return 2990 } 2991 2992 ccDep, ok := dep.(LinkableInterface) 2993 if !ok { 2994 2995 // handling for a few module types that aren't cc Module but that are also supported 2996 switch depTag { 2997 case genSourceDepTag: 2998 if genRule, ok := dep.(genrule.SourceFileGenerator); ok { 2999 depPaths.GeneratedSources = append(depPaths.GeneratedSources, 3000 genRule.GeneratedSourceFiles()...) 3001 } else { 3002 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName) 3003 } 3004 // Support exported headers from a generated_sources dependency 3005 fallthrough 3006 case genHeaderDepTag, genHeaderExportDepTag: 3007 if genRule, ok := dep.(genrule.SourceFileGenerator); ok { 3008 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, 3009 genRule.GeneratedDeps()...) 3010 dirs := genRule.GeneratedHeaderDirs() 3011 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...) 3012 if depTag == genHeaderExportDepTag { 3013 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...) 3014 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, 3015 genRule.GeneratedSourceFiles()...) 3016 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...) 3017 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. 3018 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...) 3019 3020 } 3021 } else { 3022 ctx.ModuleErrorf("module %q is not a genrule", depName) 3023 } 3024 case CrtBeginDepTag: 3025 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, "")) 3026 case CrtEndDepTag: 3027 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, "")) 3028 } 3029 return 3030 } 3031 3032 if depTag == android.ProtoPluginDepTag { 3033 return 3034 } 3035 3036 if dep.Target().Os != ctx.Os() { 3037 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName) 3038 return 3039 } 3040 if dep.Target().Arch.ArchType != ctx.Arch().ArchType { 3041 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)", 3042 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType) 3043 return 3044 } 3045 3046 if depTag == reuseObjTag { 3047 // Skip reused objects for stub libraries, they use their own stub object file instead. 3048 // The reuseObjTag dependency still exists because the LinkageMutator runs before the 3049 // version mutator, so the stubs variant is created from the shared variant that 3050 // already has the reuseObjTag dependency on the static variant. 3051 if !c.library.buildStubs() { 3052 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo) 3053 objs := staticAnalogue.ReuseObjects 3054 depPaths.Objs = depPaths.Objs.Append(objs) 3055 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo) 3056 reexportExporter(depExporterInfo) 3057 } 3058 return 3059 } 3060 3061 linkFile := ccDep.OutputFile() 3062 3063 if libDepTag, ok := depTag.(libraryDependencyTag); ok { 3064 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859) 3065 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) { 3066 return 3067 } 3068 3069 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex { 3070 return 3071 } 3072 3073 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo) 3074 3075 var ptr *android.Paths 3076 var depPtr *android.Paths 3077 3078 depFile := android.OptionalPath{} 3079 3080 switch { 3081 case libDepTag.header(): 3082 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) { 3083 if !ctx.Config().AllowMissingDependencies() { 3084 ctx.ModuleErrorf("module %q is not a header library", depName) 3085 } else { 3086 ctx.AddMissingDependencies([]string{depName}) 3087 } 3088 return 3089 } 3090 case libDepTag.shared(): 3091 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) { 3092 if !ctx.Config().AllowMissingDependencies() { 3093 ctx.ModuleErrorf("module %q is not a shared library", depName) 3094 } else { 3095 ctx.AddMissingDependencies([]string{depName}) 3096 } 3097 return 3098 } 3099 3100 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep) 3101 depExporterInfo = returnedDepExporterInfo 3102 3103 // Stubs lib doesn't link to the shared lib dependencies. Don't set 3104 // linkFile, depFile, and ptr. 3105 if c.IsStubs() { 3106 break 3107 } 3108 3109 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary) 3110 depFile = sharedLibraryInfo.TableOfContents 3111 3112 ptr = &depPaths.SharedLibs 3113 switch libDepTag.Order { 3114 case earlyLibraryDependency: 3115 ptr = &depPaths.EarlySharedLibs 3116 depPtr = &depPaths.EarlySharedLibsDeps 3117 case normalLibraryDependency: 3118 ptr = &depPaths.SharedLibs 3119 depPtr = &depPaths.SharedLibsDeps 3120 directSharedDeps = append(directSharedDeps, sharedLibraryInfo) 3121 case lateLibraryDependency: 3122 ptr = &depPaths.LateSharedLibs 3123 depPtr = &depPaths.LateSharedLibsDeps 3124 default: 3125 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order)) 3126 } 3127 case libDepTag.static(): 3128 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) { 3129 if !ctx.Config().AllowMissingDependencies() { 3130 ctx.ModuleErrorf("module %q is not a static library", depName) 3131 } else { 3132 ctx.AddMissingDependencies([]string{depName}) 3133 } 3134 return 3135 } 3136 3137 // Stubs lib doesn't link to the static lib dependencies. Don't set 3138 // linkFile, depFile, and ptr. 3139 if c.IsStubs() { 3140 break 3141 } 3142 3143 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo) 3144 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary) 3145 if libDepTag.wholeStatic { 3146 ptr = &depPaths.WholeStaticLibs 3147 if len(staticLibraryInfo.Objects.objFiles) > 0 { 3148 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects) 3149 } else { 3150 // This case normally catches prebuilt static 3151 // libraries, but it can also occur when 3152 // AllowMissingDependencies is on and the 3153 // dependencies has no sources of its own 3154 // but has a whole_static_libs dependency 3155 // on a missing library. We want to depend 3156 // on the .a file so that there is something 3157 // in the dependency tree that contains the 3158 // error rule for the missing transitive 3159 // dependency. 3160 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path()) 3161 } 3162 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, 3163 staticLibraryInfo.WholeStaticLibsFromPrebuilts...) 3164 } else { 3165 switch libDepTag.Order { 3166 case earlyLibraryDependency: 3167 panic(fmt.Errorf("early static libs not suppported")) 3168 case normalLibraryDependency: 3169 // static dependencies will be handled separately so they can be ordered 3170 // using transitive dependencies. 3171 ptr = nil 3172 directStaticDeps = append(directStaticDeps, staticLibraryInfo) 3173 case lateLibraryDependency: 3174 ptr = &depPaths.LateStaticLibs 3175 default: 3176 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order)) 3177 } 3178 } 3179 if libDepTag.unexportedSymbols { 3180 depPaths.LdFlags = append(depPaths.LdFlags, 3181 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base()) 3182 } 3183 } 3184 3185 if libDepTag.static() && !libDepTag.wholeStatic { 3186 if !ccDep.CcLibraryInterface() || !ccDep.Static() { 3187 ctx.ModuleErrorf("module %q not a static library", depName) 3188 return 3189 } 3190 3191 // When combining coverage files for shared libraries and executables, coverage files 3192 // in static libraries act as if they were whole static libraries. The same goes for 3193 // source based Abi dump files. 3194 if c, ok := ccDep.(*Module); ok { 3195 staticLib := c.linker.(libraryInterface) 3196 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles, 3197 staticLib.objs().coverageFiles...) 3198 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles, 3199 staticLib.objs().sAbiDumpFiles...) 3200 } else { 3201 // Handle non-CC modules here 3202 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles, 3203 ccDep.CoverageFiles()...) 3204 } 3205 } 3206 3207 if ptr != nil { 3208 if !linkFile.Valid() { 3209 if !ctx.Config().AllowMissingDependencies() { 3210 ctx.ModuleErrorf("module %q missing output file", depName) 3211 } else { 3212 ctx.AddMissingDependencies([]string{depName}) 3213 } 3214 return 3215 } 3216 *ptr = append(*ptr, linkFile.Path()) 3217 } 3218 3219 if depPtr != nil { 3220 dep := depFile 3221 if !dep.Valid() { 3222 dep = linkFile 3223 } 3224 *depPtr = append(*depPtr, dep.Path()) 3225 } 3226 3227 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...) 3228 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...) 3229 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...) 3230 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...) 3231 3232 if libDepTag.reexportFlags { 3233 reexportExporter(depExporterInfo) 3234 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. 3235 // Re-exported shared library headers must be included as well since they can help us with type information 3236 // about template instantiations (instantiated from their headers). 3237 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version 3238 // scripts. 3239 c.sabi.Properties.ReexportedIncludes = append( 3240 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...) 3241 } 3242 3243 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix 3244 switch { 3245 case libDepTag.header(): 3246 c.Properties.AndroidMkHeaderLibs = append( 3247 c.Properties.AndroidMkHeaderLibs, makeLibName) 3248 case libDepTag.shared(): 3249 if lib := moduleLibraryInterface(dep); lib != nil { 3250 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() { 3251 // Add the dependency to the APEX(es) providing the library so that 3252 // m <module> can trigger building the APEXes as well. 3253 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo) 3254 for _, an := range depApexInfo.InApexVariants { 3255 c.Properties.ApexesProvidingSharedLibs = append( 3256 c.Properties.ApexesProvidingSharedLibs, an) 3257 } 3258 } 3259 } 3260 3261 // Note: the order of libs in this list is not important because 3262 // they merely serve as Make dependencies and do not affect this lib itself. 3263 c.Properties.AndroidMkSharedLibs = append( 3264 c.Properties.AndroidMkSharedLibs, makeLibName) 3265 // Record BaseLibName for snapshots. 3266 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName)) 3267 case libDepTag.static(): 3268 if libDepTag.wholeStatic { 3269 c.Properties.AndroidMkWholeStaticLibs = append( 3270 c.Properties.AndroidMkWholeStaticLibs, makeLibName) 3271 } else { 3272 c.Properties.AndroidMkStaticLibs = append( 3273 c.Properties.AndroidMkStaticLibs, makeLibName) 3274 } 3275 // Record BaseLibName for snapshots. 3276 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName)) 3277 } 3278 } else if !c.IsStubs() { 3279 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies. 3280 3281 switch depTag { 3282 case runtimeDepTag: 3283 c.Properties.AndroidMkRuntimeLibs = append( 3284 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix) 3285 // Record BaseLibName for snapshots. 3286 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName)) 3287 case objDepTag: 3288 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path()) 3289 case CrtBeginDepTag: 3290 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path()) 3291 case CrtEndDepTag: 3292 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path()) 3293 case dynamicLinkerDepTag: 3294 depPaths.DynamicLinker = linkFile 3295 } 3296 } 3297 }) 3298 3299 // use the ordered dependencies as this module's dependencies 3300 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps) 3301 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs 3302 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...) 3303 3304 // Dedup exported flags from dependencies 3305 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags) 3306 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs) 3307 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs) 3308 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps) 3309 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs) 3310 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs) 3311 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags) 3312 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps) 3313 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders) 3314 3315 if c.sabi != nil { 3316 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes) 3317 } 3318 3319 return depPaths 3320} 3321 3322func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool { 3323 depName := ctx.OtherModuleName(dep) 3324 thisModule, ok := ctx.Module().(android.ApexModule) 3325 if !ok { 3326 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName())) 3327 } 3328 3329 useVndk := false 3330 bootstrap := false 3331 if linkable, ok := ctx.Module().(LinkableInterface); !ok { 3332 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName())) 3333 } else { 3334 useVndk = linkable.UseVndk() 3335 bootstrap = linkable.Bootstrap() 3336 } 3337 3338 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) 3339 3340 useStubs := false 3341 3342 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK 3343 if !apexInfo.IsForPlatform() { 3344 // For platform libraries, use current version of LLNDK 3345 // If this is for use_vendor apex we will apply the same rules 3346 // of apex sdk enforcement below to choose right version. 3347 useStubs = true 3348 } 3349 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis { 3350 // If not building for APEX or the containing APEX allows the use of 3351 // platform APIs, use stubs only when it is from an APEX (and not from 3352 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or 3353 // bootstrap modules, always link to non-stub variant 3354 isNotInPlatform := dep.(android.ApexModule).NotInPlatform() 3355 3356 isApexImportedApiLibrary := false 3357 3358 if cc, ok := dep.(*Module); ok { 3359 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok { 3360 if apiLibrary.hasApexStubs() { 3361 isApexImportedApiLibrary = true 3362 } 3363 } 3364 } 3365 3366 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap 3367 3368 if useStubs { 3369 // Another exception: if this module is a test for an APEX, then 3370 // it is linked with the non-stub variant of a module in the APEX 3371 // as if this is part of the APEX. 3372 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo) 3373 for _, apexContents := range testFor.ApexContents { 3374 if apexContents.DirectlyInApex(depName) { 3375 useStubs = false 3376 break 3377 } 3378 } 3379 } 3380 if useStubs { 3381 // Yet another exception: If this module and the dependency are 3382 // available to the same APEXes then skip stubs between their 3383 // platform variants. This complements the test_for case above, 3384 // which avoids the stubs on a direct APEX library dependency, by 3385 // avoiding stubs for indirect test dependencies as well. 3386 // 3387 // TODO(b/183882457): This doesn't work if the two libraries have 3388 // only partially overlapping apex_available. For that test_for 3389 // modules would need to be split into APEX variants and resolved 3390 // separately for each APEX they have access to. 3391 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) { 3392 useStubs = false 3393 } 3394 } 3395 } else { 3396 // If building for APEX, use stubs when the parent is in any APEX that 3397 // the child is not in. 3398 useStubs = !android.DirectlyInAllApexes(apexInfo, depName) 3399 } 3400 3401 return useStubs 3402} 3403 3404// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant 3405// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right 3406// dependency. The stub variant is selected when the dependency crosses a boundary where each side 3407// has different level of updatability. For example, if a library foo in an APEX depends on a 3408// library bar which provides stable interface and exists in the platform, foo uses the stub variant 3409// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the 3410// same APEX as foo, the non-stub variant of bar is used. 3411func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) { 3412 depTag := ctx.OtherModuleDependencyTag(dep) 3413 libDepTag, ok := depTag.(libraryDependencyTag) 3414 if !ok || !libDepTag.shared() { 3415 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag)) 3416 } 3417 3418 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo) 3419 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo) 3420 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo) 3421 3422 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 { 3423 // when to use (unspecified) stubs, use the latest one. 3424 if ShouldUseStubForApex(ctx, dep) { 3425 stubs := sharedLibraryStubsInfo.SharedStubLibraries 3426 toUse := stubs[len(stubs)-1] 3427 sharedLibraryInfo = toUse.SharedLibraryInfo 3428 depExporterInfo = toUse.FlagExporterInfo 3429 } 3430 } 3431 return sharedLibraryInfo, depExporterInfo 3432} 3433 3434// orderStaticModuleDeps rearranges the order of the static library dependencies of the module 3435// to match the topological order of the dependency tree, including any static analogues of 3436// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet 3437// of the transitive dependencies. 3438func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) { 3439 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL) 3440 var staticPaths android.Paths 3441 for _, staticDep := range staticDeps { 3442 staticPaths = append(staticPaths, staticDep.StaticLibrary) 3443 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering) 3444 } 3445 for _, sharedDep := range sharedDeps { 3446 if sharedDep.TransitiveStaticLibrariesForOrdering != nil { 3447 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering) 3448 } 3449 } 3450 transitiveStaticLibs := transitiveStaticLibsBuilder.Build() 3451 3452 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList() 3453 3454 // reorder the dependencies based on transitive dependencies 3455 staticPaths = android.FirstUniquePaths(staticPaths) 3456 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths) 3457 3458 if len(orderedStaticPaths) != len(staticPaths) { 3459 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths) 3460 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths)) 3461 } 3462 3463 return orderedStaticPaths, transitiveStaticLibs 3464} 3465 3466// BaseLibName trims known prefixes and suffixes 3467func BaseLibName(depName string) string { 3468 libName := strings.TrimSuffix(depName, llndkLibrarySuffix) 3469 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix) 3470 libName = android.RemoveOptionalPrebuiltPrefix(libName) 3471 return libName 3472} 3473 3474func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string { 3475 libName := BaseLibName(depName) 3476 ccDepModule, _ := ccDep.(*Module) 3477 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk() 3478 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk 3479 3480 if ccDepModule != nil { 3481 // Use base module name for snapshots when exporting to Makefile. 3482 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok { 3483 baseName := ccDepModule.BaseModuleName() 3484 3485 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix() 3486 } 3487 } 3488 3489 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() && 3490 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() { 3491 // The vendor module is a no-vendor-variant VNDK library. Depend on the 3492 // core module instead. 3493 return libName 3494 } else if ccDep.UseVndk() && nonSystemVariantsExist { 3495 // The vendor and product modules in Make will have been renamed to not conflict with the 3496 // core module, so update the dependency name here accordingly. 3497 return libName + ccDep.SubName() 3498 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() { 3499 return libName + RamdiskSuffix 3500 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() { 3501 return libName + VendorRamdiskSuffix 3502 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() { 3503 return libName + RecoverySuffix 3504 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled { 3505 return libName + NativeBridgeSuffix 3506 } else { 3507 return libName 3508 } 3509} 3510 3511func (c *Module) InstallInData() bool { 3512 if c.installer == nil { 3513 return false 3514 } 3515 return c.installer.inData() 3516} 3517 3518func (c *Module) InstallInSanitizerDir() bool { 3519 if c.installer == nil { 3520 return false 3521 } 3522 if c.sanitize != nil && c.sanitize.inSanitizerDir() { 3523 return true 3524 } 3525 return c.installer.inSanitizerDir() 3526} 3527 3528func (c *Module) InstallInRamdisk() bool { 3529 return c.InRamdisk() 3530} 3531 3532func (c *Module) InstallInVendorRamdisk() bool { 3533 return c.InVendorRamdisk() 3534} 3535 3536func (c *Module) InstallInRecovery() bool { 3537 return c.InRecovery() 3538} 3539 3540func (c *Module) MakeUninstallable() { 3541 if c.installer == nil { 3542 c.ModuleBase.MakeUninstallable() 3543 return 3544 } 3545 c.installer.makeUninstallable(c) 3546} 3547 3548func (c *Module) HostToolPath() android.OptionalPath { 3549 if c.installer == nil { 3550 return android.OptionalPath{} 3551 } 3552 return c.installer.hostToolPath() 3553} 3554 3555func (c *Module) IntermPathForModuleOut() android.OptionalPath { 3556 return c.outputFile 3557} 3558 3559func (c *Module) OutputFiles(tag string) (android.Paths, error) { 3560 switch tag { 3561 case "": 3562 if c.outputFile.Valid() { 3563 return android.Paths{c.outputFile.Path()}, nil 3564 } 3565 return android.Paths{}, nil 3566 case "unstripped": 3567 if c.linker != nil { 3568 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil 3569 } 3570 return nil, nil 3571 default: 3572 return nil, fmt.Errorf("unsupported module reference tag %q", tag) 3573 } 3574} 3575 3576func (c *Module) static() bool { 3577 if static, ok := c.linker.(interface { 3578 static() bool 3579 }); ok { 3580 return static.static() 3581 } 3582 return false 3583} 3584 3585func (c *Module) staticBinary() bool { 3586 if static, ok := c.linker.(interface { 3587 staticBinary() bool 3588 }); ok { 3589 return static.staticBinary() 3590 } 3591 return false 3592} 3593 3594func (c *Module) testBinary() bool { 3595 if test, ok := c.linker.(interface { 3596 testBinary() bool 3597 }); ok { 3598 return test.testBinary() 3599 } 3600 return false 3601} 3602 3603func (c *Module) testLibrary() bool { 3604 if test, ok := c.linker.(interface { 3605 testLibrary() bool 3606 }); ok { 3607 return test.testLibrary() 3608 } 3609 return false 3610} 3611 3612func (c *Module) benchmarkBinary() bool { 3613 if b, ok := c.linker.(interface { 3614 benchmarkBinary() bool 3615 }); ok { 3616 return b.benchmarkBinary() 3617 } 3618 return false 3619} 3620 3621func (c *Module) fuzzBinary() bool { 3622 if f, ok := c.linker.(interface { 3623 fuzzBinary() bool 3624 }); ok { 3625 return f.fuzzBinary() 3626 } 3627 return false 3628} 3629 3630// Header returns true if the module is a header-only variant. (See cc/library.go header()). 3631func (c *Module) Header() bool { 3632 if h, ok := c.linker.(interface { 3633 header() bool 3634 }); ok { 3635 return h.header() 3636 } 3637 return false 3638} 3639 3640func (c *Module) Binary() bool { 3641 if b, ok := c.linker.(interface { 3642 binary() bool 3643 }); ok { 3644 return b.binary() 3645 } 3646 return false 3647} 3648 3649func (c *Module) StaticExecutable() bool { 3650 if b, ok := c.linker.(*binaryDecorator); ok { 3651 return b.static() 3652 } 3653 return false 3654} 3655 3656func (c *Module) Object() bool { 3657 if o, ok := c.linker.(interface { 3658 object() bool 3659 }); ok { 3660 return o.object() 3661 } 3662 return false 3663} 3664 3665func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string { 3666 if c.UseVndk() { 3667 if c.IsLlndk() { 3668 if !c.IsLlndkPublic() { 3669 return "native:vndk_private" 3670 } 3671 return "native:vndk" 3672 } 3673 if c.IsVndk() && !c.IsVndkExt() { 3674 if c.IsVndkPrivate() { 3675 return "native:vndk_private" 3676 } 3677 return "native:vndk" 3678 } 3679 if c.InProduct() { 3680 return "native:product" 3681 } 3682 return "native:vendor" 3683 } else if c.InRamdisk() { 3684 return "native:ramdisk" 3685 } else if c.InVendorRamdisk() { 3686 return "native:vendor_ramdisk" 3687 } else if c.InRecovery() { 3688 return "native:recovery" 3689 } else if c.Target().Os == android.Android && c.SdkVersion() != "" { 3690 return "native:ndk:none:none" 3691 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed 3692 //family, link := getNdkStlFamilyAndLinkType(c) 3693 //return fmt.Sprintf("native:ndk:%s:%s", family, link) 3694 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() { 3695 return "native:platform_vndk" 3696 } else { 3697 return "native:platform" 3698 } 3699} 3700 3701// Overrides ApexModule.IsInstallabeToApex() 3702// Only shared/runtime libraries and "test_per_src" tests are installable to APEX. 3703func (c *Module) IsInstallableToApex() bool { 3704 if lib := c.library; lib != nil { 3705 // Stub libs and prebuilt libs in a versioned SDK are not 3706 // installable to APEX even though they are shared libs. 3707 return lib.shared() && !lib.buildStubs() 3708 } else if _, ok := c.linker.(testPerSrc); ok { 3709 return true 3710 } 3711 return false 3712} 3713 3714func (c *Module) AvailableFor(what string) bool { 3715 if linker, ok := c.linker.(interface { 3716 availableFor(string) bool 3717 }); ok { 3718 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what) 3719 } else { 3720 return c.ApexModuleBase.AvailableFor(what) 3721 } 3722} 3723 3724func (c *Module) TestFor() []string { 3725 return c.Properties.Test_for 3726} 3727 3728func (c *Module) EverInstallable() bool { 3729 return c.installer != nil && 3730 // Check to see whether the module is actually ever installable. 3731 c.installer.everInstallable() 3732} 3733 3734func (c *Module) PreventInstall() bool { 3735 return c.Properties.PreventInstall 3736} 3737 3738func (c *Module) Installable() *bool { 3739 if c.library != nil { 3740 if i := c.library.installable(); i != nil { 3741 return i 3742 } 3743 } 3744 return c.Properties.Installable 3745} 3746 3747func installable(c LinkableInterface, apexInfo android.ApexInfo) bool { 3748 ret := c.EverInstallable() && 3749 // Check to see whether the module has been configured to not be installed. 3750 proptools.BoolDefault(c.Installable(), true) && 3751 !c.PreventInstall() && c.OutputFile().Valid() 3752 3753 // The platform variant doesn't need further condition. Apex variants however might not 3754 // be installable because it will likely to be included in the APEX and won't appear 3755 // in the system partition. 3756 if apexInfo.IsForPlatform() { 3757 return ret 3758 } 3759 3760 // Special case for modules that are configured to be installed to /data, which includes 3761 // test modules. For these modules, both APEX and non-APEX variants are considered as 3762 // installable. This is because even the APEX variants won't be included in the APEX, but 3763 // will anyway be installed to /data/*. 3764 // See b/146995717 3765 if c.InstallInData() { 3766 return ret 3767 } 3768 3769 return false 3770} 3771 3772func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) { 3773 if c.linker != nil { 3774 if library, ok := c.linker.(*libraryDecorator); ok { 3775 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w) 3776 } 3777 } 3778} 3779 3780var _ android.ApexModule = (*Module)(nil) 3781 3782// Implements android.ApexModule 3783func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { 3784 depTag := ctx.OtherModuleDependencyTag(dep) 3785 libDepTag, isLibDepTag := depTag.(libraryDependencyTag) 3786 3787 if cc, ok := dep.(*Module); ok { 3788 if cc.HasStubsVariants() { 3789 if isLibDepTag && libDepTag.shared() { 3790 // dynamic dep to a stubs lib crosses APEX boundary 3791 return false 3792 } 3793 if IsRuntimeDepTag(depTag) { 3794 // runtime dep to a stubs lib also crosses APEX boundary 3795 return false 3796 } 3797 } 3798 if cc.IsLlndk() { 3799 return false 3800 } 3801 if isLibDepTag && c.static() && libDepTag.shared() { 3802 // shared_lib dependency from a static lib is considered as crossing 3803 // the APEX boundary because the dependency doesn't actually is 3804 // linked; the dependency is used only during the compilation phase. 3805 return false 3806 } 3807 3808 if isLibDepTag && libDepTag.excludeInApex { 3809 return false 3810 } 3811 } 3812 if depTag == stubImplDepTag { 3813 // We don't track from an implementation library to its stubs. 3814 return false 3815 } 3816 if depTag == staticVariantTag { 3817 // This dependency is for optimization (reuse *.o from the static lib). It doesn't 3818 // actually mean that the static lib (and its dependencies) are copied into the 3819 // APEX. 3820 return false 3821 } 3822 return true 3823} 3824 3825// Implements android.ApexModule 3826func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, 3827 sdkVersion android.ApiLevel) error { 3828 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700) 3829 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") { 3830 return nil 3831 } 3832 // We don't check for prebuilt modules 3833 if _, ok := c.linker.(prebuiltLinkerInterface); ok { 3834 return nil 3835 } 3836 3837 minSdkVersion := c.MinSdkVersion() 3838 if minSdkVersion == "apex_inherit" { 3839 return nil 3840 } 3841 if minSdkVersion == "" { 3842 // JNI libs within APK-in-APEX fall into here 3843 // Those are okay to set sdk_version instead 3844 // We don't have to check if this is a SDK variant because 3845 // non-SDK variant resets sdk_version, which works too. 3846 minSdkVersion = c.SdkVersion() 3847 } 3848 if minSdkVersion == "" { 3849 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed") 3850 } 3851 // Not using nativeApiLevelFromUser because the context here is not 3852 // necessarily a native context. 3853 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion) 3854 if err != nil { 3855 return err 3856 } 3857 3858 // A dependency only needs to support a min_sdk_version at least 3859 // as high as the api level that the architecture was introduced in. 3860 // This allows introducing new architectures in the platform that 3861 // need to be included in apexes that normally require an older 3862 // min_sdk_version. 3863 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType) 3864 if sdkVersion.LessThan(minApiForArch) { 3865 sdkVersion = minApiForArch 3866 } 3867 3868 if ver.GreaterThan(sdkVersion) { 3869 return fmt.Errorf("newer SDK(%v)", ver) 3870 } 3871 return nil 3872} 3873 3874// Implements android.ApexModule 3875func (c *Module) AlwaysRequiresPlatformApexVariant() bool { 3876 // stub libraries and native bridge libraries are always available to platform 3877 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled 3878} 3879 3880// Overrides android.ApexModuleBase.UniqueApexVariations 3881func (c *Module) UniqueApexVariations() bool { 3882 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique 3883 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong 3884 // variation of the VNDK lib because APEX variations are merged/grouped. 3885 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes. 3886 return c.UseVndk() && c.IsVndk() 3887} 3888 3889func (c *Module) overriddenModules() []string { 3890 if o, ok := c.linker.(overridable); ok { 3891 return o.overriddenModules() 3892 } 3893 return nil 3894} 3895 3896var _ snapshot.RelativeInstallPath = (*Module)(nil) 3897 3898type moduleType int 3899 3900const ( 3901 unknownType moduleType = iota 3902 binary 3903 object 3904 fullLibrary 3905 staticLibrary 3906 sharedLibrary 3907 headerLibrary 3908 testBin // testBinary already declared 3909 ndkLibrary 3910) 3911 3912func (c *Module) typ() moduleType { 3913 if c.testBinary() { 3914 // testBinary is also a binary, so this comes before the c.Binary() 3915 // conditional. A testBinary has additional implicit dependencies and 3916 // other test-only semantics. 3917 return testBin 3918 } else if c.Binary() { 3919 return binary 3920 } else if c.Object() { 3921 return object 3922 } else if c.testLibrary() { 3923 // TODO(b/244431896) properly convert cc_test_library to its own macro. This 3924 // will let them add implicit compile deps on gtest, for example. 3925 // 3926 // For now, treat them as regular shared libraries. 3927 return sharedLibrary 3928 } else if c.CcLibrary() { 3929 static := false 3930 shared := false 3931 if library, ok := c.linker.(*libraryDecorator); ok { 3932 static = library.MutatedProperties.BuildStatic 3933 shared = library.MutatedProperties.BuildShared 3934 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok { 3935 static = library.MutatedProperties.BuildStatic 3936 shared = library.MutatedProperties.BuildShared 3937 } 3938 if static && shared { 3939 return fullLibrary 3940 } else if !static && !shared { 3941 return headerLibrary 3942 } else if static { 3943 return staticLibrary 3944 } 3945 return sharedLibrary 3946 } else if c.isNDKStubLibrary() { 3947 return ndkLibrary 3948 } 3949 return unknownType 3950} 3951 3952// ConvertWithBp2build converts Module to Bazel for bp2build. 3953func (c *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) { 3954 prebuilt := c.IsPrebuilt() 3955 switch c.typ() { 3956 case binary: 3957 if prebuilt { 3958 prebuiltBinaryBp2Build(ctx, c) 3959 } else { 3960 binaryBp2build(ctx, c) 3961 } 3962 case testBin: 3963 if !prebuilt { 3964 testBinaryBp2build(ctx, c) 3965 } 3966 case object: 3967 if prebuilt { 3968 prebuiltObjectBp2Build(ctx, c) 3969 } else { 3970 objectBp2Build(ctx, c) 3971 } 3972 case fullLibrary: 3973 if !prebuilt { 3974 libraryBp2Build(ctx, c) 3975 } else { 3976 prebuiltLibraryBp2Build(ctx, c) 3977 } 3978 case headerLibrary: 3979 libraryHeadersBp2Build(ctx, c) 3980 case staticLibrary: 3981 if prebuilt { 3982 prebuiltLibraryStaticBp2Build(ctx, c, false) 3983 } else { 3984 sharedOrStaticLibraryBp2Build(ctx, c, true) 3985 } 3986 case sharedLibrary: 3987 if prebuilt { 3988 prebuiltLibrarySharedBp2Build(ctx, c) 3989 } else { 3990 sharedOrStaticLibraryBp2Build(ctx, c, false) 3991 } 3992 } 3993} 3994 3995var _ android.ApiProvider = (*Module)(nil) 3996 3997func (c *Module) ConvertWithApiBp2build(ctx android.TopDownMutatorContext) { 3998 if c.IsPrebuilt() { 3999 return 4000 } 4001 switch c.typ() { 4002 case fullLibrary: 4003 apiContributionBp2Build(ctx, c) 4004 case sharedLibrary: 4005 apiContributionBp2Build(ctx, c) 4006 case headerLibrary: 4007 // Aggressively generate api targets for all header modules 4008 // This is necessary since the header module does not know if it is a dep of API surface stub library 4009 apiLibraryHeadersBp2Build(ctx, c) 4010 case ndkLibrary: 4011 ndkLibraryBp2build(ctx, c) 4012 } 4013} 4014 4015// Defaults 4016type Defaults struct { 4017 android.ModuleBase 4018 android.DefaultsModuleBase 4019 android.ApexModuleBase 4020} 4021 4022// cc_defaults provides a set of properties that can be inherited by other cc 4023// modules. A module can use the properties from a cc_defaults using 4024// `defaults: ["<:default_module_name>"]`. Properties of both modules are 4025// merged (when possible) by prepending the default module's values to the 4026// depending module's values. 4027func defaultsFactory() android.Module { 4028 return DefaultsFactory() 4029} 4030 4031func DefaultsFactory(props ...interface{}) android.Module { 4032 module := &Defaults{} 4033 4034 module.AddProperties(props...) 4035 module.AddProperties( 4036 &BaseProperties{}, 4037 &VendorProperties{}, 4038 &BaseCompilerProperties{}, 4039 &BaseLinkerProperties{}, 4040 &ObjectLinkerProperties{}, 4041 &LibraryProperties{}, 4042 &StaticProperties{}, 4043 &SharedProperties{}, 4044 &FlagExporterProperties{}, 4045 &BinaryLinkerProperties{}, 4046 &TestLinkerProperties{}, 4047 &TestInstallerProperties{}, 4048 &TestBinaryProperties{}, 4049 &BenchmarkProperties{}, 4050 &fuzz.FuzzProperties{}, 4051 &StlProperties{}, 4052 &SanitizeProperties{}, 4053 &StripProperties{}, 4054 &InstallerProperties{}, 4055 &TidyProperties{}, 4056 &CoverageProperties{}, 4057 &SAbiProperties{}, 4058 &VndkProperties{}, 4059 <OProperties{}, 4060 &AfdoProperties{}, 4061 &PgoProperties{}, 4062 &android.ProtoProperties{}, 4063 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules. 4064 &RustBindgenClangProperties{}, 4065 &prebuiltLinkerProperties{}, 4066 ) 4067 4068 android.InitDefaultsModule(module) 4069 4070 return module 4071} 4072 4073func (c *Module) IsSdkVariant() bool { 4074 return c.Properties.IsSdkVariant 4075} 4076 4077func (c *Module) isImportedApiLibrary() bool { 4078 _, ok := c.linker.(*apiLibraryDecorator) 4079 return ok 4080} 4081 4082func kytheExtractAllFactory() android.Singleton { 4083 return &kytheExtractAllSingleton{} 4084} 4085 4086type kytheExtractAllSingleton struct { 4087} 4088 4089func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) { 4090 var xrefTargets android.Paths 4091 ctx.VisitAllModules(func(module android.Module) { 4092 if ccModule, ok := module.(xref); ok { 4093 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...) 4094 } 4095 }) 4096 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets 4097 if len(xrefTargets) > 0 { 4098 ctx.Phony("xref_cxx", xrefTargets...) 4099 } 4100} 4101 4102func (c *Module) Partition() string { 4103 if p, ok := c.installer.(interface { 4104 getPartition() string 4105 }); ok { 4106 return p.getPartition() 4107 } 4108 return "" 4109} 4110 4111var Bool = proptools.Bool 4112var BoolDefault = proptools.BoolDefault 4113var BoolPtr = proptools.BoolPtr 4114var String = proptools.String 4115var StringPtr = proptools.StringPtr 4116