blob: 454a3626dad929a5eb55ab5202e6c99eaef7d097 [file] [log] [blame]
Colin Cross5049f022015-03-18 13:28:46 -07001// Copyright 2015 Google Inc. All rights reserved.
Colin Cross3f40fa42015-01-30 17:27:36 -08002//
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 (
Colin Cross41955e82019-05-29 14:40:35 -070022 "fmt"
Logan Chien41eabe62019-04-10 13:33:58 +080023 "io"
Dan Albert9e10cd42016-08-03 14:12:14 -070024 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080025 "strings"
26
Colin Cross97ba0732015-03-23 17:50:24 -070027 "github.com/google/blueprint"
Colin Cross06a931b2015-10-28 17:23:31 -070028 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070029
Colin Cross635c3b02016-05-18 15:37:25 -070030 "android/soong/android"
Colin Crossb98c8b02016-07-29 13:44:28 -070031 "android/soong/cc/config"
Colin Cross5049f022015-03-18 13:28:46 -070032 "android/soong/genrule"
Colin Cross3f40fa42015-01-30 17:27:36 -080033)
34
Colin Cross463a90e2015-06-17 14:20:06 -070035func init() {
Paul Duffin036e7002019-12-19 19:16:28 +000036 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -070037
Paul Duffin036e7002019-12-19 19:16:28 +000038 pctx.Import("android/soong/cc/config")
39}
40
41func RegisterCCBuildComponents(ctx android.RegistrationContext) {
42 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
43
44 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossc511bc52020-04-07 16:50:32 +000045 ctx.BottomUp("sdk", sdkMutator).Parallel()
Inseob Kim64c43952019-08-26 16:52:35 +090046 ctx.BottomUp("vndk", VndkMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070047 ctx.BottomUp("link", LinkageMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +010048 ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
Colin Crossd1f898e2020-08-18 18:35:15 -070049 ctx.BottomUp("version_selector", versionSelectorMutator).Parallel()
50 ctx.BottomUp("version", versionMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070051 ctx.BottomUp("begin", BeginMutator).Parallel()
Inseob Kimac1e9862019-12-09 18:15:47 +090052 ctx.BottomUp("sysprop_cc", SyspropMutator).Parallel()
Inseob Kimeec88e12020-01-22 11:11:29 +090053 ctx.BottomUp("vendor_snapshot", VendorSnapshotMutator).Parallel()
54 ctx.BottomUp("vendor_snapshot_source", VendorSnapshotSourceMutator).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070055 })
Colin Cross16b23492016-01-06 14:41:07 -080056
Paul Duffin036e7002019-12-19 19:16:28 +000057 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Cross1e676be2016-10-12 14:38:15 -070058 ctx.TopDown("asan_deps", sanitizerDepsMutator(asan))
59 ctx.BottomUp("asan", sanitizerMutator(asan)).Parallel()
Colin Cross16b23492016-01-06 14:41:07 -080060
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -070061 ctx.TopDown("hwasan_deps", sanitizerDepsMutator(hwasan))
62 ctx.BottomUp("hwasan", sanitizerMutator(hwasan)).Parallel()
63
Mitch Phillipsbfeade62019-05-01 14:42:05 -070064 ctx.TopDown("fuzzer_deps", sanitizerDepsMutator(fuzzer))
65 ctx.BottomUp("fuzzer", sanitizerMutator(fuzzer)).Parallel()
66
Jiyong Park1d1119f2019-07-29 21:27:18 +090067 // cfi mutator shouldn't run before sanitizers that return true for
68 // incompatibleWithCfi()
Vishwath Mohanb743e9c2017-11-01 09:20:21 +000069 ctx.TopDown("cfi_deps", sanitizerDepsMutator(cfi))
70 ctx.BottomUp("cfi", sanitizerMutator(cfi)).Parallel()
71
Peter Collingbourne8c7e6e22018-11-19 16:03:58 -080072 ctx.TopDown("scs_deps", sanitizerDepsMutator(scs))
73 ctx.BottomUp("scs", sanitizerMutator(scs)).Parallel()
74
Colin Cross1e676be2016-10-12 14:38:15 -070075 ctx.TopDown("tsan_deps", sanitizerDepsMutator(tsan))
76 ctx.BottomUp("tsan", sanitizerMutator(tsan)).Parallel()
Dan Willemsen581341d2017-02-09 16:16:31 -080077
Colin Cross0b908332019-06-19 23:00:20 -070078 ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel()
Jiyong Park379de2f2018-12-19 02:47:14 +090079 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
Ivan Lozano30c5db22018-02-21 15:49:20 -080080
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -080081 ctx.BottomUp("coverage", coverageMutator).Parallel()
Stephen Craneba090d12017-05-09 15:44:35 -070082
83 ctx.TopDown("lto_deps", ltoDepsMutator)
84 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090085
Jooyung Han479ca172020-10-19 18:51:07 +090086 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090087 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070088 })
Colin Crossb98c8b02016-07-29 13:44:28 -070089
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080090 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
91 // sabi mutator needs to be run after apex mutator finishes.
92 ctx.TopDown("sabi_deps", sabiDepsMutator)
93 })
94
Colin Cross57898582020-10-29 18:25:19 -070095 ctx.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070096}
97
Chris Parsonsef6e0cf2020-12-01 18:26:21 -050098// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
99// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
100// edges to these modules.
101// This object is constructed in DepsMutator, by calling to various module delegates to set
102// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
103// dependencies.
104// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
105// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800106type Deps struct {
107 SharedLibs, LateSharedLibs []string
108 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800109 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800110 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700111
Chris Parsons79d66a52020-06-05 17:26:16 -0400112 // Used for data dependencies adjacent to tests
113 DataLibs []string
114
Yo Chiang219968c2020-09-22 18:45:04 +0800115 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
116 SystemSharedLibs []string
117
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500118 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800119 StaticUnwinderIfLegacy bool
120
Colin Cross5950f382016-12-13 12:50:57 -0800121 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700122
Colin Cross81413472016-04-11 14:37:39 -0700123 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700124
Dan Willemsenb40aab62016-04-20 14:21:14 -0700125 GeneratedSources []string
126 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900127 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700128
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700129 ReexportGeneratedHeaders []string
130
Colin Cross97ba0732015-03-23 17:50:24 -0700131 CrtBegin, CrtEnd string
Dan Willemsena0790e32018-10-12 00:24:23 -0700132
133 // Used for host bionic
134 LinkerFlagsFile string
135 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900136
137 // List of libs that need to be excluded for APEX variant
138 ExcludeLibsForApex []string
Colin Crossc472d572015-03-17 15:06:21 -0700139}
140
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500141// PathDeps is a struct containing file paths to dependencies of a module.
142// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
143// It's used to construct flags for various build statements (such as for compiling and linking).
144// It is then passed to module decorator functions responsible for registering build statements
145// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800146type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700147 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900148 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700149 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900150 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700151 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700152 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700153
Colin Cross0de8a1e2020-09-18 14:15:30 -0700154 // Transitive static library dependencies of static libraries for use in ordering.
155 TranstiveStaticLibrariesForOrdering *android.DepSet
156
Colin Cross26c34ed2016-09-30 17:10:16 -0700157 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100158 Objs Objects
159 // Paths to .o files in dependencies that provide them. Note that these lists
160 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800161 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700162 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700163
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100164 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
165 // the libs from all whole_static_lib dependencies.
166 WholeStaticLibsFromPrebuilts android.Paths
167
Colin Cross26c34ed2016-09-30 17:10:16 -0700168 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700169 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900170 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700171
Inseob Kimd110f872019-12-06 13:15:38 +0900172 Flags []string
173 IncludeDirs android.Paths
174 SystemIncludeDirs android.Paths
175 ReexportedDirs android.Paths
176 ReexportedSystemDirs android.Paths
177 ReexportedFlags []string
178 ReexportedGeneratedHeaders android.Paths
179 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700180
Colin Cross26c34ed2016-09-30 17:10:16 -0700181 // Paths to crt*.o files
Colin Cross635c3b02016-05-18 15:37:25 -0700182 CrtBegin, CrtEnd android.OptionalPath
Dan Willemsena0790e32018-10-12 00:24:23 -0700183
184 // Path to the file container flags to use with the linker
185 LinkerFlagsFile android.OptionalPath
186
187 // Path to the dynamic linker binary
188 DynamicLinker android.OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700189}
190
Colin Cross4af21ed2019-11-04 09:37:55 -0800191// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
192// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
193// command line so they can be overridden by the local module flags).
194type LocalOrGlobalFlags struct {
195 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700196 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800197 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700198 CFlags []string // Flags that apply to C and C++ source files
199 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
200 ConlyFlags []string // Flags that apply to C source files
201 CppFlags []string // Flags that apply to C++ source files
202 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700203 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800204}
205
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500206// Flags contains various types of command line flags (and settings) for use in building build
207// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800208type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500209 // Local flags (which individual modules are responsible for). These may override global flags.
210 Local LocalOrGlobalFlags
211 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800212 Global LocalOrGlobalFlags
213
214 aidlFlags []string // Flags that apply to aidl source files
215 rsFlags []string // Flags that apply to renderscript source files
216 libFlags []string // Flags to add libraries early to the link order
217 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
218 TidyFlags []string // Flags that apply to clang-tidy
219 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700220
Colin Crossc3199482017-03-30 15:03:04 -0700221 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800222 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700223 SystemIncludeFlags []string
224
Oliver Nguyen04526782020-04-21 12:40:27 -0700225 Toolchain config.Toolchain
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500226 Tidy bool // True if clang-tidy is enabled.
227 GcovCoverage bool // True if coverage files should be generated.
228 SAbiDump bool // True if header abi dumps should be generated.
Oliver Nguyen04526782020-04-21 12:40:27 -0700229 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800230
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500231 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800232 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500233 // The target-device system path to the dynamic linker.
234 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800235
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700236 CFlagsDeps android.Paths // Files depended on by compiler flags
237 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800238
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500239 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700240 AssemblerWithCpp bool
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500241 // True if static libraries should be grouped (using `-Wl,--start-group` and `-Wl,--end-group`).
242 GroupStaticLibs bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800243
Colin Cross19878da2019-03-28 14:45:07 -0700244 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700245 protoC bool // Whether to use C instead of C++
246 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700247
248 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200249 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700250}
251
Colin Crossca860ac2016-01-04 14:34:37 -0800252// Properties used to compile all C or C++ modules
253type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700254 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800255 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700256
Colin Crossc511bc52020-04-07 16:50:32 +0000257 // Minimum sdk version supported when compiling against the ndk. Setting this property causes
258 // two variants to be built, one for the platform and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800259 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700260
Jooyung Han379660c2020-04-21 15:24:00 +0900261 // Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
262 Min_sdk_version *string
263
Colin Crossc511bc52020-04-07 16:50:32 +0000264 // If true, always create an sdk variant and don't create a platform variant.
265 Sdk_variant_only *bool
266
Jiyong Parkde866cb2018-12-07 23:08:36 +0900267 AndroidMkSharedLibs []string `blueprint:"mutated"`
268 AndroidMkStaticLibs []string `blueprint:"mutated"`
269 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
270 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700271 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900272 HideFromMake bool `blueprint:"mutated"`
273 PreventInstall bool `blueprint:"mutated"`
274 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700275
Yo Chiang219968c2020-09-22 18:45:04 +0800276 // Set by DepsMutator.
277 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
278
Justin Yun5f7f7e82019-11-18 19:52:14 +0900279 ImageVariationPrefix string `blueprint:"mutated"`
280 VndkVersion string `blueprint:"mutated"`
281 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800282
283 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
284 // file
285 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900286
Yifan Hong39143a92020-10-26 12:43:12 -0700287 // Make this module available when building for ramdisk.
288 // On device without a dedicated recovery partition, the module is only
289 // available after switching root into
290 // /first_stage_ramdisk. To expose the module before switching root, install
291 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800292 Ramdisk_available *bool
293
Yifan Hong39143a92020-10-26 12:43:12 -0700294 // Make this module available when building for vendor ramdisk.
295 // On device without a dedicated recovery partition, the module is only
296 // available after switching root into
297 // /first_stage_ramdisk. To expose the module before switching root, install
298 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700299 Vendor_ramdisk_available *bool
300
Jiyong Parkf9332f12018-02-01 00:54:12 +0900301 // Make this module available when building for recovery
302 Recovery_available *bool
303
Colin Crossae6c5202019-11-20 13:35:50 -0800304 // Set by imageMutator
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700305 CoreVariantNeeded bool `blueprint:"mutated"`
306 RamdiskVariantNeeded bool `blueprint:"mutated"`
307 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
308 RecoveryVariantNeeded bool `blueprint:"mutated"`
309 ExtraVariants []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900310
311 // Allows this module to use non-APEX version of libraries. Useful
312 // for building binaries that are started before APEXes are activated.
313 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900314
315 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
316 // see soong/cc/config/vndk.go
317 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900318
319 // Used by vendor snapshot to record dependencies from snapshot modules.
320 SnapshotSharedLibs []string `blueprint:"mutated"`
321 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000322
323 Installable *bool
Colin Crossc511bc52020-04-07 16:50:32 +0000324
325 // Set by factories of module types that can only be referenced from variants compiled against
326 // the SDK.
327 AlwaysSdk bool `blueprint:"mutated"`
328
329 // Variant is an SDK variant created by sdkMutator
330 IsSdkVariant bool `blueprint:"mutated"`
331 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
332 // variant to have a ".sdk" suffix.
333 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700334
335 // Normally Soong uses the directory structure to decide which modules
336 // should be included (framework) or excluded (non-framework) from the
Jose Galmesf7294582020-11-13 12:07:36 -0800337 // different snapshots (vendor, recovery, etc.), but these properties
338 // allow a partner to exclude a module normally thought of as a
339 // framework module from a snapshot.
340 Exclude_from_vendor_snapshot *bool
341 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900342
343 // List of APEXes that this module has private access to for testing purpose. The module
344 // can depend on libraries that are not exported by the APEXes and use private symbols
345 // from the exported libraries.
346 Test_for []string
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700347}
348
349type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900350 // whether this module should be allowed to be directly depended by other
351 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900352 // If set to true, two variants will be built separately, one like
353 // normal, and the other limited to the set of libraries and headers
354 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700355 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900356 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700357 // so it shouldn't have any unversioned runtime dependencies, or
358 // make assumptions about the system that may not be true in the
359 // future.
360 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900361 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900362 //
363 // Default value is true when vndk: {enabled: true} or vendor: true.
364 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700365 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
366 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900367
Justin Yun63e9ec72020-10-29 16:49:43 +0900368 // whether this module should be allowed to be directly depended by other
369 // modules with `product_specific: true` or `product_available: true`.
370 // If set to true, an additional product variant will be built separately
371 // that is limited to the set of libraries and headers that are exposed to
372 // /product modules.
373 //
374 // The product variant may be used with a different (newer) /system,
375 // so it shouldn't have any unversioned runtime dependencies, or
376 // make assumptions about the system that may not be true in the
377 // future.
378 //
379 // It must be set to true by default for vndk: {enabled: true} modules.
380 //
381 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
382 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
383 Product_available *bool
384
Jiyong Park5fb8c102018-04-09 12:03:06 +0900385 // whether this module is capable of being loaded with other instance
386 // (possibly an older version) of the same module in the same process.
387 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
388 // can be double loaded in a vendor process if the library is also a
389 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
390 // explicitly marked as `double_loadable: true` by the owner, or the dependency
391 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
392 Double_loadable *bool
Colin Crossca860ac2016-01-04 14:34:37 -0800393}
394
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500395// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
396// to understanding details about the type of the current module.
397// For example, one might call these functions to determine whether the current module is a static
398// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800399type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800400 static() bool
401 staticBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900402 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900403 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900404 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700405 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900406 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700407 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800408 sdkVersion() string
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700409 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700410 isNdk(config android.Config) bool
Inseob Kim9516ee92019-05-09 10:56:13 +0900411 isLlndk(config android.Config) bool
412 isLlndkPublic(config android.Config) bool
413 isVndkPrivate(config android.Config) bool
Justin Yun8effde42017-06-23 19:24:43 +0900414 isVndk() bool
415 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500416 IsVndkExt() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900417 inProduct() bool
418 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800419 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700420 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900421 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700422 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700423 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800424 getVndkExtendsModuleName() string
Yi Kong7e53c572018-02-14 18:16:12 +0800425 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800426 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800427 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800428 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700429 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700430 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900431 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800432 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700433 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700434 directlyInAnyApex() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800435}
436
437type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700438 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800439 ModuleContextIntf
440}
441
442type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700443 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800444 ModuleContextIntf
445}
446
Colin Cross37047f12016-12-13 17:06:13 -0800447type DepsContext interface {
448 android.BottomUpMutatorContext
449 ModuleContextIntf
450}
451
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500452// feature represents additional (optional) steps to building cc-related modules, such as invocation
453// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800454type feature interface {
455 begin(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800456 deps(ctx DepsContext, deps Deps) Deps
Colin Crossca860ac2016-01-04 14:34:37 -0800457 flags(ctx ModuleContext, flags Flags) Flags
458 props() []interface{}
459}
460
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500461// compiler is the interface for a compiler helper object. Different module decorators may implement
462// this helper differently. For example, compiling a `cc_library` may use a different build
463// statement than building a `toolchain_library`.
Colin Crossca860ac2016-01-04 14:34:37 -0800464type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700465 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800466 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800467 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700468 compilerProps() []interface{}
469
Colin Cross76fada02016-07-27 10:31:13 -0700470 appendCflags([]string)
471 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700472 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800473}
474
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500475// linker is the interface for a linker decorator object. Individual module types can provide
476// their own implementation for this decorator, and thus specify custom logic regarding build
477// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800478type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700479 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800480 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700481 linkerFlags(ctx ModuleContext, flags Flags) Flags
482 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800483 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700484
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700485 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700486 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900487 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700488
489 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900490 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000491
492 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000493 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
494}
495
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500496// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000497type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500498 sharedLibs []string
499 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
500 // libc, libm, etc.)
501 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800502}
503
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500504// installer is the interface for an installer helper object. This helper is responsible for
505// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800506type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700507 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700508 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000509 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800510 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700511 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700512 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900513 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100514 makeUninstallable(mod *Module)
Colin Crossca860ac2016-01-04 14:34:37 -0800515}
516
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800517type xref interface {
518 XrefCcFiles() android.Paths
519}
520
Colin Cross6e511a92020-07-27 21:26:48 -0700521type libraryDependencyKind int
522
523const (
524 headerLibraryDependency = iota
525 sharedLibraryDependency
526 staticLibraryDependency
527)
528
529func (k libraryDependencyKind) String() string {
530 switch k {
531 case headerLibraryDependency:
532 return "headerLibraryDependency"
533 case sharedLibraryDependency:
534 return "sharedLibraryDependency"
535 case staticLibraryDependency:
536 return "staticLibraryDependency"
537 default:
538 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
539 }
540}
541
542type libraryDependencyOrder int
543
544const (
545 earlyLibraryDependency = -1
546 normalLibraryDependency = 0
547 lateLibraryDependency = 1
548)
549
550func (o libraryDependencyOrder) String() string {
551 switch o {
552 case earlyLibraryDependency:
553 return "earlyLibraryDependency"
554 case normalLibraryDependency:
555 return "normalLibraryDependency"
556 case lateLibraryDependency:
557 return "lateLibraryDependency"
558 default:
559 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
560 }
561}
562
563// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
564// tags that have a set of predefined tag objects that are reused for each dependency, a
565// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
566// That means that comparing a libraryDependencyTag for equality will only be equal if all
567// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
568// then check individual metadata fields instead.
569type libraryDependencyTag struct {
570 blueprint.BaseDependencyTag
571
572 // These are exported so that fmt.Printf("%#v") can call their String methods.
573 Kind libraryDependencyKind
574 Order libraryDependencyOrder
575
576 wholeStatic bool
577
578 reexportFlags bool
579 explicitlyVersioned bool
580 dataLib bool
581 ndk bool
582
583 staticUnwinder bool
584
585 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900586
587 // Whether or not this dependency has to be followed for the apex variants
588 excludeInApex bool
Colin Cross6e511a92020-07-27 21:26:48 -0700589}
590
591// header returns true if the libraryDependencyTag is tagging a header lib dependency.
592func (d libraryDependencyTag) header() bool {
593 return d.Kind == headerLibraryDependency
594}
595
596// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
597func (d libraryDependencyTag) shared() bool {
598 return d.Kind == sharedLibraryDependency
599}
600
601// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
602func (d libraryDependencyTag) static() bool {
603 return d.Kind == staticLibraryDependency
604}
605
Colin Crosse9fe2942020-11-10 18:12:15 -0800606// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
607// binaries or other shared libraries are installed as dependencies.
608func (d libraryDependencyTag) InstallDepNeeded() bool {
609 return d.shared()
610}
611
612var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
613
614// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700615// libraryDependencyTag. Each tag object is created globally and reused for multiple
616// dependencies (although since the object contains no references, assigning a tag to a
617// variable and modifying it will not modify the original). Users can compare the tag
618// returned by ctx.OtherModuleDependencyTag against the global original
619type dependencyTag struct {
620 blueprint.BaseDependencyTag
621 name string
622}
623
Colin Crosse9fe2942020-11-10 18:12:15 -0800624// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
625// libraryDependencyTag, but where the dependency needs to be installed when the parent is
626// installed.
627type installDependencyTag struct {
628 blueprint.BaseDependencyTag
629 android.InstallAlwaysNeededDependencyTag
630 name string
631}
632
Colin Crossc99deeb2016-04-11 15:06:20 -0700633var (
Colin Cross6e511a92020-07-27 21:26:48 -0700634 genSourceDepTag = dependencyTag{name: "gen source"}
635 genHeaderDepTag = dependencyTag{name: "gen header"}
636 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
637 objDepTag = dependencyTag{name: "obj"}
638 linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900639 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700640 reuseObjTag = dependencyTag{name: "reuse objects"}
641 staticVariantTag = dependencyTag{name: "static variant"}
642 vndkExtDepTag = dependencyTag{name: "vndk extends"}
643 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800644 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700645 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700646 stubImplDepTag = dependencyTag{name: "stub_impl"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700647)
648
Colin Cross56a83212020-09-15 18:30:11 -0700649type copyDirectlyInAnyApexDependencyTag dependencyTag
650
651func (copyDirectlyInAnyApexDependencyTag) CopyDirectlyInAnyApex() {}
652
653var _ android.CopyDirectlyInAnyApexTag = copyDirectlyInAnyApexDependencyTag{}
654
Roland Levillainf89cd092019-07-29 16:22:59 +0100655func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700656 ccLibDepTag, ok := depTag.(libraryDependencyTag)
657 return ok && ccLibDepTag.shared()
658}
659
660func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
661 ccLibDepTag, ok := depTag.(libraryDependencyTag)
662 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100663}
664
Zach Johnson3df4e632020-11-06 11:56:27 -0800665func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
666 ccLibDepTag, ok := depTag.(libraryDependencyTag)
667 return ok && ccLibDepTag.header()
668}
669
Roland Levillainf89cd092019-07-29 16:22:59 +0100670func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800671 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100672}
673
674func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700675 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100676 return ok && ccDepTag == testPerSrcDepTag
677}
678
Colin Crossca860ac2016-01-04 14:34:37 -0800679// Module contains the properties and members used by all C/C++ module types, and implements
680// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500681// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
682// interface.
683//
684// To define a C/C++ related module, construct a new Module object and point its delegates to
685// type-specific structs. These delegates will be invoked to register module-specific build
686// statements which may be unique to the module type. For example, module.compiler.compile() should
687// be defined so as to register build statements which are responsible for compiling the module.
688//
689// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
690// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
691// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
692// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800693type Module struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700694 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -0700695 android.DefaultableModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +0900696 android.ApexModuleBase
Jiyong Parkd1063c12019-07-17 20:08:41 +0900697 android.SdkBase
Colin Crossc472d572015-03-17 15:06:21 -0700698
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700699 Properties BaseProperties
700 VendorProperties VendorProperties
Colin Crossfa138792015-04-24 17:31:52 -0700701
Colin Crossca860ac2016-01-04 14:34:37 -0800702 // initialize before calling Init
Colin Cross635c3b02016-05-18 15:37:25 -0700703 hod android.HostOrDeviceSupported
704 multilib android.Multilib
Colin Crossc472d572015-03-17 15:06:21 -0700705
Paul Duffina0843f62019-12-13 19:50:38 +0000706 // Allowable SdkMemberTypes of this module type.
707 sdkMemberTypes []android.SdkMemberType
708
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500709 // decorator delegates, initialize before calling Init
710 // these may contain module-specific implementations, and effectively allow for custom
711 // type-specific logic. These members may reference different objects or the same object.
712 // Functions of these decorators will be invoked to initialize and register type-specific
713 // build statements.
Colin Crossb4ce0ec2016-09-13 13:41:39 -0700714 compiler compiler
715 linker linker
716 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500717
718 features []feature
719 stl *stl
720 sanitize *sanitize
721 coverage *coverage
722 sabi *sabi
723 vndkdep *vndkdep
724 lto *lto
725 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800726
Colin Cross31076b32020-10-23 17:22:06 -0700727 library libraryInterface
728
Colin Cross635c3b02016-05-18 15:37:25 -0700729 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800730
Colin Crossb98c8b02016-07-29 13:44:28 -0700731 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700732
733 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800734
735 // Flags used to compile this module
736 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700737
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800738 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700739 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900740
741 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800742 // Kythe (source file indexer) paths for this compilation module
743 kytheFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900744
745 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700746 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700747
748 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700749}
750
Ivan Lozano52767be2019-10-18 14:49:46 -0700751func (c *Module) Toc() android.OptionalPath {
752 if c.linker != nil {
753 if library, ok := c.linker.(libraryInterface); ok {
754 return library.toc()
755 }
756 }
757 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
758}
759
760func (c *Module) ApiLevel() string {
761 if c.linker != nil {
762 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700763 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700764 }
765 }
766 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
767}
768
769func (c *Module) Static() bool {
770 if c.linker != nil {
771 if library, ok := c.linker.(libraryInterface); ok {
772 return library.static()
773 }
774 }
775 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
776}
777
778func (c *Module) Shared() bool {
779 if c.linker != nil {
780 if library, ok := c.linker.(libraryInterface); ok {
781 return library.shared()
782 }
783 }
784 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
785}
786
787func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +0000788 if c.stl != nil {
789 return c.stl.Properties.SelectedStl
790 }
791 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -0700792}
793
794func (c *Module) ToolchainLibrary() bool {
795 if _, ok := c.linker.(*toolchainLibraryDecorator); ok {
796 return true
797 }
798 return false
799}
800
801func (c *Module) NdkPrebuiltStl() bool {
802 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
803 return true
804 }
805 return false
806}
807
808func (c *Module) StubDecorator() bool {
809 if _, ok := c.linker.(*stubDecorator); ok {
810 return true
811 }
812 return false
813}
814
815func (c *Module) SdkVersion() string {
816 return String(c.Properties.Sdk_version)
817}
818
Artur Satayev480e25b2020-04-27 18:53:18 +0100819func (c *Module) MinSdkVersion() string {
820 return String(c.Properties.Min_sdk_version)
821}
822
Dan Albert92fe7402020-07-15 13:33:30 -0700823func (c *Module) SplitPerApiLevel() bool {
Colin Cross1348ce32020-10-01 13:37:16 -0700824 if !c.canUseSdk() {
825 return false
826 }
Dan Albert92fe7402020-07-15 13:33:30 -0700827 if linker, ok := c.linker.(*objectLinker); ok {
828 return linker.isCrt()
829 }
830 return false
831}
832
Colin Crossc511bc52020-04-07 16:50:32 +0000833func (c *Module) AlwaysSdk() bool {
834 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
835}
836
Ivan Lozano183a3212019-10-18 14:18:45 -0700837func (c *Module) CcLibrary() bool {
838 if c.linker != nil {
839 if _, ok := c.linker.(*libraryDecorator); ok {
840 return true
841 }
Colin Crossd48fe732020-09-23 20:37:24 -0700842 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
843 return true
844 }
Ivan Lozano183a3212019-10-18 14:18:45 -0700845 }
846 return false
847}
848
849func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -0700850 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700851 return true
852 }
853 return false
854}
855
Ivan Lozano2b262972019-11-21 12:30:50 -0800856func (c *Module) NonCcVariants() bool {
857 return false
858}
859
Ivan Lozano183a3212019-10-18 14:18:45 -0700860func (c *Module) SetStatic() {
861 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700862 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700863 library.setStatic()
864 return
865 }
866 }
867 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
868}
869
870func (c *Module) SetShared() {
871 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700872 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700873 library.setShared()
874 return
875 }
876 }
877 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
878}
879
880func (c *Module) BuildStaticVariant() bool {
881 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700882 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700883 return library.buildStatic()
884 }
885 }
886 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
887}
888
889func (c *Module) BuildSharedVariant() bool {
890 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700891 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700892 return library.buildShared()
893 }
894 }
895 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
896}
897
898func (c *Module) Module() android.Module {
899 return c
900}
901
Jiyong Parkc20eee32018-09-05 22:36:17 +0900902func (c *Module) OutputFile() android.OptionalPath {
903 return c.outputFile
904}
905
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400906func (c *Module) CoverageFiles() android.Paths {
907 if c.linker != nil {
908 if library, ok := c.linker.(libraryInterface); ok {
909 return library.objs().coverageFiles
910 }
911 }
912 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
913}
914
Ivan Lozano183a3212019-10-18 14:18:45 -0700915var _ LinkableInterface = (*Module)(nil)
916
Jiyong Park719b4462019-01-13 00:39:51 +0900917func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900918 if c.linker != nil {
919 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +0900920 }
921 return nil
922}
923
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900924func (c *Module) CoverageOutputFile() android.OptionalPath {
925 if c.linker != nil {
926 return c.linker.coverageOutputFilePath()
927 }
928 return android.OptionalPath{}
929}
930
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900931func (c *Module) RelativeInstallPath() string {
932 if c.installer != nil {
933 return c.installer.relativeInstallPath()
934 }
935 return ""
936}
937
Jooyung Han344d5432019-08-23 11:17:39 +0900938func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900939 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +0900940}
941
Colin Cross36242852017-06-23 15:06:31 -0700942func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -0700943 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -0800944 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -0700945 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800946 }
947 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -0700948 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800949 }
950 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -0700951 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800952 }
Colin Crossa8e07cc2016-04-04 15:07:06 -0700953 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -0700954 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -0700955 }
Colin Cross16b23492016-01-06 14:41:07 -0800956 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -0700957 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -0800958 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800959 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -0700960 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -0800961 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800962 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -0700963 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800964 }
Justin Yun8effde42017-06-23 19:24:43 +0900965 if c.vndkdep != nil {
966 c.AddProperties(c.vndkdep.props()...)
967 }
Stephen Craneba090d12017-05-09 15:44:35 -0700968 if c.lto != nil {
969 c.AddProperties(c.lto.props()...)
970 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700971 if c.pgo != nil {
972 c.AddProperties(c.pgo.props()...)
973 }
Colin Crossca860ac2016-01-04 14:34:37 -0800974 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -0700975 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800976 }
Colin Crossc472d572015-03-17 15:06:21 -0700977
Jiyong Park1613e552020-09-14 19:43:17 +0900978 c.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, os android.OsType) bool {
Elliott Hughes79ae3412020-04-17 15:49:49 -0700979 // Windows builds always prefer 32-bit
Jiyong Park1613e552020-09-14 19:43:17 +0900980 return os == android.Windows
Colin Crossa9d8bee2018-10-02 13:59:46 -0700981 })
Colin Cross36242852017-06-23 15:06:31 -0700982 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +0900983 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +0900984 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +0900985 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +0900986
Colin Cross36242852017-06-23 15:06:31 -0700987 return c
Colin Crossc472d572015-03-17 15:06:21 -0700988}
989
Colin Crossb916a382016-07-29 17:28:03 -0700990// Returns true for dependency roots (binaries)
991// TODO(ccross): also handle dlopenable libraries
992func (c *Module) isDependencyRoot() bool {
993 if root, ok := c.linker.(interface {
994 isDependencyRoot() bool
995 }); ok {
996 return root.isDependencyRoot()
997 }
998 return false
999}
1000
Justin Yun5f7f7e82019-11-18 19:52:14 +09001001// Returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64.
1002// "product" and "vendor" variant modules return true for this function.
1003// When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true",
1004// "soc_specific: true" and more vendor installed modules are included here.
Justin Yun63e9ec72020-10-29 16:49:43 +09001005// When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "product_available: true" or
Justin Yun5f7f7e82019-11-18 19:52:14 +09001006// "product_specific: true" modules are included here.
Ivan Lozano52767be2019-10-18 14:49:46 -07001007func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001008 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001009}
1010
Colin Crossc511bc52020-04-07 16:50:32 +00001011func (c *Module) canUseSdk() bool {
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001012 return c.Os() == android.Android && !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001013}
1014
1015func (c *Module) UseSdk() bool {
1016 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001017 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001018 }
1019 return false
1020}
1021
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001022func (c *Module) isCoverageVariant() bool {
1023 return c.coverage.Properties.IsCoverageVariant
1024}
1025
Colin Cross95f1ca02020-10-29 20:47:22 -07001026func (c *Module) IsNdk(config android.Config) bool {
1027 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001028}
1029
Inseob Kim9516ee92019-05-09 10:56:13 +09001030func (c *Module) isLlndk(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001031 // Returns true for both LLNDK (public) and LLNDK-private libs.
Jooyung Han0302a842019-10-30 18:43:49 +09001032 return isLlndkLibrary(c.BaseModuleName(), config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001033}
1034
Inseob Kim9516ee92019-05-09 10:56:13 +09001035func (c *Module) isLlndkPublic(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001036 // Returns true only for LLNDK (public) libs.
Jooyung Han0302a842019-10-30 18:43:49 +09001037 name := c.BaseModuleName()
1038 return isLlndkLibrary(name, config) && !isVndkPrivateLibrary(name, config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001039}
1040
Ivan Lozanof9e21722020-12-02 09:00:51 -05001041func (c *Module) IsVndkPrivate(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001042 // Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Jooyung Han0302a842019-10-30 18:43:49 +09001043 return isVndkPrivateLibrary(c.BaseModuleName(), config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001044}
1045
Ivan Lozano52767be2019-10-18 14:49:46 -07001046func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001047 if vndkdep := c.vndkdep; vndkdep != nil {
1048 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001049 }
1050 return false
1051}
1052
Yi Kong7e53c572018-02-14 18:16:12 +08001053func (c *Module) isPgoCompile() bool {
1054 if pgo := c.pgo; pgo != nil {
1055 return pgo.Properties.PgoCompile
1056 }
1057 return false
1058}
1059
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001060func (c *Module) isNDKStubLibrary() bool {
1061 if _, ok := c.compiler.(*stubDecorator); ok {
1062 return true
1063 }
1064 return false
1065}
1066
Logan Chienf3511742017-10-31 18:04:35 +08001067func (c *Module) isVndkSp() bool {
1068 if vndkdep := c.vndkdep; vndkdep != nil {
1069 return vndkdep.isVndkSp()
1070 }
1071 return false
1072}
1073
Ivan Lozanof9e21722020-12-02 09:00:51 -05001074func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001075 if vndkdep := c.vndkdep; vndkdep != nil {
1076 return vndkdep.isVndkExt()
1077 }
1078 return false
1079}
1080
Ivan Lozano52767be2019-10-18 14:49:46 -07001081func (c *Module) MustUseVendorVariant() bool {
Jooyung Han097087b2019-10-22 19:32:18 +09001082 return c.isVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001083}
1084
Logan Chienf3511742017-10-31 18:04:35 +08001085func (c *Module) getVndkExtendsModuleName() string {
1086 if vndkdep := c.vndkdep; vndkdep != nil {
1087 return vndkdep.getVndkExtendsModuleName()
1088 }
1089 return ""
1090}
1091
Jiyong Park25fc6a92018-11-18 18:02:45 +09001092func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001093 if lib := c.library; lib != nil {
1094 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001095 }
1096 return false
1097}
1098
1099func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001100 if lib := c.library; lib != nil {
1101 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001102 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001103 return false
1104}
1105
Colin Cross0477b422020-10-13 18:43:54 -07001106// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1107// the implementation. If it is an implementation library it returns its own name.
1108func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1109 name := ctx.OtherModuleName(c)
1110 if versioned, ok := c.linker.(versionedInterface); ok {
1111 name = versioned.implementationModuleName(name)
1112 }
1113 return name
1114}
1115
Martin Stjernholm2856c662020-12-02 15:03:42 +00001116// Similar to ImplementationModuleName, but uses the Make variant of the module
1117// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1118// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1119// under the premise that the prebuilt module overrides its source counterpart
1120// if it is exposed to Make).
1121func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1122 name := c.BaseModuleName()
1123 if versioned, ok := c.linker.(versionedInterface); ok {
1124 name = versioned.implementationModuleName(name)
1125 }
1126 return name
1127}
1128
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001129func (c *Module) bootstrap() bool {
1130 return Bool(c.Properties.Bootstrap)
1131}
1132
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001133func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001134 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1135 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1136 return false
1137 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001138 return c.linker != nil && c.linker.nativeCoverage()
1139}
1140
Inseob Kim8471cda2019-11-15 09:59:12 +09001141func (c *Module) isSnapshotPrebuilt() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09001142 if p, ok := c.linker.(interface{ isSnapshotPrebuilt() bool }); ok {
1143 return p.isSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001144 }
1145 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001146}
1147
Bill Peckham945441c2020-08-31 16:07:58 -07001148func (c *Module) ExcludeFromVendorSnapshot() bool {
1149 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1150}
1151
Jose Galmesf7294582020-11-13 12:07:36 -08001152func (c *Module) ExcludeFromRecoverySnapshot() bool {
1153 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1154}
1155
Jiyong Parkf1194352019-02-25 11:05:47 +09001156func isBionic(name string) bool {
1157 switch name {
Kiyoung Kim4098c7e2020-11-30 14:42:14 +09001158 case "libc", "libm", "libdl", "libdl_android", "linker", "linkerconfig":
Jiyong Parkf1194352019-02-25 11:05:47 +09001159 return true
1160 }
1161 return false
1162}
1163
Martin Stjernholm279de572019-09-10 23:18:20 +01001164func InstallToBootstrap(name string, config android.Config) bool {
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001165 if name == "libclang_rt.hwasan-aarch64-android" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001166 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001167 }
1168 return isBionic(name)
1169}
1170
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001171func (c *Module) XrefCcFiles() android.Paths {
1172 return c.kytheFiles
1173}
1174
Colin Crossca860ac2016-01-04 14:34:37 -08001175type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001176 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001177 moduleContextImpl
1178}
1179
Colin Cross37047f12016-12-13 17:06:13 -08001180type depsContext struct {
1181 android.BottomUpMutatorContext
1182 moduleContextImpl
1183}
1184
Colin Crossca860ac2016-01-04 14:34:37 -08001185type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001186 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001187 moduleContextImpl
1188}
1189
1190type moduleContextImpl struct {
1191 mod *Module
1192 ctx BaseModuleContext
1193}
1194
Colin Crossb98c8b02016-07-29 13:44:28 -07001195func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001196 return ctx.mod.toolchain(ctx.ctx)
1197}
1198
1199func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001200 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001201}
1202
1203func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001204 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001205}
1206
Jiyong Park1d1119f2019-07-29 21:27:18 +09001207func (ctx *moduleContextImpl) header() bool {
1208 return ctx.mod.header()
1209}
1210
Inseob Kim7f283f42020-06-01 21:53:49 +09001211func (ctx *moduleContextImpl) binary() bool {
1212 return ctx.mod.binary()
1213}
1214
Inseob Kim1042d292020-06-01 23:23:05 +09001215func (ctx *moduleContextImpl) object() bool {
1216 return ctx.mod.object()
1217}
1218
Jooyung Hanccce2f22020-03-07 03:45:53 +09001219func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001220 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001221}
1222
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001223func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001224 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001225}
1226
1227func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001228 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001229 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001230 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001231 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001232 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001233 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001234 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001235 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001236 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001237 }
1238 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001239}
1240
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001241func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001242 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001243}
Justin Yun8effde42017-06-23 19:24:43 +09001244
Colin Cross95f1ca02020-10-29 20:47:22 -07001245func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1246 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001247}
1248
Inseob Kim9516ee92019-05-09 10:56:13 +09001249func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {
1250 return ctx.mod.isLlndk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001251}
1252
Inseob Kim9516ee92019-05-09 10:56:13 +09001253func (ctx *moduleContextImpl) isLlndkPublic(config android.Config) bool {
1254 return ctx.mod.isLlndkPublic(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001255}
1256
Inseob Kim9516ee92019-05-09 10:56:13 +09001257func (ctx *moduleContextImpl) isVndkPrivate(config android.Config) bool {
Ivan Lozanof9e21722020-12-02 09:00:51 -05001258 return ctx.mod.IsVndkPrivate(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001259}
1260
Logan Chienf3511742017-10-31 18:04:35 +08001261func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001262 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001263}
1264
Yi Kong7e53c572018-02-14 18:16:12 +08001265func (ctx *moduleContextImpl) isPgoCompile() bool {
1266 return ctx.mod.isPgoCompile()
1267}
1268
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001269func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1270 return ctx.mod.isNDKStubLibrary()
1271}
1272
Justin Yun8effde42017-06-23 19:24:43 +09001273func (ctx *moduleContextImpl) isVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001274 return ctx.mod.isVndkSp()
1275}
1276
Ivan Lozanof9e21722020-12-02 09:00:51 -05001277func (ctx *moduleContextImpl) IsVndkExt() bool {
1278 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001279}
1280
Vic Yangefd249e2018-11-12 20:19:56 -08001281func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001282 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001283}
1284
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001285func (ctx *moduleContextImpl) selectedStl() string {
1286 if stl := ctx.mod.stl; stl != nil {
1287 return stl.Properties.SelectedStl
1288 }
1289 return ""
1290}
1291
Ivan Lozanobd721262018-11-27 14:33:03 -08001292func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1293 return ctx.mod.linker.useClangLld(actx)
1294}
1295
Colin Crossce75d2c2016-10-06 16:12:58 -07001296func (ctx *moduleContextImpl) baseModuleName() string {
1297 return ctx.mod.ModuleBase.BaseModuleName()
1298}
1299
Logan Chienf3511742017-10-31 18:04:35 +08001300func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1301 return ctx.mod.getVndkExtendsModuleName()
1302}
1303
Logan Chiene274fc92019-12-03 11:18:32 -08001304func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001305 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001306}
1307
Colin Crosse07f2312020-08-13 11:24:56 -07001308func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001309 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001310}
1311
Dan Albertc8060532020-07-22 22:32:17 -07001312func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001313 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001314}
1315
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001316func (ctx *moduleContextImpl) bootstrap() bool {
1317 return ctx.mod.bootstrap()
1318}
1319
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001320func (ctx *moduleContextImpl) nativeCoverage() bool {
1321 return ctx.mod.nativeCoverage()
1322}
1323
Colin Cross56a83212020-09-15 18:30:11 -07001324func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1325 return ctx.mod.DirectlyInAnyApex()
1326}
1327
Colin Cross635c3b02016-05-18 15:37:25 -07001328func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001329 return &Module{
1330 hod: hod,
1331 multilib: multilib,
1332 }
1333}
1334
Colin Cross635c3b02016-05-18 15:37:25 -07001335func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001336 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001337 module.features = []feature{
1338 &tidyFeature{},
1339 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001340 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001341 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001342 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001343 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001344 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001345 module.lto = &lto{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001346 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001347 return module
1348}
1349
Colin Crossce75d2c2016-10-06 16:12:58 -07001350func (c *Module) Prebuilt() *android.Prebuilt {
1351 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1352 return p.prebuilt()
1353 }
1354 return nil
1355}
1356
1357func (c *Module) Name() string {
1358 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001359 if p, ok := c.linker.(interface {
1360 Name(string) string
1361 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001362 name = p.Name(name)
1363 }
1364 return name
1365}
1366
Alex Light3d673592019-01-18 14:37:31 -08001367func (c *Module) Symlinks() []string {
1368 if p, ok := c.installer.(interface {
1369 symlinkList() []string
1370 }); ok {
1371 return p.symlinkList()
1372 }
1373 return nil
1374}
1375
Roland Levillainf89cd092019-07-29 16:22:59 +01001376func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1377 test, ok := c.linker.(testPerSrc)
1378 return ok && test.isAllTestsVariation()
1379}
1380
Chris Parsons216e10a2020-07-09 17:12:52 -04001381func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001382 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001383 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001384 }); ok {
1385 return p.dataPaths()
1386 }
1387 return nil
1388}
1389
Justin Yun5f7f7e82019-11-18 19:52:14 +09001390func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
1391 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1392 // "current", it will append the VNDK version to the name suffix.
1393 var vndkVersion string
1394 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001395 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001396 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
1397 nameSuffix = productSuffix
1398 } else {
1399 vndkVersion = ctx.DeviceConfig().VndkVersion()
1400 nameSuffix = vendorSuffix
1401 }
1402 if vndkVersion == "current" {
1403 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1404 }
1405 if c.Properties.VndkVersion != vndkVersion {
1406 // add version suffix only if the module is using different vndk version than the
1407 // version in product or vendor partition.
1408 nameSuffix += "." + c.Properties.VndkVersion
1409 }
1410 return nameSuffix
1411}
1412
Colin Cross635c3b02016-05-18 15:37:25 -07001413func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Roland Levillainf2fad972019-06-28 15:41:19 +01001414 // Handle the case of a test module split by `test_per_src` mutator.
Roland Levillainf89cd092019-07-29 16:22:59 +01001415 //
1416 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1417 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1418 // module and return early, as this module does not produce an output file per se.
1419 if c.IsTestPerSrcAllTestsVariation() {
1420 c.outputFile = android.OptionalPath{}
1421 return
Roland Levillainf2fad972019-06-28 15:41:19 +01001422 }
1423
Colin Cross56a83212020-09-15 18:30:11 -07001424 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1425 if !apexInfo.IsForPlatform() {
1426 c.hideApexVariantFromMake = true
1427 }
1428
Ivan Lozanof9e21722020-12-02 09:00:51 -05001429 c.makeLinkType = GetMakeLinkType(actx, c)
Inseob Kim9516ee92019-05-09 10:56:13 +09001430
Inseob Kim64c43952019-08-26 16:52:35 +09001431 c.Properties.SubName = ""
1432
1433 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1434 c.Properties.SubName += nativeBridgeSuffix
1435 }
1436
Justin Yun5f7f7e82019-11-18 19:52:14 +09001437 _, llndk := c.linker.(*llndkStubDecorator)
1438 _, llndkHeader := c.linker.(*llndkHeadersDecorator)
Justin Yun63e9ec72020-10-29 16:49:43 +09001439 if llndk || llndkHeader || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001440 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1441 // added for product variant only when we have vendor and product variants with core
1442 // variant. The suffix is not added for vendor-only or product-only module.
1443 c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
1444 } else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
Inseob Kim64c43952019-08-26 16:52:35 +09001445 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1446 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
1447 c.Properties.SubName += vendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001448 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
1449 c.Properties.SubName += ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001450 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
1451 c.Properties.SubName += vendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001452 } else if c.InRecovery() && !c.OnlyInRecovery() {
Inseob Kim64c43952019-08-26 16:52:35 +09001453 c.Properties.SubName += recoverySuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001454 } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
Colin Crossc511bc52020-04-07 16:50:32 +00001455 c.Properties.SubName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001456 if c.SplitPerApiLevel() {
1457 c.Properties.SubName += "." + c.SdkVersion()
1458 }
Inseob Kim64c43952019-08-26 16:52:35 +09001459 }
1460
Colin Crossca860ac2016-01-04 14:34:37 -08001461 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001462 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001463 moduleContextImpl: moduleContextImpl{
1464 mod: c,
1465 },
1466 }
1467 ctx.ctx = ctx
1468
Colin Crossf18e1102017-11-16 14:33:08 -08001469 deps := c.depsToPaths(ctx)
1470 if ctx.Failed() {
1471 return
1472 }
1473
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001474 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1475 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1476 }
1477
Colin Crossca860ac2016-01-04 14:34:37 -08001478 flags := Flags{
1479 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001480 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001481 }
Colin Crossca860ac2016-01-04 14:34:37 -08001482 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001483 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001484 }
1485 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001486 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001487 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001488 if c.stl != nil {
1489 flags = c.stl.flags(ctx, flags)
1490 }
Colin Cross16b23492016-01-06 14:41:07 -08001491 if c.sanitize != nil {
1492 flags = c.sanitize.flags(ctx, flags)
1493 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001494 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001495 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001496 }
Stephen Craneba090d12017-05-09 15:44:35 -07001497 if c.lto != nil {
1498 flags = c.lto.flags(ctx, flags)
1499 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001500 if c.pgo != nil {
1501 flags = c.pgo.flags(ctx, flags)
1502 }
Colin Crossca860ac2016-01-04 14:34:37 -08001503 for _, feature := range c.features {
1504 flags = feature.flags(ctx, flags)
1505 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001506 if ctx.Failed() {
1507 return
1508 }
1509
Colin Cross4af21ed2019-11-04 09:37:55 -08001510 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1511 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1512 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001513
Colin Cross4af21ed2019-11-04 09:37:55 -08001514 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001515
1516 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001517 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001518 }
1519 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001520 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001521 }
1522
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001523 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001524 // We need access to all the flags seen by a source file.
1525 if c.sabi != nil {
1526 flags = c.sabi.flags(ctx, flags)
1527 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001528
Colin Cross4af21ed2019-11-04 09:37:55 -08001529 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001530
Colin Crossca860ac2016-01-04 14:34:37 -08001531 // Optimization to reduce size of build.ninja
1532 // Replace the long list of flags for each file with a module-local variable
Colin Cross4af21ed2019-11-04 09:37:55 -08001533 ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
1534 ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
1535 ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
1536 flags.Local.CFlags = []string{"$cflags"}
1537 flags.Local.CppFlags = []string{"$cppflags"}
1538 flags.Local.AsFlags = []string{"$asflags"}
Colin Crossca860ac2016-01-04 14:34:37 -08001539
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001540 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001541 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001542 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001543 if ctx.Failed() {
1544 return
1545 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001546 c.kytheFiles = objs.kytheFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001547 }
1548
Colin Crossca860ac2016-01-04 14:34:37 -08001549 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001550 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001551 if ctx.Failed() {
1552 return
1553 }
Colin Cross635c3b02016-05-18 15:37:25 -07001554 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001555
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09001556 // If a lib is directly included in any of the APEXes or is not available to the
1557 // platform (which is often the case when the stub is provided as a prebuilt),
1558 // unhide the stubs variant having the latest version gets visible to make. In
1559 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
1560 // force anything in the make world to link against the stubs library. (unless it
1561 // is explicitly referenced via .bootstrap suffix or the module is marked with
1562 // 'bootstrap: true').
1563 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Ivan Lozano52767be2019-10-18 14:49:46 -07001564 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001565 c.IsStubs() && !c.InVendorRamdisk() {
Jiyong Parkb0788572018-12-20 22:10:17 +09001566 c.Properties.HideFromMake = false // unhide
1567 // Note: this is still non-installable
1568 }
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001569
1570 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current.
1571 if i, ok := c.linker.(snapshotLibraryInterface); ok && ctx.DeviceConfig().VndkVersion() == "current" {
Inseob Kimde5744a2020-12-02 13:14:28 +09001572 if shouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001573 i.collectHeadersForSnapshot(ctx)
1574 }
1575 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001576 }
Colin Cross5049f022015-03-18 13:28:46 -07001577
Colin Cross56a83212020-09-15 18:30:11 -07001578 if c.installable(apexInfo) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001579 c.installer.install(ctx, c.outputFile.Path())
1580 if ctx.Failed() {
1581 return
Colin Crossca860ac2016-01-04 14:34:37 -08001582 }
Paul Duffin0cb37b92020-03-04 14:52:46 +00001583 } else if !proptools.BoolDefault(c.Properties.Installable, true) {
1584 // If the module has been specifically configure to not be installed then
1585 // skip the installation as otherwise it will break when running inside make
1586 // as the output path to install will not be specified. Not all uninstallable
1587 // modules can skip installation as some are needed for resolving make side
1588 // dependencies.
1589 c.SkipInstall()
Dan Albertc403f7c2015-03-18 14:01:18 -07001590 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001591}
1592
Colin Cross0ea8ba82019-06-06 14:33:29 -07001593func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001594 if c.cachedToolchain == nil {
Colin Crossb98c8b02016-07-29 13:44:28 -07001595 c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
Colin Cross3f40fa42015-01-30 17:27:36 -08001596 }
Colin Crossca860ac2016-01-04 14:34:37 -08001597 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08001598}
1599
Colin Crossca860ac2016-01-04 14:34:37 -08001600func (c *Module) begin(ctx BaseModuleContext) {
1601 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001602 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07001603 }
Colin Crossca860ac2016-01-04 14:34:37 -08001604 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001605 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001606 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001607 if c.stl != nil {
1608 c.stl.begin(ctx)
1609 }
Colin Cross16b23492016-01-06 14:41:07 -08001610 if c.sanitize != nil {
1611 c.sanitize.begin(ctx)
1612 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001613 if c.coverage != nil {
1614 c.coverage.begin(ctx)
1615 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001616 if c.sabi != nil {
1617 c.sabi.begin(ctx)
1618 }
Justin Yun8effde42017-06-23 19:24:43 +09001619 if c.vndkdep != nil {
1620 c.vndkdep.begin(ctx)
1621 }
Stephen Craneba090d12017-05-09 15:44:35 -07001622 if c.lto != nil {
1623 c.lto.begin(ctx)
1624 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001625 if c.pgo != nil {
1626 c.pgo.begin(ctx)
1627 }
Colin Crossca860ac2016-01-04 14:34:37 -08001628 for _, feature := range c.features {
1629 feature.begin(ctx)
1630 }
Dan Albert92fe7402020-07-15 13:33:30 -07001631 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07001632 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001633 if err != nil {
1634 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07001635 c.Properties.Sdk_version = nil
1636 } else {
1637 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001638 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001639 }
Colin Crossca860ac2016-01-04 14:34:37 -08001640}
1641
Colin Cross37047f12016-12-13 17:06:13 -08001642func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07001643 deps := Deps{}
1644
1645 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001646 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001647 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001648 // Add the PGO dependency (the clang_rt.profile runtime library), which
1649 // sometimes depends on symbols from libgcc, before libgcc gets added
1650 // in linkerDeps().
Pirama Arumuga Nainar49b53d52017-10-04 16:47:29 -07001651 if c.pgo != nil {
1652 deps = c.pgo.deps(ctx, deps)
1653 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001654 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001655 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001656 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001657 if c.stl != nil {
1658 deps = c.stl.deps(ctx, deps)
1659 }
Colin Cross16b23492016-01-06 14:41:07 -08001660 if c.sanitize != nil {
1661 deps = c.sanitize.deps(ctx, deps)
1662 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001663 if c.coverage != nil {
1664 deps = c.coverage.deps(ctx, deps)
1665 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001666 if c.sabi != nil {
1667 deps = c.sabi.deps(ctx, deps)
1668 }
Justin Yun8effde42017-06-23 19:24:43 +09001669 if c.vndkdep != nil {
1670 deps = c.vndkdep.deps(ctx, deps)
1671 }
Stephen Craneba090d12017-05-09 15:44:35 -07001672 if c.lto != nil {
1673 deps = c.lto.deps(ctx, deps)
1674 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001675 for _, feature := range c.features {
1676 deps = feature.deps(ctx, deps)
1677 }
1678
Colin Crossb6715442017-10-24 11:13:31 -07001679 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1680 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1681 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
1682 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1683 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
1684 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08001685 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07001686
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001687 for _, lib := range deps.ReexportSharedLibHeaders {
1688 if !inList(lib, deps.SharedLibs) {
1689 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
1690 }
1691 }
1692
1693 for _, lib := range deps.ReexportStaticLibHeaders {
1694 if !inList(lib, deps.StaticLibs) {
1695 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib)
1696 }
1697 }
1698
Colin Cross5950f382016-12-13 12:50:57 -08001699 for _, lib := range deps.ReexportHeaderLibHeaders {
1700 if !inList(lib, deps.HeaderLibs) {
1701 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
1702 }
1703 }
1704
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001705 for _, gen := range deps.ReexportGeneratedHeaders {
1706 if !inList(gen, deps.GeneratedHeaders) {
1707 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
1708 }
1709 }
1710
Colin Crossc99deeb2016-04-11 15:06:20 -07001711 return deps
1712}
1713
Dan Albert7e9d2952016-08-04 13:02:36 -07001714func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08001715 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001716 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001717 moduleContextImpl: moduleContextImpl{
1718 mod: c,
1719 },
1720 }
1721 ctx.ctx = ctx
1722
Colin Crossca860ac2016-01-04 14:34:37 -08001723 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07001724}
1725
Jiyong Park7ed9de32018-10-15 22:25:07 +09001726// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09001727func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001728 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
1729 version := name[sharp+1:]
1730 libname := name[:sharp]
1731 return libname, version
1732 }
1733 return name, ""
1734}
1735
Dan Albert92fe7402020-07-15 13:33:30 -07001736func GetCrtVariations(ctx android.BottomUpMutatorContext,
1737 m LinkableInterface) []blueprint.Variation {
1738 if ctx.Os() != android.Android {
1739 return nil
1740 }
1741 if m.UseSdk() {
1742 return []blueprint.Variation{
1743 {Mutator: "sdk", Variation: "sdk"},
Colin Crossbbc941b2020-09-30 12:27:01 -07001744 {Mutator: "version", Variation: m.SdkVersion()},
Dan Albert92fe7402020-07-15 13:33:30 -07001745 }
1746 }
1747 return []blueprint.Variation{
1748 {Mutator: "sdk", Variation: ""},
1749 }
1750}
1751
Colin Crosse7257d22020-09-24 09:56:18 -07001752func (c *Module) addSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext,
1753 variations []blueprint.Variation, depTag libraryDependencyTag, name, version string, far bool) {
1754
1755 variations = append([]blueprint.Variation(nil), variations...)
1756
Colin Cross3146c5c2020-09-30 15:34:40 -07001757 if version != "" && CanBeOrLinkAgainstVersionVariants(c) {
Colin Crosse7257d22020-09-24 09:56:18 -07001758 // Version is explicitly specified. i.e. libFoo#30
1759 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
1760 depTag.explicitlyVersioned = true
1761 }
Colin Crosse7257d22020-09-24 09:56:18 -07001762
Colin Cross0de8a1e2020-09-18 14:15:30 -07001763 if far {
1764 ctx.AddFarVariationDependencies(variations, depTag, name)
1765 } else {
1766 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07001767 }
1768}
1769
Colin Cross1e676be2016-10-12 14:38:15 -07001770func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09001771 if !c.Enabled() {
1772 return
1773 }
1774
Colin Cross37047f12016-12-13 17:06:13 -08001775 ctx := &depsContext{
1776 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07001777 moduleContextImpl: moduleContextImpl{
1778 mod: c,
1779 },
1780 }
1781 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08001782
Colin Crossc99deeb2016-04-11 15:06:20 -07001783 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001784
Yo Chiang219968c2020-09-22 18:45:04 +08001785 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
1786
Dan Albert914449f2016-06-17 16:45:24 -07001787 variantNdkLibs := []string{}
1788 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07001789 if ctx.Os() == android.Android {
Inseob Kimeec88e12020-01-22 11:11:29 +09001790 // rewriteLibs takes a list of names of shared libraries and scans it for three types
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001791 // of names:
Dan Albert914449f2016-06-17 16:45:24 -07001792 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001793 // 1. Name of an NDK library that refers to a prebuilt module.
1794 // For each of these, it adds the name of the prebuilt module (which will be in
1795 // prebuilts/ndk) to the list of nonvariant libs.
1796 // 2. Name of an NDK library that refers to an ndk_library module.
1797 // For each of these, it adds the name of the ndk_library module to the list of
1798 // variant libs.
1799 // 3. Anything else (so anything that isn't an NDK library).
1800 // It adds these to the nonvariantLibs list.
Dan Albert914449f2016-06-17 16:45:24 -07001801 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001802 // The caller can then know to add the variantLibs dependencies differently from the
1803 // nonvariantLibs
Inseob Kim9516ee92019-05-09 10:56:13 +09001804
Inseob Kim9516ee92019-05-09 10:56:13 +09001805 vendorPublicLibraries := vendorPublicLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001806 vendorSnapshotSharedLibs := vendorSnapshotSharedLibs(actx.Config())
1807
1808 rewriteVendorLibs := func(lib string) string {
1809 if isLlndkLibrary(lib, ctx.Config()) {
1810 return lib + llndkLibrarySuffix
1811 }
1812
1813 // only modules with BOARD_VNDK_VERSION uses snapshot.
1814 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1815 return lib
1816 }
1817
1818 if snapshot, ok := vendorSnapshotSharedLibs.get(lib, actx.Arch().ArchType); ok {
1819 return snapshot
1820 }
1821
1822 return lib
1823 }
1824
1825 rewriteLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001826 variantLibs = []string{}
1827 nonvariantLibs = []string{}
Dan Albert914449f2016-06-17 16:45:24 -07001828 for _, entry := range list {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001829 // strip #version suffix out
Jiyong Park73c54ee2019-10-22 20:31:18 +09001830 name, _ := StubsLibNameAndVersion(entry)
Colin Cross95f1ca02020-10-29 20:47:22 -07001831 if ctx.useSdk() && inList(name, *getNDKKnownLibs(ctx.Config())) {
Dan Albertde5aade2020-06-30 12:32:51 -07001832 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Inseob Kimeec88e12020-01-22 11:11:29 +09001833 } else if ctx.useVndk() {
1834 nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
Inseob Kim9516ee92019-05-09 10:56:13 +09001835 } else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, *vendorPublicLibraries) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001836 vendorPublicLib := name + vendorPublicLibrarySuffix
Jiyong Park374510b2018-03-19 18:23:01 +09001837 if actx.OtherModuleExists(vendorPublicLib) {
1838 nonvariantLibs = append(nonvariantLibs, vendorPublicLib)
1839 } else {
1840 // This can happen if vendor_public_library module is defined in a
1841 // namespace that isn't visible to the current module. In that case,
1842 // link to the original library.
Jiyong Park7ed9de32018-10-15 22:25:07 +09001843 nonvariantLibs = append(nonvariantLibs, name)
Jiyong Park374510b2018-03-19 18:23:01 +09001844 }
Dan Albert914449f2016-06-17 16:45:24 -07001845 } else {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001846 // put name#version back
Dan Willemsen7cbf5f82017-03-28 00:08:30 -07001847 nonvariantLibs = append(nonvariantLibs, entry)
Dan Willemsen72d39932016-07-08 23:23:48 -07001848 }
1849 }
Dan Albert914449f2016-06-17 16:45:24 -07001850 return nonvariantLibs, variantLibs
Dan Willemsen72d39932016-07-08 23:23:48 -07001851 }
1852
Inseob Kimeec88e12020-01-22 11:11:29 +09001853 deps.SharedLibs, variantNdkLibs = rewriteLibs(deps.SharedLibs)
1854 deps.LateSharedLibs, variantLateNdkLibs = rewriteLibs(deps.LateSharedLibs)
1855 deps.ReexportSharedLibHeaders, _ = rewriteLibs(deps.ReexportSharedLibHeaders)
1856 if ctx.useVndk() {
1857 for idx, lib := range deps.RuntimeLibs {
1858 deps.RuntimeLibs[idx] = rewriteVendorLibs(lib)
1859 }
1860 }
Dan Willemsen72d39932016-07-08 23:23:48 -07001861 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001862
Inseob Kimeec88e12020-01-22 11:11:29 +09001863 rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string {
1864 // only modules with BOARD_VNDK_VERSION uses snapshot.
1865 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1866 return lib
1867 }
1868
1869 if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
1870 return snapshot
1871 }
1872
1873 return lib
1874 }
1875
1876 vendorSnapshotHeaderLibs := vendorSnapshotHeaderLibs(actx.Config())
Colin Cross32ec36c2016-12-15 07:39:51 -08001877 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001878 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08001879 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001880 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08001881 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001882
1883 lib = rewriteSnapshotLibs(lib, vendorSnapshotHeaderLibs)
1884
Jiyong Park1ad8e162020-12-01 23:40:09 +09001885 if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08001886 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07001887 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09001888 } else {
1889 actx.AddVariationDependencies(nil, depTag, lib)
1890 }
1891 }
1892
Inseob Kim07def122020-11-23 14:43:02 +09001893 // sysprop_library has to support both C++ and Java. So sysprop_library internally creates one
1894 // C++ implementation library and one Java implementation library. When a module links against
1895 // sysprop_library, the C++ implementation library has to be linked. syspropImplLibraries is a
1896 // map from sysprop_library to implementation library; it will be used in whole_static_libs,
1897 // static_libs, and shared_libs.
Inseob Kimc0907f12019-02-08 21:00:45 +09001898 syspropImplLibraries := syspropImplLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001899 vendorSnapshotStaticLibs := vendorSnapshotStaticLibs(actx.Config())
Inseob Kimc0907f12019-02-08 21:00:45 +09001900
Jiyong Park5d1598f2019-02-25 22:14:17 +09001901 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001902 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09001903 if impl, ok := syspropImplLibraries[lib]; ok {
1904 lib = impl
1905 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001906
1907 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1908
Jiyong Park5d1598f2019-02-25 22:14:17 +09001909 actx.AddVariationDependencies([]blueprint.Variation{
1910 {Mutator: "link", Variation: "static"},
1911 }, depTag, lib)
1912 }
1913
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001914 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001915 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001916 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001917 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001918 }
Jiyong Parke3867542020-12-03 17:28:25 +09001919 if inList(lib, deps.ExcludeLibsForApex) {
1920 depTag.excludeInApex = true
1921 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001922
1923 if impl, ok := syspropImplLibraries[lib]; ok {
1924 lib = impl
1925 }
1926
Inseob Kimeec88e12020-01-22 11:11:29 +09001927 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1928
Dan Willemsen59339a22018-07-22 21:18:45 -07001929 actx.AddVariationDependencies([]blueprint.Variation{
1930 {Mutator: "link", Variation: "static"},
1931 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001932 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001933
Jooyung Han75568392020-03-20 04:29:24 +09001934 // staticUnwinderDep is treated as staticDep for Q apexes
1935 // so that native libraries/binaries are linked with static unwinder
1936 // because Q libc doesn't have unwinder APIs
1937 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07001938 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001939 actx.AddVariationDependencies([]blueprint.Variation{
1940 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001941 }, depTag, rewriteSnapshotLibs(staticUnwinder(actx), vendorSnapshotStaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001942 }
1943
Inseob Kimeec88e12020-01-22 11:11:29 +09001944 for _, lib := range deps.LateStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001945 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Inseob Kimeec88e12020-01-22 11:11:29 +09001946 actx.AddVariationDependencies([]blueprint.Variation{
1947 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001948 }, depTag, rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs))
Inseob Kimeec88e12020-01-22 11:11:29 +09001949 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001950
Jiyong Park7ed9de32018-10-15 22:25:07 +09001951 // shared lib names without the #version suffix
1952 var sharedLibNames []string
1953
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001954 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001955 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001956 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001957 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001958 }
Jiyong Parke3867542020-12-03 17:28:25 +09001959 if inList(lib, deps.ExcludeLibsForApex) {
1960 depTag.excludeInApex = true
1961 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001962
1963 if impl, ok := syspropImplLibraries[lib]; ok {
1964 lib = impl
1965 }
1966
Jiyong Park73c54ee2019-10-22 20:31:18 +09001967 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09001968 sharedLibNames = append(sharedLibNames, name)
1969
Colin Crosse7257d22020-09-24 09:56:18 -07001970 variations := []blueprint.Variation{
1971 {Mutator: "link", Variation: "shared"},
1972 }
1973 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001974 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001975
Jiyong Park7ed9de32018-10-15 22:25:07 +09001976 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09001977 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001978 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
1979 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
1980 // linking against both the stubs lib and the non-stubs lib at the same time.
1981 continue
1982 }
Colin Cross6e511a92020-07-27 21:26:48 -07001983 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07001984 variations := []blueprint.Variation{
1985 {Mutator: "link", Variation: "shared"},
1986 }
1987 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09001988 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001989
Dan Willemsen59339a22018-07-22 21:18:45 -07001990 actx.AddVariationDependencies([]blueprint.Variation{
1991 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04001992 }, dataLibDepTag, deps.DataLibs...)
1993
1994 actx.AddVariationDependencies([]blueprint.Variation{
1995 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07001996 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08001997
Colin Cross68861832016-07-08 10:41:41 -07001998 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001999
2000 for _, gen := range deps.GeneratedHeaders {
2001 depTag := genHeaderDepTag
2002 if inList(gen, deps.ReexportGeneratedHeaders) {
2003 depTag = genHeaderExportDepTag
2004 }
2005 actx.AddDependency(c, depTag, gen)
2006 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002007
Inseob Kim1042d292020-06-01 23:23:05 +09002008 vendorSnapshotObjects := vendorSnapshotObjects(actx.Config())
2009
Dan Albert92fe7402020-07-15 13:33:30 -07002010 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002011 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc99deeb2016-04-11 15:06:20 -07002012 if deps.CrtBegin != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002013 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
2014 rewriteSnapshotLibs(deps.CrtBegin, vendorSnapshotObjects))
Colin Crossca860ac2016-01-04 14:34:37 -08002015 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002016 if deps.CrtEnd != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002017 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
2018 rewriteSnapshotLibs(deps.CrtEnd, vendorSnapshotObjects))
Colin Cross21b9a242015-03-24 14:15:58 -07002019 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002020 if deps.LinkerFlagsFile != "" {
2021 actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
2022 }
2023 if deps.DynamicLinker != "" {
2024 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002025 }
Dan Albert914449f2016-06-17 16:45:24 -07002026
2027 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002028
2029 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002030 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002031 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002032 {Mutator: "link", Variation: "shared"},
2033 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002034
2035 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002036 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002037 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002038 {Mutator: "link", Variation: "shared"},
2039 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002040
2041 if vndkdep := c.vndkdep; vndkdep != nil {
2042 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002043 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002044 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002045 {Mutator: "link", Variation: "shared"},
2046 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002047 }
2048 }
Colin Cross6362e272015-10-29 15:25:03 -07002049}
Colin Cross21b9a242015-03-24 14:15:58 -07002050
Colin Crosse40b4ea2018-10-02 22:25:58 -07002051func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002052 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2053 c.beginMutator(ctx)
2054 }
2055}
2056
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002057// Whether a module can link to another module, taking into
2058// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002059func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002060 tag blueprint.DependencyTag) {
2061
2062 switch t := tag.(type) {
2063 case dependencyTag:
2064 if t != vndkExtDepTag {
2065 return
2066 }
2067 case libraryDependencyTag:
2068 default:
2069 return
2070 }
2071
Ivan Lozanof9e21722020-12-02 09:00:51 -05002072 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002073 // Host code is not restricted
2074 return
2075 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002076
2077 // VNDK is cc.Module supported only for now.
2078 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002079 // Though allowed dependency is limited by the image mutator,
2080 // each vendor and product module needs to check link-type
2081 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002082 if ccTo, ok := to.(*Module); ok {
2083 if ccFrom.vndkdep != nil {
2084 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2085 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05002086 } else if linkableMod, ok := to.(LinkableInterface); ok {
2087 // Static libraries from other languages can be linked
2088 if !linkableMod.Static() {
2089 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
2090 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002091 } else {
2092 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002093 }
2094 return
2095 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002096 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002097 // Platform code can link to anything
2098 return
2099 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002100 if from.InRamdisk() {
2101 // Ramdisk code is not NDK
2102 return
2103 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002104 if from.InVendorRamdisk() {
2105 // Vendor ramdisk code is not NDK
2106 return
2107 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002108 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002109 // Recovery code is not NDK
2110 return
2111 }
Colin Cross31076b32020-10-23 17:22:06 -07002112 if c, ok := to.(*Module); ok {
2113 if c.ToolchainLibrary() {
2114 // These are always allowed
2115 return
2116 }
2117 if c.NdkPrebuiltStl() {
2118 // These are allowed, but they don't set sdk_version
2119 return
2120 }
2121 if c.StubDecorator() {
2122 // These aren't real libraries, but are the stub shared libraries that are included in
2123 // the NDK.
2124 return
2125 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002126 }
Logan Chien834b9a62019-01-14 15:39:03 +08002127
Ivan Lozano52767be2019-10-18 14:49:46 -07002128 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002129 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2130 // to link to libc++ (non-NDK and without sdk_version).
2131 return
2132 }
2133
Ivan Lozano52767be2019-10-18 14:49:46 -07002134 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002135 // NDK code linking to platform code is never okay.
2136 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002137 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002138 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002139 }
2140
2141 // At this point we know we have two NDK libraries, but we need to
2142 // check that we're not linking against anything built against a higher
2143 // API level, as it is only valid to link against older or equivalent
2144 // APIs.
2145
Inseob Kim01a28722018-04-11 09:48:45 +09002146 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002147 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002148 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002149 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002150 // Current can't be linked against by anything else.
2151 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002152 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002153 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002154 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002155 if err != nil {
2156 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002157 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002158 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002159 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002160 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002161 if err != nil {
2162 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002163 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002164 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002165 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002166
Inseob Kim01a28722018-04-11 09:48:45 +09002167 if toApi > fromApi {
2168 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002169 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002170 }
2171 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002172 }
Dan Albert202fe492017-12-15 13:56:59 -08002173
2174 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002175 fromStl := from.SelectedStl()
2176 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002177 if fromStl == "" || toStl == "" {
2178 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002179 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002180 // We can be permissive with the system "STL" since it is only the C++
2181 // ABI layer, but in the future we should make sure that everyone is
2182 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002183 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002184 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002185 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2186 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002187 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002188}
2189
Jooyung Han479ca172020-10-19 18:51:07 +09002190func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2191 if c, ok := ctx.Module().(*Module); ok {
2192 ctx.VisitDirectDeps(func(dep android.Module) {
2193 depTag := ctx.OtherModuleDependencyTag(dep)
2194 ccDep, ok := dep.(LinkableInterface)
2195 if ok {
2196 checkLinkType(ctx, c, ccDep, depTag)
2197 }
2198 })
2199 }
2200}
2201
Jiyong Park5fb8c102018-04-09 12:03:06 +09002202// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002203// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2204// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002205// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002206func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2207 check := func(child, parent android.Module) bool {
2208 to, ok := child.(*Module)
2209 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002210 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002211 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002212
Jooyung Hana70f0672019-01-18 15:20:43 +09002213 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2214 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002215 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002216
Jiyong Park1ad8e162020-12-01 23:40:09 +09002217 depTag := ctx.OtherModuleDependencyTag(child)
2218 if IsHeaderDepTag(depTag) {
2219 return false
2220 }
2221
Justin Yun63e9ec72020-10-29 16:49:43 +09002222 // Even if target lib has no vendor variant, keep checking dependency
2223 // graph in case it depends on vendor_available or product_available
2224 // but not double_loadable transtively.
2225 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002226 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002227 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002228
Jooyung Han0302a842019-10-30 18:43:49 +09002229 if to.isVndkSp() || to.isLlndk(ctx.Config()) || Bool(to.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002230 return false
2231 }
2232
2233 var stringPath []string
2234 for _, m := range ctx.GetWalkPath() {
2235 stringPath = append(stringPath, m.Name())
2236 }
2237 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2238 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
2239 "(dependency: %s)", ctx.OtherModuleName(to), strings.Join(stringPath, " -> "))
2240 return false
2241 }
2242 if module, ok := ctx.Module().(*Module); ok {
2243 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jooyung Han0302a842019-10-30 18:43:49 +09002244 if module.isLlndk(ctx.Config()) || Bool(module.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002245 ctx.WalkDeps(check)
2246 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002247 }
2248 }
2249}
2250
Colin Cross0de8a1e2020-09-18 14:15:30 -07002251// Returns the highest version which is <= maxSdkVersion.
2252// For example, with maxSdkVersion is 10 and versionList is [9,11]
2253// it returns 9 as string. The list of stubs must be in order from
2254// oldest to newest.
Chris Parsons3c27ca32020-11-20 12:42:07 -05002255func (c *Module) chooseSdkVersion(ctx android.PathContext, stubsInfo []SharedStubLibrary,
2256 maxSdkVersion android.ApiLevel) (SharedStubLibrary, error) {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002257
2258 for i := range stubsInfo {
2259 stubInfo := stubsInfo[len(stubsInfo)-i-1]
2260 var ver android.ApiLevel
2261 if stubInfo.Version == "" {
2262 ver = android.FutureApiLevel
2263 } else {
2264 var err error
2265 ver, err = android.ApiLevelFromUser(ctx, stubInfo.Version)
2266 if err != nil {
Chris Parsons3c27ca32020-11-20 12:42:07 -05002267 return SharedStubLibrary{}, err
Colin Cross0de8a1e2020-09-18 14:15:30 -07002268 }
2269 }
2270 if ver.LessThanOrEqualTo(maxSdkVersion) {
2271 return stubInfo, nil
2272 }
2273 }
2274 var versionList []string
2275 for _, stubInfo := range stubsInfo {
2276 versionList = append(versionList, stubInfo.Version)
2277 }
Chris Parsons3c27ca32020-11-20 12:42:07 -05002278 return SharedStubLibrary{}, fmt.Errorf("not found a version(<=%s) in versionList: %v", maxSdkVersion.String(), versionList)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002279}
2280
Colin Crossc99deeb2016-04-11 15:06:20 -07002281// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002282func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002283 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002284
Colin Cross0de8a1e2020-09-18 14:15:30 -07002285 var directStaticDeps []StaticLibraryInfo
2286 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002287
Colin Cross0de8a1e2020-09-18 14:15:30 -07002288 reexportExporter := func(exporter FlagExporterInfo) {
2289 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2290 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2291 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2292 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2293 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002294 }
2295
Jooyung Hande34d232020-07-23 13:04:15 +09002296 // For the dependency from platform to apex, use the latest stubs
2297 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002298 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2299 if !apexInfo.IsForPlatform() {
2300 c.apexSdkVersion = apexInfo.MinSdkVersion(ctx)
Jooyung Hande34d232020-07-23 13:04:15 +09002301 }
2302
2303 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2304 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2305 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2306 // (b/144430859)
2307 c.apexSdkVersion = android.FutureApiLevel
2308 }
2309
Colin Crossd11fcda2017-10-23 17:59:01 -07002310 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002311 depName := ctx.OtherModuleName(dep)
2312 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002313
Ivan Lozano52767be2019-10-18 14:49:46 -07002314 ccDep, ok := dep.(LinkableInterface)
2315 if !ok {
2316
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002317 // handling for a few module types that aren't cc Module but that are also supported
2318 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002319 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002320 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002321 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2322 genRule.GeneratedSourceFiles()...)
2323 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002324 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002325 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002326 // Support exported headers from a generated_sources dependency
2327 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002328 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002329 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002330 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002331 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002332 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002333 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002334 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002335 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002336 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2337 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002338 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002339 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
Jiyong Park74955042019-10-22 20:19:51 +09002340 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002341
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002342 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002343 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002344 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002345 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002346 case linkerFlagsDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002347 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002348 files := genRule.GeneratedSourceFiles()
2349 if len(files) == 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002350 depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002351 } else if len(files) > 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002352 ctx.ModuleErrorf("module %q can only generate a single file if used for a linker flag file", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002353 }
2354 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002355 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002356 }
Colin Crossca860ac2016-01-04 14:34:37 -08002357 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002358 return
2359 }
2360
Colin Crossfe17f6f2019-03-28 19:30:56 -07002361 if depTag == android.ProtoPluginDepTag {
2362 return
2363 }
Jooyung Han61b66e92020-03-21 14:21:46 +00002364 if depTag == llndkImplDep {
2365 return
2366 }
Colin Crossfe17f6f2019-03-28 19:30:56 -07002367
Colin Crossd11fcda2017-10-23 17:59:01 -07002368 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002369 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2370 return
2371 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002372 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002373 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2374 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002375 return
2376 }
2377
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002378 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07002379 // Skip reused objects for stub libraries, they use their own stub object file instead.
2380 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
2381 // version mutator, so the stubs variant is created from the shared variant that
2382 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07002383 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07002384 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2385 objs := staticAnalogue.ReuseObjects
2386 depPaths.Objs = depPaths.Objs.Append(objs)
2387 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2388 reexportExporter(depExporterInfo)
2389 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002390 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002391 }
2392
Colin Cross6e511a92020-07-27 21:26:48 -07002393 linkFile := ccDep.OutputFile()
2394
2395 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2396 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002397 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002398 return
2399 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002400
Jiyong Parke3867542020-12-03 17:28:25 +09002401 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
2402 return
2403 }
2404
Colin Cross0de8a1e2020-09-18 14:15:30 -07002405 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002406
Colin Cross6e511a92020-07-27 21:26:48 -07002407 var ptr *android.Paths
2408 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002409
Colin Cross6e511a92020-07-27 21:26:48 -07002410 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002411
Colin Cross6e511a92020-07-27 21:26:48 -07002412 switch {
2413 case libDepTag.header():
2414 // nothing
2415 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002416 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2417 if !ctx.Config().AllowMissingDependencies() {
2418 ctx.ModuleErrorf("module %q is not a shared library", depName)
2419 } else {
2420 ctx.AddMissingDependencies([]string{depName})
2421 }
2422 return
2423 }
Jiyong Parke3867542020-12-03 17:28:25 +09002424
Colin Cross0de8a1e2020-09-18 14:15:30 -07002425 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
Chris Parsons3c27ca32020-11-20 12:42:07 -05002426 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002427
Chris Parsons3c27ca32020-11-20 12:42:07 -05002428 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002429 useStubs := false
Colin Cross31076b32020-10-23 17:22:06 -07002430
2431 if lib := moduleLibraryInterface(dep); lib.buildStubs() && c.UseVndk() { // LLNDK
Colin Cross0de8a1e2020-09-18 14:15:30 -07002432 if !apexInfo.IsForPlatform() {
2433 // For platform libraries, use current version of LLNDK
2434 // If this is for use_vendor apex we will apply the same rules
2435 // of apex sdk enforcement below to choose right version.
2436 useStubs = true
2437 }
2438 } else if apexInfo.IsForPlatform() {
2439 // If not building for APEX, use stubs only when it is from
2440 // an APEX (and not from platform)
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002441 // However, for host, ramdisk, vendor_ramdisk, recovery or bootstrap modules,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002442 // always link to non-stub variant
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09002443 useStubs = dep.(android.ApexModule).NotInPlatform() && !c.bootstrap()
Colin Cross0de8a1e2020-09-18 14:15:30 -07002444 // Another exception: if this module is bundled with an APEX, then
2445 // it is linked with the non-stub variant of a module in the APEX
2446 // as if this is part of the APEX.
2447 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
2448 for _, apexContents := range testFor.ApexContents {
2449 if apexContents.DirectlyInApex(depName) {
2450 useStubs = false
2451 break
2452 }
2453 }
2454 } else {
2455 // If building for APEX, use stubs when the parent is in any APEX that
2456 // the child is not in.
2457 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
2458 }
2459
2460 // when to use (unspecified) stubs, check min_sdk_version and choose the right one
2461 if useStubs {
2462 sharedLibraryStubsInfo, err :=
Chris Parsons3c27ca32020-11-20 12:42:07 -05002463 c.chooseSdkVersion(ctx, sharedLibraryStubsInfo.SharedStubLibraries, c.apexSdkVersion)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002464 if err != nil {
2465 ctx.OtherModuleErrorf(dep, err.Error())
2466 return
2467 }
2468 sharedLibraryInfo = sharedLibraryStubsInfo.SharedLibraryInfo
2469 depExporterInfo = sharedLibraryStubsInfo.FlagExporterInfo
2470 }
2471 }
2472
Jiyong Park1ad8e162020-12-01 23:40:09 +09002473 // Stubs lib doesn't link to the shared lib dependencies. Don't set
2474 // linkFile, depFile, and ptr.
2475 if c.IsStubs() {
2476 break
2477 }
2478
Colin Cross0de8a1e2020-09-18 14:15:30 -07002479 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2480 depFile = sharedLibraryInfo.TableOfContents
2481
Colin Cross6e511a92020-07-27 21:26:48 -07002482 ptr = &depPaths.SharedLibs
2483 switch libDepTag.Order {
2484 case earlyLibraryDependency:
2485 ptr = &depPaths.EarlySharedLibs
2486 depPtr = &depPaths.EarlySharedLibsDeps
2487 case normalLibraryDependency:
2488 ptr = &depPaths.SharedLibs
2489 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002490 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002491 case lateLibraryDependency:
2492 ptr = &depPaths.LateSharedLibs
2493 depPtr = &depPaths.LateSharedLibsDeps
2494 default:
2495 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002496 }
Colin Cross6e511a92020-07-27 21:26:48 -07002497 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002498 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2499 if !ctx.Config().AllowMissingDependencies() {
2500 ctx.ModuleErrorf("module %q is not a static library", depName)
2501 } else {
2502 ctx.AddMissingDependencies([]string{depName})
2503 }
2504 return
2505 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002506
2507 // Stubs lib doesn't link to the static lib dependencies. Don't set
2508 // linkFile, depFile, and ptr.
2509 if c.IsStubs() {
2510 break
2511 }
2512
Colin Cross0de8a1e2020-09-18 14:15:30 -07002513 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2514 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002515 if libDepTag.wholeStatic {
2516 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002517 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2518 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002519 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002520 // This case normally catches prebuilt static
2521 // libraries, but it can also occur when
2522 // AllowMissingDependencies is on and the
2523 // dependencies has no sources of its own
2524 // but has a whole_static_libs dependency
2525 // on a missing library. We want to depend
2526 // on the .a file so that there is something
2527 // in the dependency tree that contains the
2528 // error rule for the missing transitive
2529 // dependency.
2530 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002531 }
Colin Cross6e511a92020-07-27 21:26:48 -07002532 } else {
2533 switch libDepTag.Order {
2534 case earlyLibraryDependency:
2535 panic(fmt.Errorf("early static libs not suppported"))
2536 case normalLibraryDependency:
2537 // static dependencies will be handled separately so they can be ordered
2538 // using transitive dependencies.
2539 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002540 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002541 case lateLibraryDependency:
2542 ptr = &depPaths.LateStaticLibs
2543 default:
2544 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002545 }
2546 }
2547 }
2548
Colin Cross6e511a92020-07-27 21:26:48 -07002549 if libDepTag.static() && !libDepTag.wholeStatic {
2550 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2551 ctx.ModuleErrorf("module %q not a static library", depName)
2552 return
2553 }
Logan Chien43d34c32017-12-20 01:17:32 +08002554
Colin Cross6e511a92020-07-27 21:26:48 -07002555 // When combining coverage files for shared libraries and executables, coverage files
2556 // in static libraries act as if they were whole static libraries. The same goes for
2557 // source based Abi dump files.
2558 if c, ok := ccDep.(*Module); ok {
2559 staticLib := c.linker.(libraryInterface)
2560 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2561 staticLib.objs().coverageFiles...)
2562 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2563 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002564 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002565 // Handle non-CC modules here
2566 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002567 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002568 }
2569 }
2570
Colin Cross6e511a92020-07-27 21:26:48 -07002571 if ptr != nil {
2572 if !linkFile.Valid() {
2573 if !ctx.Config().AllowMissingDependencies() {
2574 ctx.ModuleErrorf("module %q missing output file", depName)
2575 } else {
2576 ctx.AddMissingDependencies([]string{depName})
2577 }
2578 return
2579 }
2580 *ptr = append(*ptr, linkFile.Path())
2581 }
2582
2583 if depPtr != nil {
2584 dep := depFile
2585 if !dep.Valid() {
2586 dep = linkFile
2587 }
2588 *depPtr = append(*depPtr, dep.Path())
2589 }
2590
Colin Cross0de8a1e2020-09-18 14:15:30 -07002591 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2592 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2593 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2594 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2595
2596 if libDepTag.reexportFlags {
2597 reexportExporter(depExporterInfo)
2598 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2599 // Re-exported shared library headers must be included as well since they can help us with type information
2600 // about template instantiations (instantiated from their headers).
2601 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2602 // scripts.
2603 c.sabi.Properties.ReexportedIncludes = append(
2604 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2605 }
2606
Colin Cross6e511a92020-07-27 21:26:48 -07002607 makeLibName := c.makeLibName(ctx, ccDep, depName) + libDepTag.makeSuffix
2608 switch {
2609 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002610 c.Properties.AndroidMkHeaderLibs = append(
2611 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002612 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07002613 if lib := moduleLibraryInterface(dep); lib != nil {
2614 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002615 // Add the dependency to the APEX(es) providing the library so that
2616 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002617 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
2618 for _, an := range depApexInfo.InApexes {
Colin Cross6e511a92020-07-27 21:26:48 -07002619 c.Properties.ApexesProvidingSharedLibs = append(
2620 c.Properties.ApexesProvidingSharedLibs, an)
2621 }
2622 }
2623 }
2624
2625 // Note: the order of libs in this list is not important because
2626 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002627 c.Properties.AndroidMkSharedLibs = append(
2628 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002629 // Record baseLibName for snapshots.
2630 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, baseLibName(depName))
2631 case libDepTag.static():
2632 if libDepTag.wholeStatic {
2633 c.Properties.AndroidMkWholeStaticLibs = append(
2634 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2635 } else {
2636 c.Properties.AndroidMkStaticLibs = append(
2637 c.Properties.AndroidMkStaticLibs, makeLibName)
2638 }
2639 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002640 } else if !c.IsStubs() {
2641 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
2642
Colin Cross6e511a92020-07-27 21:26:48 -07002643 switch depTag {
2644 case runtimeDepTag:
2645 c.Properties.AndroidMkRuntimeLibs = append(
2646 c.Properties.AndroidMkRuntimeLibs, c.makeLibName(ctx, ccDep, depName)+libDepTag.makeSuffix)
2647 // Record baseLibName for snapshots.
2648 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, baseLibName(depName))
2649 case objDepTag:
2650 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2651 case CrtBeginDepTag:
2652 depPaths.CrtBegin = linkFile
2653 case CrtEndDepTag:
2654 depPaths.CrtEnd = linkFile
2655 case dynamicLinkerDepTag:
2656 depPaths.DynamicLinker = linkFile
2657 }
Jiyong Park27b188b2017-07-18 13:23:39 +09002658 }
Colin Crossca860ac2016-01-04 14:34:37 -08002659 })
2660
Jeff Gaston294356f2017-09-27 17:05:30 -07002661 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07002662 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
2663 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
2664 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07002665
Colin Crossdd84e052017-05-17 13:44:16 -07002666 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07002667 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09002668 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
2669 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09002670 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09002671 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
2672 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07002673 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09002674 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09002675 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002676
2677 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09002678 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002679 }
Colin Crossdd84e052017-05-17 13:44:16 -07002680
Colin Crossca860ac2016-01-04 14:34:37 -08002681 return depPaths
2682}
2683
Colin Cross0de8a1e2020-09-18 14:15:30 -07002684// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
2685// to match the topological order of the dependency tree, including any static analogues of
2686// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
2687// of the transitive dependencies.
2688func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
2689 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
2690 var staticPaths android.Paths
2691 for _, staticDep := range staticDeps {
2692 staticPaths = append(staticPaths, staticDep.StaticLibrary)
2693 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
2694 }
2695 for _, sharedDep := range sharedDeps {
2696 if sharedDep.StaticAnalogue != nil {
2697 transitiveStaticLibsBuilder.Transitive(sharedDep.StaticAnalogue.TransitiveStaticLibrariesForOrdering)
2698 }
2699 }
2700 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
2701
2702 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
2703
2704 // reorder the dependencies based on transitive dependencies
2705 staticPaths = android.FirstUniquePaths(staticPaths)
2706 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
2707
2708 if len(orderedStaticPaths) != len(staticPaths) {
2709 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
2710 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
2711 }
2712
2713 return orderedStaticPaths, transitiveStaticLibs
2714}
2715
Colin Cross6e511a92020-07-27 21:26:48 -07002716// baseLibName trims known prefixes and suffixes
2717func baseLibName(depName string) string {
2718 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
2719 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00002720 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07002721 return libName
2722}
2723
2724func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, depName string) string {
2725 vendorSuffixModules := vendorSuffixModules(ctx.Config())
2726 vendorPublicLibraries := vendorPublicLibraries(ctx.Config())
2727
2728 libName := baseLibName(depName)
2729 isLLndk := isLlndkLibrary(libName, ctx.Config())
2730 isVendorPublicLib := inList(libName, *vendorPublicLibraries)
2731 bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk
2732
2733 if c, ok := ccDep.(*Module); ok {
2734 // Use base module name for snapshots when exporting to Makefile.
2735 if c.isSnapshotPrebuilt() {
2736 baseName := c.BaseModuleName()
2737
2738 if c.IsVndk() {
2739 return baseName + ".vendor"
2740 }
2741
2742 if vendorSuffixModules[baseName] {
2743 return baseName + ".vendor"
2744 } else {
2745 return baseName
2746 }
2747 }
2748 }
2749
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002750 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
2751 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07002752 // The vendor module is a no-vendor-variant VNDK library. Depend on the
2753 // core module instead.
2754 return libName
2755 } else if c.UseVndk() && bothVendorAndCoreVariantsExist {
2756 // The vendor module in Make will have been renamed to not conflict with the core
2757 // module, so update the dependency name here accordingly.
2758 return libName + c.getNameSuffixWithVndkVersion(ctx)
2759 } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
2760 return libName + vendorPublicLibrarySuffix
2761 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
2762 return libName + ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002763 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
2764 return libName + vendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07002765 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
2766 return libName + recoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05002767 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Colin Cross6e511a92020-07-27 21:26:48 -07002768 return libName + nativeBridgeSuffix
2769 } else {
2770 return libName
2771 }
2772}
2773
Colin Crossca860ac2016-01-04 14:34:37 -08002774func (c *Module) InstallInData() bool {
2775 if c.installer == nil {
2776 return false
2777 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002778 return c.installer.inData()
2779}
2780
2781func (c *Module) InstallInSanitizerDir() bool {
2782 if c.installer == nil {
2783 return false
2784 }
2785 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07002786 return true
2787 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002788 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08002789}
2790
Yifan Hong1b3348d2020-01-21 15:53:22 -08002791func (c *Module) InstallInRamdisk() bool {
2792 return c.InRamdisk()
2793}
2794
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002795func (c *Module) InstallInVendorRamdisk() bool {
2796 return c.InVendorRamdisk()
2797}
2798
Jiyong Parkf9332f12018-02-01 00:54:12 +09002799func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07002800 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002801}
2802
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002803func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002804 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002805 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002806 return
2807 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002808 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002809}
2810
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07002811func (c *Module) HostToolPath() android.OptionalPath {
2812 if c.installer == nil {
2813 return android.OptionalPath{}
2814 }
2815 return c.installer.hostToolPath()
2816}
2817
Nan Zhangd4e641b2017-07-12 12:55:28 -07002818func (c *Module) IntermPathForModuleOut() android.OptionalPath {
2819 return c.outputFile
2820}
2821
Colin Cross41955e82019-05-29 14:40:35 -07002822func (c *Module) OutputFiles(tag string) (android.Paths, error) {
2823 switch tag {
2824 case "":
2825 if c.outputFile.Valid() {
2826 return android.Paths{c.outputFile.Path()}, nil
2827 }
2828 return android.Paths{}, nil
2829 default:
2830 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002831 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002832}
2833
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00002834func (c *Module) static() bool {
2835 if static, ok := c.linker.(interface {
2836 static() bool
2837 }); ok {
2838 return static.static()
2839 }
2840 return false
2841}
2842
Jiyong Park379de2f2018-12-19 02:47:14 +09002843func (c *Module) staticBinary() bool {
2844 if static, ok := c.linker.(interface {
2845 staticBinary() bool
2846 }); ok {
2847 return static.staticBinary()
2848 }
2849 return false
2850}
2851
Jiyong Park1d1119f2019-07-29 21:27:18 +09002852func (c *Module) header() bool {
2853 if h, ok := c.linker.(interface {
2854 header() bool
2855 }); ok {
2856 return h.header()
2857 }
2858 return false
2859}
2860
Inseob Kim7f283f42020-06-01 21:53:49 +09002861func (c *Module) binary() bool {
2862 if b, ok := c.linker.(interface {
2863 binary() bool
2864 }); ok {
2865 return b.binary()
2866 }
2867 return false
2868}
2869
Inseob Kim1042d292020-06-01 23:23:05 +09002870func (c *Module) object() bool {
2871 if o, ok := c.linker.(interface {
2872 object() bool
2873 }); ok {
2874 return o.object()
2875 }
2876 return false
2877}
2878
Ivan Lozanof9e21722020-12-02 09:00:51 -05002879func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07002880 if c.UseVndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05002881 if ccModule, ok := c.Module().(*Module); ok {
2882 // Only CC modules provide stubs at the moment.
2883 if lib, ok := ccModule.linker.(*llndkStubDecorator); ok {
2884 if Bool(lib.Properties.Vendor_available) {
2885 return "native:vndk"
2886 }
2887 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07002888 }
Colin Crossb60190a2018-09-04 16:28:17 -07002889 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05002890 if c.IsVndk() && !c.IsVndkExt() {
2891 if c.IsVndkPrivate(actx.Config()) {
2892 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09002893 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05002894 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09002895 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05002896 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09002897 return "native:product"
2898 }
Jooyung Han38002912019-05-16 04:01:54 +09002899 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08002900 } else if c.InRamdisk() {
2901 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002902 } else if c.InVendorRamdisk() {
2903 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07002904 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07002905 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05002906 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07002907 return "native:ndk:none:none"
2908 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
2909 //family, link := getNdkStlFamilyAndLinkType(c)
2910 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07002911 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08002912 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07002913 } else {
2914 return "native:platform"
2915 }
2916}
2917
Jiyong Park9d452992018-10-03 00:38:19 +09002918// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01002919// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09002920func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07002921 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09002922 // Stub libs and prebuilt libs in a versioned SDK are not
2923 // installable to APEX even though they are shared libs.
Colin Cross31076b32020-10-23 17:22:06 -07002924 return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01002925 } else if _, ok := c.linker.(testPerSrc); ok {
2926 return true
Jiyong Park9d452992018-10-03 00:38:19 +09002927 }
2928 return false
2929}
2930
Jiyong Parka90ca002019-10-07 15:47:24 +09002931func (c *Module) AvailableFor(what string) bool {
2932 if linker, ok := c.linker.(interface {
2933 availableFor(string) bool
2934 }); ok {
2935 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
2936 } else {
2937 return c.ApexModuleBase.AvailableFor(what)
2938 }
2939}
2940
Jiyong Park62304bb2020-04-13 16:19:48 +09002941func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09002942 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09002943}
2944
Colin Crossaede88c2020-08-11 12:17:01 -07002945func (c *Module) UniqueApexVariations() bool {
2946 if u, ok := c.compiler.(interface {
2947 uniqueApexVariations() bool
2948 }); ok {
2949 return u.uniqueApexVariations()
2950 } else {
2951 return false
2952 }
2953}
2954
Paul Duffin0cb37b92020-03-04 14:52:46 +00002955// Return true if the module is ever installable.
2956func (c *Module) EverInstallable() bool {
2957 return c.installer != nil &&
2958 // Check to see whether the module is actually ever installable.
2959 c.installer.everInstallable()
2960}
2961
Colin Cross56a83212020-09-15 18:30:11 -07002962func (c *Module) installable(apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00002963 ret := c.EverInstallable() &&
2964 // Check to see whether the module has been configured to not be installed.
2965 proptools.BoolDefault(c.Properties.Installable, true) &&
2966 !c.Properties.PreventInstall && c.outputFile.Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002967
2968 // The platform variant doesn't need further condition. Apex variants however might not
2969 // be installable because it will likely to be included in the APEX and won't appear
2970 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07002971 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002972 return ret
2973 }
2974
2975 // Special case for modules that are configured to be installed to /data, which includes
2976 // test modules. For these modules, both APEX and non-APEX variants are considered as
2977 // installable. This is because even the APEX variants won't be included in the APEX, but
2978 // will anyway be installed to /data/*.
2979 // See b/146995717
2980 if c.InstallInData() {
2981 return ret
2982 }
2983
2984 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09002985}
2986
Logan Chien41eabe62019-04-10 13:33:58 +08002987func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
2988 if c.linker != nil {
2989 if library, ok := c.linker.(*libraryDecorator); ok {
2990 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
2991 }
2992 }
2993}
2994
Jiyong Park45bf82e2020-12-15 22:29:02 +09002995var _ android.ApexModule = (*Module)(nil)
2996
2997// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002998func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07002999 depTag := ctx.OtherModuleDependencyTag(dep)
3000 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3001
3002 if cc, ok := dep.(*Module); ok {
3003 if cc.HasStubsVariants() {
3004 if isLibDepTag && libDepTag.shared() {
3005 // dynamic dep to a stubs lib crosses APEX boundary
3006 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003007 }
Colin Cross6e511a92020-07-27 21:26:48 -07003008 if IsRuntimeDepTag(depTag) {
3009 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003010 return false
3011 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003012 }
Colin Crossaac32222020-07-29 12:51:56 -07003013 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003014 // shared_lib dependency from a static lib is considered as crossing
3015 // the APEX boundary because the dependency doesn't actually is
3016 // linked; the dependency is used only during the compilation phase.
3017 return false
3018 }
Jiyong Parke3867542020-12-03 17:28:25 +09003019
3020 if isLibDepTag && libDepTag.excludeInApex {
3021 return false
3022 }
Colin Cross6e511a92020-07-27 21:26:48 -07003023 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003024 if depTag == stubImplDepTag || depTag == llndkImplDep {
3025 // We don't track beyond LLNDK or from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003026 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003027 }
3028 return true
3029}
3030
Jiyong Park45bf82e2020-12-15 22:29:02 +09003031// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003032func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3033 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003034 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3035 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3036 return nil
3037 }
3038 // b/154569636: set min_sdk_version correctly for toolchain_libraries
3039 if c.ToolchainLibrary() {
3040 return nil
3041 }
3042 // We don't check for prebuilt modules
3043 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3044 return nil
3045 }
3046 minSdkVersion := c.MinSdkVersion()
3047 if minSdkVersion == "apex_inherit" {
3048 return nil
3049 }
3050 if minSdkVersion == "" {
3051 // JNI libs within APK-in-APEX fall into here
3052 // Those are okay to set sdk_version instead
3053 // We don't have to check if this is a SDK variant because
3054 // non-SDK variant resets sdk_version, which works too.
3055 minSdkVersion = c.SdkVersion()
3056 }
Dan Albertc8060532020-07-22 22:32:17 -07003057 if minSdkVersion == "" {
3058 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3059 }
3060 // Not using nativeApiLevelFromUser because the context here is not
3061 // necessarily a native context.
3062 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003063 if err != nil {
3064 return err
3065 }
Dan Albertc8060532020-07-22 22:32:17 -07003066
3067 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003068 return fmt.Errorf("newer SDK(%v)", ver)
3069 }
3070 return nil
3071}
3072
Colin Cross2ba19d92015-05-07 15:44:20 -07003073//
Colin Crosscfad1192015-11-02 16:43:11 -08003074// Defaults
3075//
Colin Crossca860ac2016-01-04 14:34:37 -08003076type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07003077 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07003078 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09003079 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08003080}
3081
Patrice Arrudac249c712019-03-19 17:00:29 -07003082// cc_defaults provides a set of properties that can be inherited by other cc
3083// modules. A module can use the properties from a cc_defaults using
3084// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3085// merged (when possible) by prepending the default module's values to the
3086// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003087func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003088 return DefaultsFactory()
3089}
3090
Colin Cross36242852017-06-23 15:06:31 -07003091func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003092 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003093
Colin Cross36242852017-06-23 15:06:31 -07003094 module.AddProperties(props...)
3095 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003096 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003097 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003098 &BaseCompilerProperties{},
3099 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003100 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003101 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003102 &StaticProperties{},
3103 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003104 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003105 &BinaryLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003106 &TestProperties{},
3107 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003108 &BenchmarkProperties{},
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -07003109 &FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003110 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003111 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003112 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003113 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003114 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003115 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003116 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003117 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003118 &LTOProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003119 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003120 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003121 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3122 &RustBindgenClangProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003123 )
Colin Crosscfad1192015-11-02 16:43:11 -08003124
Jooyung Hancc372c52019-09-25 15:18:44 +09003125 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003126
3127 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003128}
3129
Jiyong Park2286afd2020-06-16 21:58:53 +09003130func (c *Module) IsSdkVariant() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07003131 return c.Properties.IsSdkVariant || c.AlwaysSdk()
Jiyong Park2286afd2020-06-16 21:58:53 +09003132}
3133
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003134func kytheExtractAllFactory() android.Singleton {
3135 return &kytheExtractAllSingleton{}
3136}
3137
3138type kytheExtractAllSingleton struct {
3139}
3140
3141func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3142 var xrefTargets android.Paths
3143 ctx.VisitAllModules(func(module android.Module) {
3144 if ccModule, ok := module.(xref); ok {
3145 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3146 }
3147 })
3148 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3149 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003150 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003151 }
3152}
3153
Colin Cross06a931b2015-10-28 17:23:31 -07003154var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003155var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003156var BoolPtr = proptools.BoolPtr
3157var String = proptools.String
3158var StringPtr = proptools.StringPtr