github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/cc/cc.go (about) 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 15 package 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 21 import ( 22 "strconv" 23 "strings" 24 25 "github.com/google/blueprint" 26 "github.com/google/blueprint/proptools" 27 28 "android/soong/android" 29 "android/soong/cc/config" 30 "android/soong/genrule" 31 ) 32 33 func init() { 34 android.RegisterModuleType("cc_defaults", defaultsFactory) 35 36 android.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { 37 ctx.BottomUp("image", vendorMutator).Parallel() 38 ctx.BottomUp("link", linkageMutator).Parallel() 39 ctx.BottomUp("vndk", vndkMutator).Parallel() 40 ctx.BottomUp("ndk_api", ndkApiMutator).Parallel() 41 ctx.BottomUp("test_per_src", testPerSrcMutator).Parallel() 42 ctx.BottomUp("begin", beginMutator).Parallel() 43 }) 44 45 android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { 46 ctx.TopDown("asan_deps", sanitizerDepsMutator(asan)) 47 ctx.BottomUp("asan", sanitizerMutator(asan)).Parallel() 48 49 ctx.TopDown("cfi_deps", sanitizerDepsMutator(cfi)) 50 ctx.BottomUp("cfi", sanitizerMutator(cfi)).Parallel() 51 52 ctx.TopDown("tsan_deps", sanitizerDepsMutator(tsan)) 53 ctx.BottomUp("tsan", sanitizerMutator(tsan)).Parallel() 54 55 ctx.TopDown("minimal_runtime_deps", minimalRuntimeDepsMutator()) 56 57 ctx.BottomUp("coverage", coverageLinkingMutator).Parallel() 58 ctx.TopDown("vndk_deps", sabiDepsMutator) 59 60 ctx.TopDown("lto_deps", ltoDepsMutator) 61 ctx.BottomUp("lto", ltoMutator).Parallel() 62 }) 63 64 pctx.Import("android/soong/cc/config") 65 } 66 67 type Deps struct { 68 SharedLibs, LateSharedLibs []string 69 StaticLibs, LateStaticLibs, WholeStaticLibs []string 70 HeaderLibs []string 71 72 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string 73 74 ObjFiles []string 75 76 GeneratedSources []string 77 GeneratedHeaders []string 78 79 ReexportGeneratedHeaders []string 80 81 CrtBegin, CrtEnd string 82 LinkerScript string 83 } 84 85 type PathDeps struct { 86 // Paths to .so files 87 SharedLibs, LateSharedLibs android.Paths 88 // Paths to the dependencies to use for .so files (.so.toc files) 89 SharedLibsDeps, LateSharedLibsDeps android.Paths 90 // Paths to .a files 91 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths 92 93 // Paths to .o files 94 Objs Objects 95 StaticLibObjs Objects 96 WholeStaticLibObjs Objects 97 98 // Paths to generated source files 99 GeneratedSources android.Paths 100 GeneratedHeaders android.Paths 101 102 Flags, ReexportedFlags []string 103 ReexportedFlagsDeps android.Paths 104 105 // Paths to crt*.o files 106 CrtBegin, CrtEnd android.OptionalPath 107 LinkerScript android.OptionalPath 108 } 109 110 type Flags struct { 111 GlobalFlags []string // Flags that apply to C, C++, and assembly source files 112 ArFlags []string // Flags that apply to ar 113 AsFlags []string // Flags that apply to assembly source files 114 CFlags []string // Flags that apply to C and C++ source files 115 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools 116 ConlyFlags []string // Flags that apply to C source files 117 CppFlags []string // Flags that apply to C++ source files 118 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools 119 YaccFlags []string // Flags that apply to Yacc source files 120 protoFlags []string // Flags that apply to proto source files 121 protoOutParams []string // Flags that modify the output of proto generated files 122 aidlFlags []string // Flags that apply to aidl source files 123 rsFlags []string // Flags that apply to renderscript source files 124 LdFlags []string // Flags that apply to linker command lines 125 libFlags []string // Flags to add libraries early to the link order 126 TidyFlags []string // Flags that apply to clang-tidy 127 SAbiFlags []string // Flags that apply to header-abi-dumper 128 YasmFlags []string // Flags that apply to yasm assembly source files 129 130 // Global include flags that apply to C, C++, and assembly source files 131 // These must be after any module include flags, which will be in GlobalFlags. 132 SystemIncludeFlags []string 133 134 Toolchain config.Toolchain 135 Clang bool 136 Tidy bool 137 Coverage bool 138 SAbiDump bool 139 ProtoRoot bool 140 141 RequiredInstructionSet string 142 DynamicLinker string 143 144 CFlagsDeps android.Paths // Files depended on by compiler flags 145 LdFlagsDeps android.Paths // Files depended on by linker flags 146 147 GroupStaticLibs bool 148 ArGoldPlugin bool // Whether LLVM gold plugin option is passed to llvm-ar 149 } 150 151 type ObjectLinkerProperties struct { 152 // names of other cc_object modules to link into this module using partial linking 153 Objs []string `android:"arch_variant"` 154 155 // if set, add an extra objcopy --prefix-symbols= step 156 Prefix_symbols *string 157 } 158 159 // Properties used to compile all C or C++ modules 160 type BaseProperties struct { 161 // compile module with clang instead of gcc 162 Clang *bool `android:"arch_variant"` 163 164 // Minimum sdk version supported when compiling against the ndk 165 Sdk_version *string 166 167 AndroidMkSharedLibs []string `blueprint:"mutated"` 168 HideFromMake bool `blueprint:"mutated"` 169 PreventInstall bool `blueprint:"mutated"` 170 171 UseVndk bool `blueprint:"mutated"` 172 173 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags 174 // file 175 Logtags []string 176 } 177 178 type VendorProperties struct { 179 // whether this module should be allowed to be directly depended by other 180 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`. 181 // If set to true, two variants will be built separately, one like 182 // normal, and the other limited to the set of libraries and headers 183 // that are exposed to /vendor modules. 184 // 185 // The vendor variant may be used with a different (newer) /system, 186 // so it shouldn't have any unversioned runtime dependencies, or 187 // make assumptions about the system that may not be true in the 188 // future. 189 // 190 // If set to false, this module becomes inaccessible from /vendor modules. 191 // 192 // Default value is true when vndk: {enabled: true} or vendor: true. 193 // 194 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk 195 Vendor_available *bool 196 } 197 198 type UnusedProperties struct { 199 Tags []string 200 } 201 202 type ModuleContextIntf interface { 203 static() bool 204 staticBinary() bool 205 clang() bool 206 toolchain() config.Toolchain 207 useSdk() bool 208 sdkVersion() string 209 useVndk() bool 210 isVndk() bool 211 isVndkSp() bool 212 isVndkExt() bool 213 createVndkSourceAbiDump() bool 214 selectedStl() string 215 baseModuleName() string 216 getVndkExtendsModuleName() string 217 isPgoCompile() bool 218 } 219 220 type ModuleContext interface { 221 android.ModuleContext 222 ModuleContextIntf 223 } 224 225 type BaseModuleContext interface { 226 android.BaseContext 227 ModuleContextIntf 228 } 229 230 type DepsContext interface { 231 android.BottomUpMutatorContext 232 ModuleContextIntf 233 } 234 235 type feature interface { 236 begin(ctx BaseModuleContext) 237 deps(ctx DepsContext, deps Deps) Deps 238 flags(ctx ModuleContext, flags Flags) Flags 239 props() []interface{} 240 } 241 242 type compiler interface { 243 compilerInit(ctx BaseModuleContext) 244 compilerDeps(ctx DepsContext, deps Deps) Deps 245 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags 246 compilerProps() []interface{} 247 248 appendCflags([]string) 249 appendAsflags([]string) 250 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects 251 } 252 253 type linker interface { 254 linkerInit(ctx BaseModuleContext) 255 linkerDeps(ctx DepsContext, deps Deps) Deps 256 linkerFlags(ctx ModuleContext, flags Flags) Flags 257 linkerProps() []interface{} 258 259 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path 260 appendLdflags([]string) 261 } 262 263 type installer interface { 264 installerProps() []interface{} 265 install(ctx ModuleContext, path android.Path) 266 inData() bool 267 inSanitizerDir() bool 268 hostToolPath() android.OptionalPath 269 } 270 271 type dependencyTag struct { 272 blueprint.BaseDependencyTag 273 name string 274 library bool 275 276 reexportFlags bool 277 } 278 279 var ( 280 sharedDepTag = dependencyTag{name: "shared", library: true} 281 sharedExportDepTag = dependencyTag{name: "shared", library: true, reexportFlags: true} 282 lateSharedDepTag = dependencyTag{name: "late shared", library: true} 283 staticDepTag = dependencyTag{name: "static", library: true} 284 staticExportDepTag = dependencyTag{name: "static", library: true, reexportFlags: true} 285 lateStaticDepTag = dependencyTag{name: "late static", library: true} 286 wholeStaticDepTag = dependencyTag{name: "whole static", library: true, reexportFlags: true} 287 headerDepTag = dependencyTag{name: "header", library: true} 288 headerExportDepTag = dependencyTag{name: "header", library: true, reexportFlags: true} 289 genSourceDepTag = dependencyTag{name: "gen source"} 290 genHeaderDepTag = dependencyTag{name: "gen header"} 291 genHeaderExportDepTag = dependencyTag{name: "gen header", reexportFlags: true} 292 objDepTag = dependencyTag{name: "obj"} 293 crtBeginDepTag = dependencyTag{name: "crtbegin"} 294 crtEndDepTag = dependencyTag{name: "crtend"} 295 linkerScriptDepTag = dependencyTag{name: "linker script"} 296 reuseObjTag = dependencyTag{name: "reuse objects"} 297 ndkStubDepTag = dependencyTag{name: "ndk stub", library: true} 298 ndkLateStubDepTag = dependencyTag{name: "ndk late stub", library: true} 299 vndkExtDepTag = dependencyTag{name: "vndk extends", library: true} 300 ) 301 302 // Module contains the properties and members used by all C/C++ module types, and implements 303 // the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces 304 // to construct the output file. Behavior can be customized with a Customizer interface 305 type Module struct { 306 android.ModuleBase 307 android.DefaultableModuleBase 308 309 Properties BaseProperties 310 VendorProperties VendorProperties 311 unused UnusedProperties 312 313 // initialize before calling Init 314 hod android.HostOrDeviceSupported 315 multilib android.Multilib 316 317 // delegates, initialize before calling Init 318 features []feature 319 compiler compiler 320 linker linker 321 installer installer 322 stl *stl 323 sanitize *sanitize 324 coverage *coverage 325 sabi *sabi 326 vndkdep *vndkdep 327 lto *lto 328 pgo *pgo 329 330 androidMkSharedLibDeps []string 331 332 outputFile android.OptionalPath 333 334 cachedToolchain config.Toolchain 335 336 subAndroidMkOnce map[subAndroidMkProvider]bool 337 338 // Flags used to compile this module 339 flags Flags 340 341 // When calling a linker, if module A depends on module B, then A must precede B in its command 342 // line invocation. depsInLinkOrder stores the proper ordering of all of the transitive 343 // deps of this module 344 depsInLinkOrder android.Paths 345 346 // only non-nil when this is a shared library that reuses the objects of a static library 347 staticVariant *Module 348 } 349 350 func (c *Module) Init() android.Module { 351 c.AddProperties(&c.Properties, &c.VendorProperties, &c.unused) 352 if c.compiler != nil { 353 c.AddProperties(c.compiler.compilerProps()...) 354 } 355 if c.linker != nil { 356 c.AddProperties(c.linker.linkerProps()...) 357 } 358 if c.installer != nil { 359 c.AddProperties(c.installer.installerProps()...) 360 } 361 if c.stl != nil { 362 c.AddProperties(c.stl.props()...) 363 } 364 if c.sanitize != nil { 365 c.AddProperties(c.sanitize.props()...) 366 } 367 if c.coverage != nil { 368 c.AddProperties(c.coverage.props()...) 369 } 370 if c.sabi != nil { 371 c.AddProperties(c.sabi.props()...) 372 } 373 if c.vndkdep != nil { 374 c.AddProperties(c.vndkdep.props()...) 375 } 376 if c.lto != nil { 377 c.AddProperties(c.lto.props()...) 378 } 379 if c.pgo != nil { 380 c.AddProperties(c.pgo.props()...) 381 } 382 for _, feature := range c.features { 383 c.AddProperties(feature.props()...) 384 } 385 386 android.InitAndroidArchModule(c, c.hod, c.multilib) 387 388 android.InitDefaultableModule(c) 389 390 return c 391 } 392 393 // Returns true for dependency roots (binaries) 394 // TODO(ccross): also handle dlopenable libraries 395 func (c *Module) isDependencyRoot() bool { 396 if root, ok := c.linker.(interface { 397 isDependencyRoot() bool 398 }); ok { 399 return root.isDependencyRoot() 400 } 401 return false 402 } 403 404 func (c *Module) useVndk() bool { 405 return c.Properties.UseVndk 406 } 407 408 func (c *Module) isVndk() bool { 409 if vndkdep := c.vndkdep; vndkdep != nil { 410 return vndkdep.isVndk() 411 } 412 return false 413 } 414 415 func (c *Module) isPgoCompile() bool { 416 if pgo := c.pgo; pgo != nil { 417 return pgo.Properties.PgoCompile 418 } 419 return false 420 } 421 422 func (c *Module) isVndkSp() bool { 423 if vndkdep := c.vndkdep; vndkdep != nil { 424 return vndkdep.isVndkSp() 425 } 426 return false 427 } 428 429 func (c *Module) isVndkExt() bool { 430 if vndkdep := c.vndkdep; vndkdep != nil { 431 return vndkdep.isVndkExt() 432 } 433 return false 434 } 435 436 func (c *Module) getVndkExtendsModuleName() string { 437 if vndkdep := c.vndkdep; vndkdep != nil { 438 return vndkdep.getVndkExtendsModuleName() 439 } 440 return "" 441 } 442 443 // Returns true only when this module is configured to have core and vendor 444 // variants. 445 func (c *Module) hasVendorVariant() bool { 446 return c.isVndk() || Bool(c.VendorProperties.Vendor_available) 447 } 448 449 type baseModuleContext struct { 450 android.BaseContext 451 moduleContextImpl 452 } 453 454 type depsContext struct { 455 android.BottomUpMutatorContext 456 moduleContextImpl 457 } 458 459 type moduleContext struct { 460 android.ModuleContext 461 moduleContextImpl 462 } 463 464 func (ctx *moduleContext) SocSpecific() bool { 465 return ctx.ModuleContext.SocSpecific() || 466 (ctx.mod.hasVendorVariant() && ctx.mod.useVndk() && !ctx.mod.isVndk()) 467 } 468 469 type moduleContextImpl struct { 470 mod *Module 471 ctx BaseModuleContext 472 } 473 474 func (ctx *moduleContextImpl) clang() bool { 475 return ctx.mod.clang(ctx.ctx) 476 } 477 478 func (ctx *moduleContextImpl) toolchain() config.Toolchain { 479 return ctx.mod.toolchain(ctx.ctx) 480 } 481 482 func (ctx *moduleContextImpl) static() bool { 483 return ctx.mod.static() 484 } 485 486 func (ctx *moduleContextImpl) staticBinary() bool { 487 if static, ok := ctx.mod.linker.(interface { 488 staticBinary() bool 489 }); ok { 490 return static.staticBinary() 491 } 492 return false 493 } 494 495 func (ctx *moduleContextImpl) useSdk() bool { 496 if ctx.ctx.Device() && !ctx.useVndk() { 497 return String(ctx.mod.Properties.Sdk_version) != "" 498 } 499 return false 500 } 501 502 func (ctx *moduleContextImpl) sdkVersion() string { 503 if ctx.ctx.Device() { 504 if ctx.useVndk() { 505 vndk_ver := ctx.ctx.DeviceConfig().VndkVersion() 506 if vndk_ver == "current" { 507 platform_vndk_ver := ctx.ctx.DeviceConfig().PlatformVndkVersion() 508 if inList(platform_vndk_ver, ctx.ctx.Config().PlatformVersionCombinedCodenames()) { 509 return "current" 510 } 511 return platform_vndk_ver 512 } 513 return vndk_ver 514 } 515 return String(ctx.mod.Properties.Sdk_version) 516 } 517 return "" 518 } 519 520 func (ctx *moduleContextImpl) useVndk() bool { 521 return ctx.mod.useVndk() 522 } 523 524 func (ctx *moduleContextImpl) isVndk() bool { 525 return ctx.mod.isVndk() 526 } 527 528 func (ctx *moduleContextImpl) isPgoCompile() bool { 529 return ctx.mod.isPgoCompile() 530 } 531 532 func (ctx *moduleContextImpl) isVndkSp() bool { 533 return ctx.mod.isVndkSp() 534 } 535 536 func (ctx *moduleContextImpl) isVndkExt() bool { 537 return ctx.mod.isVndkExt() 538 } 539 540 // Create source abi dumps if the module belongs to the list of VndkLibraries. 541 func (ctx *moduleContextImpl) createVndkSourceAbiDump() bool { 542 skipAbiChecks := ctx.ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") 543 isVariantOnProductionDevice := true 544 sanitize := ctx.mod.sanitize 545 if sanitize != nil { 546 isVariantOnProductionDevice = sanitize.isVariantOnProductionDevice() 547 } 548 vendorAvailable := Bool(ctx.mod.VendorProperties.Vendor_available) 549 return !skipAbiChecks && isVariantOnProductionDevice && ctx.ctx.Device() && ((ctx.useVndk() && ctx.isVndk() && (vendorAvailable || ctx.isVndkExt())) || inList(ctx.baseModuleName(), llndkLibraries)) 550 } 551 552 func (ctx *moduleContextImpl) selectedStl() string { 553 if stl := ctx.mod.stl; stl != nil { 554 return stl.Properties.SelectedStl 555 } 556 return "" 557 } 558 559 func (ctx *moduleContextImpl) baseModuleName() string { 560 return ctx.mod.ModuleBase.BaseModuleName() 561 } 562 563 func (ctx *moduleContextImpl) getVndkExtendsModuleName() string { 564 return ctx.mod.getVndkExtendsModuleName() 565 } 566 567 func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module { 568 return &Module{ 569 hod: hod, 570 multilib: multilib, 571 } 572 } 573 574 func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module { 575 module := newBaseModule(hod, multilib) 576 module.features = []feature{ 577 &tidyFeature{}, 578 } 579 module.stl = &stl{} 580 module.sanitize = &sanitize{} 581 module.coverage = &coverage{} 582 module.sabi = &sabi{} 583 module.vndkdep = &vndkdep{} 584 module.lto = <o{} 585 module.pgo = &pgo{} 586 return module 587 } 588 589 func (c *Module) Prebuilt() *android.Prebuilt { 590 if p, ok := c.linker.(prebuiltLinkerInterface); ok { 591 return p.prebuilt() 592 } 593 return nil 594 } 595 596 func (c *Module) Name() string { 597 name := c.ModuleBase.Name() 598 if p, ok := c.linker.(interface { 599 Name(string) string 600 }); ok { 601 name = p.Name(name) 602 } 603 return name 604 } 605 606 // orderDeps reorders dependencies into a list such that if module A depends on B, then 607 // A will precede B in the resultant list. 608 // This is convenient for passing into a linker. 609 // Note that directSharedDeps should be the analogous static library for each shared lib dep 610 func orderDeps(directStaticDeps []android.Path, directSharedDeps []android.Path, allTransitiveDeps map[android.Path][]android.Path) (orderedAllDeps []android.Path, orderedDeclaredDeps []android.Path) { 611 // If A depends on B, then 612 // Every list containing A will also contain B later in the list 613 // So, after concatenating all lists, the final instance of B will have come from the same 614 // original list as the final instance of A 615 // So, the final instance of B will be later in the concatenation than the final A 616 // So, keeping only the final instance of A and of B ensures that A is earlier in the output 617 // list than B 618 for _, dep := range directStaticDeps { 619 orderedAllDeps = append(orderedAllDeps, dep) 620 orderedAllDeps = append(orderedAllDeps, allTransitiveDeps[dep]...) 621 } 622 for _, dep := range directSharedDeps { 623 orderedAllDeps = append(orderedAllDeps, dep) 624 orderedAllDeps = append(orderedAllDeps, allTransitiveDeps[dep]...) 625 } 626 627 orderedAllDeps = android.LastUniquePaths(orderedAllDeps) 628 629 // We don't want to add any new dependencies into directStaticDeps (to allow the caller to 630 // intentionally exclude or replace any unwanted transitive dependencies), so we limit the 631 // resultant list to only what the caller has chosen to include in directStaticDeps 632 _, orderedDeclaredDeps = android.FilterPathList(orderedAllDeps, directStaticDeps) 633 634 return orderedAllDeps, orderedDeclaredDeps 635 } 636 637 func orderStaticModuleDeps(module *Module, staticDeps []*Module, sharedDeps []*Module) (results []android.Path) { 638 // convert Module to Path 639 allTransitiveDeps := make(map[android.Path][]android.Path, len(staticDeps)) 640 staticDepFiles := []android.Path{} 641 for _, dep := range staticDeps { 642 allTransitiveDeps[dep.outputFile.Path()] = dep.depsInLinkOrder 643 staticDepFiles = append(staticDepFiles, dep.outputFile.Path()) 644 } 645 sharedDepFiles := []android.Path{} 646 for _, sharedDep := range sharedDeps { 647 staticAnalogue := sharedDep.staticVariant 648 if staticAnalogue != nil { 649 allTransitiveDeps[staticAnalogue.outputFile.Path()] = staticAnalogue.depsInLinkOrder 650 sharedDepFiles = append(sharedDepFiles, staticAnalogue.outputFile.Path()) 651 } 652 } 653 654 // reorder the dependencies based on transitive dependencies 655 module.depsInLinkOrder, results = orderDeps(staticDepFiles, sharedDepFiles, allTransitiveDeps) 656 657 return results 658 } 659 660 func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { 661 662 ctx := &moduleContext{ 663 ModuleContext: actx, 664 moduleContextImpl: moduleContextImpl{ 665 mod: c, 666 }, 667 } 668 ctx.ctx = ctx 669 670 deps := c.depsToPaths(ctx) 671 if ctx.Failed() { 672 return 673 } 674 675 flags := Flags{ 676 Toolchain: c.toolchain(ctx), 677 Clang: c.clang(ctx), 678 } 679 if c.compiler != nil { 680 flags = c.compiler.compilerFlags(ctx, flags, deps) 681 } 682 if c.linker != nil { 683 flags = c.linker.linkerFlags(ctx, flags) 684 } 685 if c.stl != nil { 686 flags = c.stl.flags(ctx, flags) 687 } 688 if c.sanitize != nil { 689 flags = c.sanitize.flags(ctx, flags) 690 } 691 if c.coverage != nil { 692 flags = c.coverage.flags(ctx, flags) 693 } 694 if c.lto != nil { 695 flags = c.lto.flags(ctx, flags) 696 } 697 if c.pgo != nil { 698 flags = c.pgo.flags(ctx, flags) 699 } 700 for _, feature := range c.features { 701 flags = feature.flags(ctx, flags) 702 } 703 if ctx.Failed() { 704 return 705 } 706 707 flags.CFlags, _ = filterList(flags.CFlags, config.IllegalFlags) 708 flags.CppFlags, _ = filterList(flags.CppFlags, config.IllegalFlags) 709 flags.ConlyFlags, _ = filterList(flags.ConlyFlags, config.IllegalFlags) 710 711 flags.GlobalFlags = append(flags.GlobalFlags, deps.Flags...) 712 c.flags = flags 713 // We need access to all the flags seen by a source file. 714 if c.sabi != nil { 715 flags = c.sabi.flags(ctx, flags) 716 } 717 // Optimization to reduce size of build.ninja 718 // Replace the long list of flags for each file with a module-local variable 719 ctx.Variable(pctx, "cflags", strings.Join(flags.CFlags, " ")) 720 ctx.Variable(pctx, "cppflags", strings.Join(flags.CppFlags, " ")) 721 ctx.Variable(pctx, "asflags", strings.Join(flags.AsFlags, " ")) 722 flags.CFlags = []string{"$cflags"} 723 flags.CppFlags = []string{"$cppflags"} 724 flags.AsFlags = []string{"$asflags"} 725 726 var objs Objects 727 if c.compiler != nil { 728 objs = c.compiler.compile(ctx, flags, deps) 729 if ctx.Failed() { 730 return 731 } 732 } 733 734 if c.linker != nil { 735 outputFile := c.linker.link(ctx, flags, deps, objs) 736 if ctx.Failed() { 737 return 738 } 739 c.outputFile = android.OptionalPathForPath(outputFile) 740 } 741 742 if c.installer != nil && !c.Properties.PreventInstall && c.outputFile.Valid() { 743 c.installer.install(ctx, c.outputFile.Path()) 744 if ctx.Failed() { 745 return 746 } 747 } 748 } 749 750 func (c *Module) toolchain(ctx BaseModuleContext) config.Toolchain { 751 if c.cachedToolchain == nil { 752 c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch()) 753 } 754 return c.cachedToolchain 755 } 756 757 func (c *Module) begin(ctx BaseModuleContext) { 758 if c.compiler != nil { 759 c.compiler.compilerInit(ctx) 760 } 761 if c.linker != nil { 762 c.linker.linkerInit(ctx) 763 } 764 if c.stl != nil { 765 c.stl.begin(ctx) 766 } 767 if c.sanitize != nil { 768 c.sanitize.begin(ctx) 769 } 770 if c.coverage != nil { 771 c.coverage.begin(ctx) 772 } 773 if c.sabi != nil { 774 c.sabi.begin(ctx) 775 } 776 if c.vndkdep != nil { 777 c.vndkdep.begin(ctx) 778 } 779 if c.lto != nil { 780 c.lto.begin(ctx) 781 } 782 if c.pgo != nil { 783 c.pgo.begin(ctx) 784 } 785 for _, feature := range c.features { 786 feature.begin(ctx) 787 } 788 if ctx.useSdk() { 789 version, err := normalizeNdkApiLevel(ctx, ctx.sdkVersion(), ctx.Arch()) 790 if err != nil { 791 ctx.PropertyErrorf("sdk_version", err.Error()) 792 } 793 c.Properties.Sdk_version = StringPtr(version) 794 } 795 } 796 797 func (c *Module) deps(ctx DepsContext) Deps { 798 deps := Deps{} 799 800 if c.compiler != nil { 801 deps = c.compiler.compilerDeps(ctx, deps) 802 } 803 // Add the PGO dependency (the clang_rt.profile runtime library), which 804 // sometimes depends on symbols from libgcc, before libgcc gets added 805 // in linkerDeps(). 806 if c.pgo != nil { 807 deps = c.pgo.deps(ctx, deps) 808 } 809 if c.linker != nil { 810 deps = c.linker.linkerDeps(ctx, deps) 811 } 812 if c.stl != nil { 813 deps = c.stl.deps(ctx, deps) 814 } 815 if c.sanitize != nil { 816 deps = c.sanitize.deps(ctx, deps) 817 } 818 if c.coverage != nil { 819 deps = c.coverage.deps(ctx, deps) 820 } 821 if c.sabi != nil { 822 deps = c.sabi.deps(ctx, deps) 823 } 824 if c.vndkdep != nil { 825 deps = c.vndkdep.deps(ctx, deps) 826 } 827 if c.lto != nil { 828 deps = c.lto.deps(ctx, deps) 829 } 830 for _, feature := range c.features { 831 deps = feature.deps(ctx, deps) 832 } 833 834 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs) 835 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs) 836 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs) 837 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs) 838 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs) 839 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs) 840 841 for _, lib := range deps.ReexportSharedLibHeaders { 842 if !inList(lib, deps.SharedLibs) { 843 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib) 844 } 845 } 846 847 for _, lib := range deps.ReexportStaticLibHeaders { 848 if !inList(lib, deps.StaticLibs) { 849 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib) 850 } 851 } 852 853 for _, lib := range deps.ReexportHeaderLibHeaders { 854 if !inList(lib, deps.HeaderLibs) { 855 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib) 856 } 857 } 858 859 for _, gen := range deps.ReexportGeneratedHeaders { 860 if !inList(gen, deps.GeneratedHeaders) { 861 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen) 862 } 863 } 864 865 return deps 866 } 867 868 func (c *Module) beginMutator(actx android.BottomUpMutatorContext) { 869 ctx := &baseModuleContext{ 870 BaseContext: actx, 871 moduleContextImpl: moduleContextImpl{ 872 mod: c, 873 }, 874 } 875 ctx.ctx = ctx 876 877 c.begin(ctx) 878 } 879 880 func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { 881 if !c.Enabled() { 882 return 883 } 884 885 ctx := &depsContext{ 886 BottomUpMutatorContext: actx, 887 moduleContextImpl: moduleContextImpl{ 888 mod: c, 889 }, 890 } 891 ctx.ctx = ctx 892 893 deps := c.deps(ctx) 894 895 variantNdkLibs := []string{} 896 variantLateNdkLibs := []string{} 897 if ctx.Os() == android.Android { 898 version := ctx.sdkVersion() 899 900 // rewriteNdkLibs takes a list of names of shared libraries and scans it for three types 901 // of names: 902 // 903 // 1. Name of an NDK library that refers to a prebuilt module. 904 // For each of these, it adds the name of the prebuilt module (which will be in 905 // prebuilts/ndk) to the list of nonvariant libs. 906 // 2. Name of an NDK library that refers to an ndk_library module. 907 // For each of these, it adds the name of the ndk_library module to the list of 908 // variant libs. 909 // 3. Anything else (so anything that isn't an NDK library). 910 // It adds these to the nonvariantLibs list. 911 // 912 // The caller can then know to add the variantLibs dependencies differently from the 913 // nonvariantLibs 914 rewriteNdkLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) { 915 variantLibs = []string{} 916 nonvariantLibs = []string{} 917 for _, entry := range list { 918 if ctx.useSdk() && inList(entry, ndkPrebuiltSharedLibraries) { 919 if !inList(entry, ndkMigratedLibs) { 920 nonvariantLibs = append(nonvariantLibs, entry+".ndk."+version) 921 } else { 922 variantLibs = append(variantLibs, entry+ndkLibrarySuffix) 923 } 924 } else if ctx.useVndk() && inList(entry, llndkLibraries) { 925 nonvariantLibs = append(nonvariantLibs, entry+llndkLibrarySuffix) 926 } else if (ctx.Platform() || ctx.ProductSpecific()) && inList(entry, vendorPublicLibraries) { 927 vendorPublicLib := entry + vendorPublicLibrarySuffix 928 if actx.OtherModuleExists(vendorPublicLib) { 929 nonvariantLibs = append(nonvariantLibs, vendorPublicLib) 930 } else { 931 // This can happen if vendor_public_library module is defined in a 932 // namespace that isn't visible to the current module. In that case, 933 // link to the original library. 934 nonvariantLibs = append(nonvariantLibs, entry) 935 } 936 } else { 937 nonvariantLibs = append(nonvariantLibs, entry) 938 } 939 } 940 return nonvariantLibs, variantLibs 941 } 942 943 deps.SharedLibs, variantNdkLibs = rewriteNdkLibs(deps.SharedLibs) 944 deps.LateSharedLibs, variantLateNdkLibs = rewriteNdkLibs(deps.LateSharedLibs) 945 deps.ReexportSharedLibHeaders, _ = rewriteNdkLibs(deps.ReexportSharedLibHeaders) 946 } 947 948 for _, lib := range deps.HeaderLibs { 949 depTag := headerDepTag 950 if inList(lib, deps.ReexportHeaderLibHeaders) { 951 depTag = headerExportDepTag 952 } 953 actx.AddVariationDependencies(nil, depTag, lib) 954 } 955 956 actx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, wholeStaticDepTag, 957 deps.WholeStaticLibs...) 958 959 for _, lib := range deps.StaticLibs { 960 depTag := staticDepTag 961 if inList(lib, deps.ReexportStaticLibHeaders) { 962 depTag = staticExportDepTag 963 } 964 actx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, depTag, lib) 965 } 966 967 actx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, lateStaticDepTag, 968 deps.LateStaticLibs...) 969 970 for _, lib := range deps.SharedLibs { 971 depTag := sharedDepTag 972 if inList(lib, deps.ReexportSharedLibHeaders) { 973 depTag = sharedExportDepTag 974 } 975 actx.AddVariationDependencies([]blueprint.Variation{{"link", "shared"}}, depTag, lib) 976 } 977 978 actx.AddVariationDependencies([]blueprint.Variation{{"link", "shared"}}, lateSharedDepTag, 979 deps.LateSharedLibs...) 980 981 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...) 982 983 for _, gen := range deps.GeneratedHeaders { 984 depTag := genHeaderDepTag 985 if inList(gen, deps.ReexportGeneratedHeaders) { 986 depTag = genHeaderExportDepTag 987 } 988 actx.AddDependency(c, depTag, gen) 989 } 990 991 actx.AddDependency(c, objDepTag, deps.ObjFiles...) 992 993 if deps.CrtBegin != "" { 994 actx.AddDependency(c, crtBeginDepTag, deps.CrtBegin) 995 } 996 if deps.CrtEnd != "" { 997 actx.AddDependency(c, crtEndDepTag, deps.CrtEnd) 998 } 999 if deps.LinkerScript != "" { 1000 actx.AddDependency(c, linkerScriptDepTag, deps.LinkerScript) 1001 } 1002 1003 version := ctx.sdkVersion() 1004 actx.AddVariationDependencies([]blueprint.Variation{ 1005 {"ndk_api", version}, {"link", "shared"}}, ndkStubDepTag, variantNdkLibs...) 1006 actx.AddVariationDependencies([]blueprint.Variation{ 1007 {"ndk_api", version}, {"link", "shared"}}, ndkLateStubDepTag, variantLateNdkLibs...) 1008 1009 if vndkdep := c.vndkdep; vndkdep != nil { 1010 if vndkdep.isVndkExt() { 1011 baseModuleMode := vendorMode 1012 if actx.DeviceConfig().VndkVersion() == "" { 1013 baseModuleMode = coreMode 1014 } 1015 actx.AddVariationDependencies([]blueprint.Variation{ 1016 {"image", baseModuleMode}, {"link", "shared"}}, vndkExtDepTag, 1017 vndkdep.getVndkExtendsModuleName()) 1018 } 1019 } 1020 } 1021 1022 func beginMutator(ctx android.BottomUpMutatorContext) { 1023 if c, ok := ctx.Module().(*Module); ok && c.Enabled() { 1024 c.beginMutator(ctx) 1025 } 1026 } 1027 1028 func (c *Module) clang(ctx BaseModuleContext) bool { 1029 clang := Bool(c.Properties.Clang) 1030 1031 if c.Properties.Clang == nil { 1032 clang = true 1033 } 1034 1035 if !c.toolchain(ctx).ClangSupported() { 1036 clang = false 1037 } 1038 1039 return clang 1040 } 1041 1042 // Whether a module can link to another module, taking into 1043 // account NDK linking. 1044 func checkLinkType(ctx android.ModuleContext, from *Module, to *Module, tag dependencyTag) { 1045 if from.Target().Os != android.Android { 1046 // Host code is not restricted 1047 return 1048 } 1049 if from.Properties.UseVndk { 1050 // Though vendor code is limited by the vendor mutator, 1051 // each vendor-available module needs to check 1052 // link-type for VNDK. 1053 if from.vndkdep != nil { 1054 from.vndkdep.vndkCheckLinkType(ctx, to, tag) 1055 } 1056 return 1057 } 1058 if String(from.Properties.Sdk_version) == "" { 1059 // Platform code can link to anything 1060 return 1061 } 1062 if _, ok := to.linker.(*toolchainLibraryDecorator); ok { 1063 // These are always allowed 1064 return 1065 } 1066 if _, ok := to.linker.(*ndkPrebuiltLibraryLinker); ok { 1067 // These are allowed, but they don't set sdk_version 1068 return 1069 } 1070 if _, ok := to.linker.(*ndkPrebuiltStlLinker); ok { 1071 // These are allowed, but they don't set sdk_version 1072 return 1073 } 1074 if _, ok := to.linker.(*stubDecorator); ok { 1075 // These aren't real libraries, but are the stub shared libraries that are included in 1076 // the NDK. 1077 return 1078 } 1079 if String(to.Properties.Sdk_version) == "" { 1080 // NDK code linking to platform code is never okay. 1081 ctx.ModuleErrorf("depends on non-NDK-built library %q", 1082 ctx.OtherModuleName(to)) 1083 } 1084 1085 // At this point we know we have two NDK libraries, but we need to 1086 // check that we're not linking against anything built against a higher 1087 // API level, as it is only valid to link against older or equivalent 1088 // APIs. 1089 1090 if String(from.Properties.Sdk_version) == "current" { 1091 // Current can link against anything. 1092 return 1093 } else if String(to.Properties.Sdk_version) == "current" { 1094 // Current can't be linked against by anything else. 1095 ctx.ModuleErrorf("links %q built against newer API version %q", 1096 ctx.OtherModuleName(to), "current") 1097 } 1098 1099 fromApi, err := strconv.Atoi(String(from.Properties.Sdk_version)) 1100 if err != nil { 1101 ctx.PropertyErrorf("sdk_version", 1102 "Invalid sdk_version value (must be int): %q", 1103 String(from.Properties.Sdk_version)) 1104 } 1105 toApi, err := strconv.Atoi(String(to.Properties.Sdk_version)) 1106 if err != nil { 1107 ctx.PropertyErrorf("sdk_version", 1108 "Invalid sdk_version value (must be int): %q", 1109 String(to.Properties.Sdk_version)) 1110 } 1111 1112 if toApi > fromApi { 1113 ctx.ModuleErrorf("links %q built against newer API version %q", 1114 ctx.OtherModuleName(to), String(to.Properties.Sdk_version)) 1115 } 1116 1117 // Also check that the two STL choices are compatible. 1118 fromStl := from.stl.Properties.SelectedStl 1119 toStl := to.stl.Properties.SelectedStl 1120 if fromStl == "" || toStl == "" { 1121 // Libraries that don't use the STL are unrestricted. 1122 return 1123 } 1124 1125 if fromStl == "ndk_system" || toStl == "ndk_system" { 1126 // We can be permissive with the system "STL" since it is only the C++ 1127 // ABI layer, but in the future we should make sure that everyone is 1128 // using either libc++ or nothing. 1129 return 1130 } 1131 1132 if getNdkStlFamily(ctx, from) != getNdkStlFamily(ctx, to) { 1133 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q", 1134 from.stl.Properties.SelectedStl, ctx.OtherModuleName(to), 1135 to.stl.Properties.SelectedStl) 1136 } 1137 } 1138 1139 // Convert dependencies to paths. Returns a PathDeps containing paths 1140 func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { 1141 var depPaths PathDeps 1142 1143 directStaticDeps := []*Module{} 1144 directSharedDeps := []*Module{} 1145 1146 ctx.VisitDirectDeps(func(dep android.Module) { 1147 depName := ctx.OtherModuleName(dep) 1148 depTag := ctx.OtherModuleDependencyTag(dep) 1149 1150 ccDep, _ := dep.(*Module) 1151 if ccDep == nil { 1152 // handling for a few module types that aren't cc Module but that are also supported 1153 switch depTag { 1154 case android.DefaultsDepTag, android.SourceDepTag: 1155 // Nothing to do 1156 case genSourceDepTag: 1157 if genRule, ok := dep.(genrule.SourceFileGenerator); ok { 1158 depPaths.GeneratedSources = append(depPaths.GeneratedSources, 1159 genRule.GeneratedSourceFiles()...) 1160 } else { 1161 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName) 1162 } 1163 // Support exported headers from a generated_sources dependency 1164 fallthrough 1165 case genHeaderDepTag, genHeaderExportDepTag: 1166 if genRule, ok := dep.(genrule.SourceFileGenerator); ok { 1167 depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, 1168 genRule.GeneratedDeps()...) 1169 flags := includeDirsToFlags(genRule.GeneratedHeaderDirs()) 1170 depPaths.Flags = append(depPaths.Flags, flags) 1171 if depTag == genHeaderExportDepTag { 1172 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags) 1173 depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps, 1174 genRule.GeneratedDeps()...) 1175 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. 1176 c.sabi.Properties.ReexportedIncludeFlags = append(c.sabi.Properties.ReexportedIncludeFlags, flags) 1177 1178 } 1179 } else { 1180 ctx.ModuleErrorf("module %q is not a genrule", depName) 1181 } 1182 case linkerScriptDepTag: 1183 if genRule, ok := dep.(genrule.SourceFileGenerator); ok { 1184 files := genRule.GeneratedSourceFiles() 1185 if len(files) == 1 { 1186 depPaths.LinkerScript = android.OptionalPathForPath(files[0]) 1187 } else if len(files) > 1 { 1188 ctx.ModuleErrorf("module %q can only generate a single file if used for a linker script", depName) 1189 } 1190 } else { 1191 ctx.ModuleErrorf("module %q is not a genrule", depName) 1192 } 1193 default: 1194 ctx.ModuleErrorf("depends on non-cc module %q", depName) 1195 } 1196 return 1197 } 1198 1199 if dep.Target().Os != ctx.Os() { 1200 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName) 1201 return 1202 } 1203 if dep.Target().Arch.ArchType != ctx.Arch().ArchType { 1204 ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName) 1205 return 1206 } 1207 1208 // re-exporting flags 1209 if depTag == reuseObjTag { 1210 if l, ok := ccDep.compiler.(libraryInterface); ok { 1211 c.staticVariant = ccDep 1212 objs, flags, deps := l.reuseObjs() 1213 depPaths.Objs = depPaths.Objs.Append(objs) 1214 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags...) 1215 depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps, deps...) 1216 return 1217 } 1218 } 1219 if t, ok := depTag.(dependencyTag); ok && t.library { 1220 if i, ok := ccDep.linker.(exportedFlagsProducer); ok { 1221 flags := i.exportedFlags() 1222 deps := i.exportedFlagsDeps() 1223 depPaths.Flags = append(depPaths.Flags, flags...) 1224 depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, deps...) 1225 1226 if t.reexportFlags { 1227 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags...) 1228 depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps, deps...) 1229 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. 1230 // Re-exported shared library headers must be included as well since they can help us with type information 1231 // about template instantiations (instantiated from their headers). 1232 c.sabi.Properties.ReexportedIncludeFlags = append(c.sabi.Properties.ReexportedIncludeFlags, flags...) 1233 } 1234 } 1235 1236 checkLinkType(ctx, c, ccDep, t) 1237 } 1238 1239 var ptr *android.Paths 1240 var depPtr *android.Paths 1241 1242 linkFile := ccDep.outputFile 1243 depFile := android.OptionalPath{} 1244 1245 switch depTag { 1246 case ndkStubDepTag, sharedDepTag, sharedExportDepTag: 1247 ptr = &depPaths.SharedLibs 1248 depPtr = &depPaths.SharedLibsDeps 1249 depFile = ccDep.linker.(libraryInterface).toc() 1250 directSharedDeps = append(directSharedDeps, ccDep) 1251 case lateSharedDepTag, ndkLateStubDepTag: 1252 ptr = &depPaths.LateSharedLibs 1253 depPtr = &depPaths.LateSharedLibsDeps 1254 depFile = ccDep.linker.(libraryInterface).toc() 1255 case staticDepTag, staticExportDepTag: 1256 ptr = nil 1257 directStaticDeps = append(directStaticDeps, ccDep) 1258 case lateStaticDepTag: 1259 ptr = &depPaths.LateStaticLibs 1260 case wholeStaticDepTag: 1261 ptr = &depPaths.WholeStaticLibs 1262 staticLib, ok := ccDep.linker.(libraryInterface) 1263 if !ok || !staticLib.static() { 1264 ctx.ModuleErrorf("module %q not a static library", depName) 1265 return 1266 } 1267 1268 if missingDeps := staticLib.getWholeStaticMissingDeps(); missingDeps != nil { 1269 postfix := " (required by " + ctx.OtherModuleName(dep) + ")" 1270 for i := range missingDeps { 1271 missingDeps[i] += postfix 1272 } 1273 ctx.AddMissingDependencies(missingDeps) 1274 } 1275 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLib.objs()) 1276 case headerDepTag: 1277 // Nothing 1278 case objDepTag: 1279 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path()) 1280 case crtBeginDepTag: 1281 depPaths.CrtBegin = linkFile 1282 case crtEndDepTag: 1283 depPaths.CrtEnd = linkFile 1284 } 1285 1286 switch depTag { 1287 case staticDepTag, staticExportDepTag, lateStaticDepTag: 1288 staticLib, ok := ccDep.linker.(libraryInterface) 1289 if !ok || !staticLib.static() { 1290 ctx.ModuleErrorf("module %q not a static library", depName) 1291 return 1292 } 1293 1294 // When combining coverage files for shared libraries and executables, coverage files 1295 // in static libraries act as if they were whole static libraries. The same goes for 1296 // source based Abi dump files. 1297 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles, 1298 staticLib.objs().coverageFiles...) 1299 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles, 1300 staticLib.objs().sAbiDumpFiles...) 1301 1302 } 1303 1304 if ptr != nil { 1305 if !linkFile.Valid() { 1306 ctx.ModuleErrorf("module %q missing output file", depName) 1307 return 1308 } 1309 *ptr = append(*ptr, linkFile.Path()) 1310 } 1311 1312 if depPtr != nil { 1313 dep := depFile 1314 if !dep.Valid() { 1315 dep = linkFile 1316 } 1317 *depPtr = append(*depPtr, dep.Path()) 1318 } 1319 1320 // Export the shared libs to Make. 1321 switch depTag { 1322 case sharedDepTag, sharedExportDepTag, lateSharedDepTag: 1323 libName := strings.TrimSuffix(depName, llndkLibrarySuffix) 1324 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix) 1325 libName = strings.TrimPrefix(libName, "prebuilt_") 1326 isLLndk := inList(libName, llndkLibraries) 1327 isVendorPublicLib := inList(libName, vendorPublicLibraries) 1328 var makeLibName string 1329 bothVendorAndCoreVariantsExist := ccDep.hasVendorVariant() || isLLndk 1330 if c.useVndk() && bothVendorAndCoreVariantsExist { 1331 // The vendor module in Make will have been renamed to not conflict with the core 1332 // module, so update the dependency name here accordingly. 1333 makeLibName = libName + vendorSuffix 1334 } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib { 1335 makeLibName = libName + vendorPublicLibrarySuffix 1336 } else { 1337 makeLibName = libName 1338 } 1339 // Note: the order of libs in this list is not important because 1340 // they merely serve as Make dependencies and do not affect this lib itself. 1341 c.Properties.AndroidMkSharedLibs = append(c.Properties.AndroidMkSharedLibs, makeLibName) 1342 } 1343 }) 1344 1345 // use the ordered dependencies as this module's dependencies 1346 depPaths.StaticLibs = append(depPaths.StaticLibs, orderStaticModuleDeps(c, directStaticDeps, directSharedDeps)...) 1347 1348 // Dedup exported flags from dependencies 1349 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags) 1350 depPaths.GeneratedHeaders = android.FirstUniquePaths(depPaths.GeneratedHeaders) 1351 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags) 1352 depPaths.ReexportedFlagsDeps = android.FirstUniquePaths(depPaths.ReexportedFlagsDeps) 1353 1354 if c.sabi != nil { 1355 c.sabi.Properties.ReexportedIncludeFlags = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludeFlags) 1356 } 1357 1358 return depPaths 1359 } 1360 1361 func (c *Module) InstallInData() bool { 1362 if c.installer == nil { 1363 return false 1364 } 1365 return c.installer.inData() 1366 } 1367 1368 func (c *Module) InstallInSanitizerDir() bool { 1369 if c.installer == nil { 1370 return false 1371 } 1372 if c.sanitize != nil && c.sanitize.inSanitizerDir() { 1373 return true 1374 } 1375 return c.installer.inSanitizerDir() 1376 } 1377 1378 func (c *Module) HostToolPath() android.OptionalPath { 1379 if c.installer == nil { 1380 return android.OptionalPath{} 1381 } 1382 return c.installer.hostToolPath() 1383 } 1384 1385 func (c *Module) IntermPathForModuleOut() android.OptionalPath { 1386 return c.outputFile 1387 } 1388 1389 func (c *Module) Srcs() android.Paths { 1390 if c.outputFile.Valid() { 1391 return android.Paths{c.outputFile.Path()} 1392 } 1393 return android.Paths{} 1394 } 1395 1396 func (c *Module) static() bool { 1397 if static, ok := c.linker.(interface { 1398 static() bool 1399 }); ok { 1400 return static.static() 1401 } 1402 return false 1403 } 1404 1405 // 1406 // Defaults 1407 // 1408 type Defaults struct { 1409 android.ModuleBase 1410 android.DefaultsModuleBase 1411 } 1412 1413 func (*Defaults) GenerateAndroidBuildActions(ctx android.ModuleContext) { 1414 } 1415 1416 func (d *Defaults) DepsMutator(ctx android.BottomUpMutatorContext) { 1417 } 1418 1419 func defaultsFactory() android.Module { 1420 return DefaultsFactory() 1421 } 1422 1423 func DefaultsFactory(props ...interface{}) android.Module { 1424 module := &Defaults{} 1425 1426 module.AddProperties(props...) 1427 module.AddProperties( 1428 &BaseProperties{}, 1429 &VendorProperties{}, 1430 &BaseCompilerProperties{}, 1431 &BaseLinkerProperties{}, 1432 &LibraryProperties{}, 1433 &FlagExporterProperties{}, 1434 &BinaryLinkerProperties{}, 1435 &TestProperties{}, 1436 &TestBinaryProperties{}, 1437 &UnusedProperties{}, 1438 &StlProperties{}, 1439 &SanitizeProperties{}, 1440 &StripProperties{}, 1441 &InstallerProperties{}, 1442 &TidyProperties{}, 1443 &CoverageProperties{}, 1444 &SAbiProperties{}, 1445 &VndkProperties{}, 1446 <OProperties{}, 1447 &PgoProperties{}, 1448 &android.ProtoProperties{}, 1449 ) 1450 1451 android.InitDefaultsModule(module) 1452 1453 return module 1454 } 1455 1456 const ( 1457 // coreMode is the variant used for framework-private libraries, or 1458 // SDK libraries. (which framework-private libraries can use) 1459 coreMode = "core" 1460 1461 // vendorMode is the variant used for /vendor code that compiles 1462 // against the VNDK. 1463 vendorMode = "vendor" 1464 ) 1465 1466 func squashVendorSrcs(m *Module) { 1467 if lib, ok := m.compiler.(*libraryDecorator); ok { 1468 lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs, 1469 lib.baseCompiler.Properties.Target.Vendor.Srcs...) 1470 1471 lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs, 1472 lib.baseCompiler.Properties.Target.Vendor.Exclude_srcs...) 1473 } 1474 } 1475 1476 func vendorMutator(mctx android.BottomUpMutatorContext) { 1477 if mctx.Os() != android.Android { 1478 return 1479 } 1480 1481 if genrule, ok := mctx.Module().(*genrule.Module); ok { 1482 if props, ok := genrule.Extra.(*VendorProperties); ok { 1483 if mctx.DeviceConfig().VndkVersion() == "" { 1484 mctx.CreateVariations(coreMode) 1485 } else if Bool(props.Vendor_available) { 1486 mctx.CreateVariations(coreMode, vendorMode) 1487 } else if mctx.SocSpecific() || mctx.DeviceSpecific() { 1488 mctx.CreateVariations(vendorMode) 1489 } else { 1490 mctx.CreateVariations(coreMode) 1491 } 1492 } 1493 } 1494 1495 m, ok := mctx.Module().(*Module) 1496 if !ok { 1497 return 1498 } 1499 1500 // Sanity check 1501 vendorSpecific := mctx.SocSpecific() || mctx.DeviceSpecific() 1502 1503 if m.VendorProperties.Vendor_available != nil && vendorSpecific { 1504 mctx.PropertyErrorf("vendor_available", 1505 "doesn't make sense at the same time as `vendor: true`, `proprietary: true`, or `device_specific:true`") 1506 return 1507 } 1508 1509 if vndkdep := m.vndkdep; vndkdep != nil { 1510 if vndkdep.isVndk() { 1511 if vendorSpecific { 1512 if !vndkdep.isVndkExt() { 1513 mctx.PropertyErrorf("vndk", 1514 "must set `extends: \"...\"` to vndk extension") 1515 return 1516 } 1517 } else { 1518 if vndkdep.isVndkExt() { 1519 mctx.PropertyErrorf("vndk", 1520 "must set `vendor: true` to set `extends: %q`", 1521 m.getVndkExtendsModuleName()) 1522 return 1523 } 1524 if m.VendorProperties.Vendor_available == nil { 1525 mctx.PropertyErrorf("vndk", 1526 "vendor_available must be set to either true or false when `vndk: {enabled: true}`") 1527 return 1528 } 1529 } 1530 } else { 1531 if vndkdep.isVndkSp() { 1532 mctx.PropertyErrorf("vndk", 1533 "must set `enabled: true` to set `support_system_process: true`") 1534 return 1535 } 1536 if vndkdep.isVndkExt() { 1537 mctx.PropertyErrorf("vndk", 1538 "must set `enabled: true` to set `extends: %q`", 1539 m.getVndkExtendsModuleName()) 1540 return 1541 } 1542 } 1543 } 1544 1545 if mctx.DeviceConfig().VndkVersion() == "" { 1546 // If the device isn't compiling against the VNDK, we always 1547 // use the core mode. 1548 mctx.CreateVariations(coreMode) 1549 } else if _, ok := m.linker.(*llndkStubDecorator); ok { 1550 // LL-NDK stubs only exist in the vendor variant, since the 1551 // real libraries will be used in the core variant. 1552 mctx.CreateVariations(vendorMode) 1553 } else if _, ok := m.linker.(*llndkHeadersDecorator); ok { 1554 // ... and LL-NDK headers as well 1555 mod := mctx.CreateVariations(vendorMode) 1556 vendor := mod[0].(*Module) 1557 vendor.Properties.UseVndk = true 1558 } else if _, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok { 1559 // Make vendor variants only for the versions in BOARD_VNDK_VERSION and 1560 // PRODUCT_EXTRA_VNDK_VERSIONS. 1561 mod := mctx.CreateVariations(vendorMode) 1562 vendor := mod[0].(*Module) 1563 vendor.Properties.UseVndk = true 1564 } else if m.hasVendorVariant() && !vendorSpecific { 1565 // This will be available in both /system and /vendor 1566 // or a /system directory that is available to vendor. 1567 mod := mctx.CreateVariations(coreMode, vendorMode) 1568 vendor := mod[1].(*Module) 1569 vendor.Properties.UseVndk = true 1570 squashVendorSrcs(vendor) 1571 } else if vendorSpecific && String(m.Properties.Sdk_version) == "" { 1572 // This will be available in /vendor (or /odm) only 1573 mod := mctx.CreateVariations(vendorMode) 1574 vendor := mod[0].(*Module) 1575 vendor.Properties.UseVndk = true 1576 squashVendorSrcs(vendor) 1577 } else { 1578 // This is either in /system (or similar: /data), or is a 1579 // modules built with the NDK. Modules built with the NDK 1580 // will be restricted using the existing link type checks. 1581 mctx.CreateVariations(coreMode) 1582 } 1583 } 1584 1585 func getCurrentNdkPrebuiltVersion(ctx DepsContext) string { 1586 if ctx.Config().PlatformSdkVersionInt() > config.NdkMaxPrebuiltVersionInt { 1587 return strconv.Itoa(config.NdkMaxPrebuiltVersionInt) 1588 } 1589 return ctx.Config().PlatformSdkVersion() 1590 } 1591 1592 var Bool = proptools.Bool 1593 var BoolPtr = proptools.BoolPtr 1594 var String = proptools.String 1595 var StringPtr = proptools.StringPtr