blob: 0724a763e8544d64706ef967a6f961b9627fd35a [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()
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -080082 ctx.TopDown("vndk_deps", sabiDepsMutator)
Stephen Craneba090d12017-05-09 15:44:35 -070083
84 ctx.TopDown("lto_deps", ltoDepsMutator)
85 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090086
Jooyung Han479ca172020-10-19 18:51:07 +090087 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090088 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070089 })
Colin Crossb98c8b02016-07-29 13:44:28 -070090
Sasha Smundak2a4549e2018-11-05 16:49:08 -080091 android.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070092}
93
Colin Crossca860ac2016-01-04 14:34:37 -080094type Deps struct {
95 SharedLibs, LateSharedLibs []string
96 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -080097 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +080098 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -070099
Chris Parsons79d66a52020-06-05 17:26:16 -0400100 // Used for data dependencies adjacent to tests
101 DataLibs []string
102
Yo Chiang219968c2020-09-22 18:45:04 +0800103 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
104 SystemSharedLibs []string
105
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800106 StaticUnwinderIfLegacy bool
107
Colin Cross5950f382016-12-13 12:50:57 -0800108 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700109
Colin Cross81413472016-04-11 14:37:39 -0700110 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700111
Dan Willemsenb40aab62016-04-20 14:21:14 -0700112 GeneratedSources []string
113 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900114 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700115
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700116 ReexportGeneratedHeaders []string
117
Colin Cross97ba0732015-03-23 17:50:24 -0700118 CrtBegin, CrtEnd string
Dan Willemsena0790e32018-10-12 00:24:23 -0700119
120 // Used for host bionic
121 LinkerFlagsFile string
122 DynamicLinker string
Colin Crossc472d572015-03-17 15:06:21 -0700123}
124
Colin Crossca860ac2016-01-04 14:34:37 -0800125type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700126 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900127 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700128 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900129 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700130 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700131 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700132
Colin Cross0de8a1e2020-09-18 14:15:30 -0700133 // Transitive static library dependencies of static libraries for use in ordering.
134 TranstiveStaticLibrariesForOrdering *android.DepSet
135
Colin Cross26c34ed2016-09-30 17:10:16 -0700136 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100137 Objs Objects
138 // Paths to .o files in dependencies that provide them. Note that these lists
139 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800140 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700141 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700142
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100143 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
144 // the libs from all whole_static_lib dependencies.
145 WholeStaticLibsFromPrebuilts android.Paths
146
Colin Cross26c34ed2016-09-30 17:10:16 -0700147 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700148 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900149 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700150
Inseob Kimd110f872019-12-06 13:15:38 +0900151 Flags []string
152 IncludeDirs android.Paths
153 SystemIncludeDirs android.Paths
154 ReexportedDirs android.Paths
155 ReexportedSystemDirs android.Paths
156 ReexportedFlags []string
157 ReexportedGeneratedHeaders android.Paths
158 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700159
Colin Cross26c34ed2016-09-30 17:10:16 -0700160 // Paths to crt*.o files
Colin Cross635c3b02016-05-18 15:37:25 -0700161 CrtBegin, CrtEnd android.OptionalPath
Dan Willemsena0790e32018-10-12 00:24:23 -0700162
163 // Path to the file container flags to use with the linker
164 LinkerFlagsFile android.OptionalPath
165
166 // Path to the dynamic linker binary
167 DynamicLinker android.OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700168}
169
Colin Cross4af21ed2019-11-04 09:37:55 -0800170// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
171// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
172// command line so they can be overridden by the local module flags).
173type LocalOrGlobalFlags struct {
174 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700175 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800176 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700177 CFlags []string // Flags that apply to C and C++ source files
178 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
179 ConlyFlags []string // Flags that apply to C source files
180 CppFlags []string // Flags that apply to C++ source files
181 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700182 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800183}
184
185type Flags struct {
186 Local LocalOrGlobalFlags
187 Global LocalOrGlobalFlags
188
189 aidlFlags []string // Flags that apply to aidl source files
190 rsFlags []string // Flags that apply to renderscript source files
191 libFlags []string // Flags to add libraries early to the link order
192 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
193 TidyFlags []string // Flags that apply to clang-tidy
194 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700195
Colin Crossc3199482017-03-30 15:03:04 -0700196 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800197 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700198 SystemIncludeFlags []string
199
Oliver Nguyen04526782020-04-21 12:40:27 -0700200 Toolchain config.Toolchain
201 Tidy bool
202 GcovCoverage bool
203 SAbiDump bool
204 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800205
206 RequiredInstructionSet string
Colin Cross16b23492016-01-06 14:41:07 -0800207 DynamicLinker string
208
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700209 CFlagsDeps android.Paths // Files depended on by compiler flags
210 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800211
Dan Willemsen98ab3112019-08-27 21:20:40 -0700212 AssemblerWithCpp bool
213 GroupStaticLibs bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800214
Colin Cross19878da2019-03-28 14:45:07 -0700215 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700216 protoC bool // Whether to use C instead of C++
217 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700218
219 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200220 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700221}
222
Colin Crossca860ac2016-01-04 14:34:37 -0800223// Properties used to compile all C or C++ modules
224type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700225 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800226 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700227
Colin Crossc511bc52020-04-07 16:50:32 +0000228 // Minimum sdk version supported when compiling against the ndk. Setting this property causes
229 // two variants to be built, one for the platform and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800230 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700231
Jooyung Han379660c2020-04-21 15:24:00 +0900232 // Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
233 Min_sdk_version *string
234
Colin Crossc511bc52020-04-07 16:50:32 +0000235 // If true, always create an sdk variant and don't create a platform variant.
236 Sdk_variant_only *bool
237
Jiyong Parkde866cb2018-12-07 23:08:36 +0900238 AndroidMkSharedLibs []string `blueprint:"mutated"`
239 AndroidMkStaticLibs []string `blueprint:"mutated"`
240 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
241 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700242 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900243 HideFromMake bool `blueprint:"mutated"`
244 PreventInstall bool `blueprint:"mutated"`
245 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700246
Yo Chiang219968c2020-09-22 18:45:04 +0800247 // Set by DepsMutator.
248 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
249
Justin Yun5f7f7e82019-11-18 19:52:14 +0900250 ImageVariationPrefix string `blueprint:"mutated"`
251 VndkVersion string `blueprint:"mutated"`
252 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800253
254 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
255 // file
256 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900257
Yifan Hong39143a92020-10-26 12:43:12 -0700258 // Make this module available when building for ramdisk.
259 // On device without a dedicated recovery partition, the module is only
260 // available after switching root into
261 // /first_stage_ramdisk. To expose the module before switching root, install
262 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800263 Ramdisk_available *bool
264
Yifan Hong39143a92020-10-26 12:43:12 -0700265 // Make this module available when building for vendor ramdisk.
266 // On device without a dedicated recovery partition, the module is only
267 // available after switching root into
268 // /first_stage_ramdisk. To expose the module before switching root, install
269 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700270 Vendor_ramdisk_available *bool
271
Jiyong Parkf9332f12018-02-01 00:54:12 +0900272 // Make this module available when building for recovery
273 Recovery_available *bool
274
Colin Crossae6c5202019-11-20 13:35:50 -0800275 // Set by imageMutator
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700276 CoreVariantNeeded bool `blueprint:"mutated"`
277 RamdiskVariantNeeded bool `blueprint:"mutated"`
278 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
279 RecoveryVariantNeeded bool `blueprint:"mutated"`
280 ExtraVariants []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900281
282 // Allows this module to use non-APEX version of libraries. Useful
283 // for building binaries that are started before APEXes are activated.
284 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900285
286 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
287 // see soong/cc/config/vndk.go
288 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900289
290 // Used by vendor snapshot to record dependencies from snapshot modules.
291 SnapshotSharedLibs []string `blueprint:"mutated"`
292 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000293
294 Installable *bool
Colin Crossc511bc52020-04-07 16:50:32 +0000295
296 // Set by factories of module types that can only be referenced from variants compiled against
297 // the SDK.
298 AlwaysSdk bool `blueprint:"mutated"`
299
300 // Variant is an SDK variant created by sdkMutator
301 IsSdkVariant bool `blueprint:"mutated"`
302 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
303 // variant to have a ".sdk" suffix.
304 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700305
306 // Normally Soong uses the directory structure to decide which modules
307 // should be included (framework) or excluded (non-framework) from the
308 // vendor snapshot, but this property allows a partner to exclude a
309 // module normally thought of as a framework module from the vendor
310 // snapshot.
311 Exclude_from_vendor_snapshot *bool
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700312}
313
314type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900315 // whether this module should be allowed to be directly depended by other
316 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900317 // If set to true, two variants will be built separately, one like
318 // normal, and the other limited to the set of libraries and headers
319 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700320 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900321 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700322 // so it shouldn't have any unversioned runtime dependencies, or
323 // make assumptions about the system that may not be true in the
324 // future.
325 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900326 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900327 //
328 // Default value is true when vndk: {enabled: true} or vendor: true.
329 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700330 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
331 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900332
Justin Yun63e9ec72020-10-29 16:49:43 +0900333 // whether this module should be allowed to be directly depended by other
334 // modules with `product_specific: true` or `product_available: true`.
335 // If set to true, an additional product variant will be built separately
336 // that is limited to the set of libraries and headers that are exposed to
337 // /product modules.
338 //
339 // The product variant may be used with a different (newer) /system,
340 // so it shouldn't have any unversioned runtime dependencies, or
341 // make assumptions about the system that may not be true in the
342 // future.
343 //
344 // It must be set to true by default for vndk: {enabled: true} modules.
345 //
346 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
347 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
348 Product_available *bool
349
Jiyong Park5fb8c102018-04-09 12:03:06 +0900350 // whether this module is capable of being loaded with other instance
351 // (possibly an older version) of the same module in the same process.
352 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
353 // can be double loaded in a vendor process if the library is also a
354 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
355 // explicitly marked as `double_loadable: true` by the owner, or the dependency
356 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
357 Double_loadable *bool
Colin Crossca860ac2016-01-04 14:34:37 -0800358}
359
Colin Crossca860ac2016-01-04 14:34:37 -0800360type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800361 static() bool
362 staticBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900363 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900364 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900365 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700366 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900367 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700368 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800369 sdkVersion() string
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700370 useVndk() bool
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800371 isNdk() bool
Inseob Kim9516ee92019-05-09 10:56:13 +0900372 isLlndk(config android.Config) bool
373 isLlndkPublic(config android.Config) bool
374 isVndkPrivate(config android.Config) bool
Justin Yun8effde42017-06-23 19:24:43 +0900375 isVndk() bool
376 isVndkSp() bool
Logan Chienf3511742017-10-31 18:04:35 +0800377 isVndkExt() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900378 inProduct() bool
379 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800380 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700381 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900382 inRecovery() bool
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +0800383 shouldCreateSourceAbiDump() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700384 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700385 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800386 getVndkExtendsModuleName() string
Yi Kong7e53c572018-02-14 18:16:12 +0800387 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800388 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800389 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800390 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700391 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700392 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900393 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800394 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700395 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700396 directlyInAnyApex() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800397}
398
399type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700400 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800401 ModuleContextIntf
402}
403
404type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700405 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800406 ModuleContextIntf
407}
408
Colin Cross37047f12016-12-13 17:06:13 -0800409type DepsContext interface {
410 android.BottomUpMutatorContext
411 ModuleContextIntf
412}
413
Colin Crossca860ac2016-01-04 14:34:37 -0800414type feature interface {
415 begin(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800416 deps(ctx DepsContext, deps Deps) Deps
Colin Crossca860ac2016-01-04 14:34:37 -0800417 flags(ctx ModuleContext, flags Flags) Flags
418 props() []interface{}
419}
420
421type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700422 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800423 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800424 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700425 compilerProps() []interface{}
426
Colin Cross76fada02016-07-27 10:31:13 -0700427 appendCflags([]string)
428 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700429 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800430}
431
432type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700433 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800434 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700435 linkerFlags(ctx ModuleContext, flags Flags) Flags
436 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800437 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700438
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700439 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700440 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900441 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700442
443 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900444 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000445
446 // Get the deps that have been explicitly specified in the properties.
447 // Only updates the
448 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
449}
450
451type specifiedDeps struct {
452 sharedLibs []string
Martin Stjernholm10566a02020-03-24 01:19:52 +0000453 systemSharedLibs []string // Note nil and [] are semantically distinct.
Colin Crossca860ac2016-01-04 14:34:37 -0800454}
455
456type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700457 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700458 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000459 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800460 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700461 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700462 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900463 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100464 makeUninstallable(mod *Module)
Colin Crossca860ac2016-01-04 14:34:37 -0800465}
466
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800467type xref interface {
468 XrefCcFiles() android.Paths
469}
470
Colin Cross6e511a92020-07-27 21:26:48 -0700471type libraryDependencyKind int
472
473const (
474 headerLibraryDependency = iota
475 sharedLibraryDependency
476 staticLibraryDependency
477)
478
479func (k libraryDependencyKind) String() string {
480 switch k {
481 case headerLibraryDependency:
482 return "headerLibraryDependency"
483 case sharedLibraryDependency:
484 return "sharedLibraryDependency"
485 case staticLibraryDependency:
486 return "staticLibraryDependency"
487 default:
488 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
489 }
490}
491
492type libraryDependencyOrder int
493
494const (
495 earlyLibraryDependency = -1
496 normalLibraryDependency = 0
497 lateLibraryDependency = 1
498)
499
500func (o libraryDependencyOrder) String() string {
501 switch o {
502 case earlyLibraryDependency:
503 return "earlyLibraryDependency"
504 case normalLibraryDependency:
505 return "normalLibraryDependency"
506 case lateLibraryDependency:
507 return "lateLibraryDependency"
508 default:
509 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
510 }
511}
512
513// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
514// tags that have a set of predefined tag objects that are reused for each dependency, a
515// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
516// That means that comparing a libraryDependencyTag for equality will only be equal if all
517// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
518// then check individual metadata fields instead.
519type libraryDependencyTag struct {
520 blueprint.BaseDependencyTag
521
522 // These are exported so that fmt.Printf("%#v") can call their String methods.
523 Kind libraryDependencyKind
524 Order libraryDependencyOrder
525
526 wholeStatic bool
527
528 reexportFlags bool
529 explicitlyVersioned bool
530 dataLib bool
531 ndk bool
532
533 staticUnwinder bool
534
535 makeSuffix string
536}
537
538// header returns true if the libraryDependencyTag is tagging a header lib dependency.
539func (d libraryDependencyTag) header() bool {
540 return d.Kind == headerLibraryDependency
541}
542
543// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
544func (d libraryDependencyTag) shared() bool {
545 return d.Kind == sharedLibraryDependency
546}
547
548// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
549func (d libraryDependencyTag) static() bool {
550 return d.Kind == staticLibraryDependency
551}
552
Colin Cross62a0cfd2020-11-10 18:12:15 -0800553// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
554// binaries or other shared libraries are installed as dependencies.
555func (d libraryDependencyTag) InstallDepNeeded() bool {
556 return d.shared()
557}
558
559var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
560
561// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700562// libraryDependencyTag. Each tag object is created globally and reused for multiple
563// dependencies (although since the object contains no references, assigning a tag to a
564// variable and modifying it will not modify the original). Users can compare the tag
565// returned by ctx.OtherModuleDependencyTag against the global original
566type dependencyTag struct {
567 blueprint.BaseDependencyTag
568 name string
569}
570
Colin Cross62a0cfd2020-11-10 18:12:15 -0800571// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
572// libraryDependencyTag, but where the dependency needs to be installed when the parent is
573// installed.
574type installDependencyTag struct {
575 blueprint.BaseDependencyTag
576 android.InstallAlwaysNeededDependencyTag
577 name string
578}
579
Colin Crossc99deeb2016-04-11 15:06:20 -0700580var (
Colin Cross6e511a92020-07-27 21:26:48 -0700581 genSourceDepTag = dependencyTag{name: "gen source"}
582 genHeaderDepTag = dependencyTag{name: "gen header"}
583 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
584 objDepTag = dependencyTag{name: "obj"}
585 linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
586 dynamicLinkerDepTag = dependencyTag{name: "dynamic linker"}
587 reuseObjTag = dependencyTag{name: "reuse objects"}
588 staticVariantTag = dependencyTag{name: "static variant"}
589 vndkExtDepTag = dependencyTag{name: "vndk extends"}
590 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Cross62a0cfd2020-11-10 18:12:15 -0800591 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700592 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700593 stubImplDepTag = dependencyTag{name: "stub_impl"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700594)
595
Colin Cross56a83212020-09-15 18:30:11 -0700596type copyDirectlyInAnyApexDependencyTag dependencyTag
597
598func (copyDirectlyInAnyApexDependencyTag) CopyDirectlyInAnyApex() {}
599
600var _ android.CopyDirectlyInAnyApexTag = copyDirectlyInAnyApexDependencyTag{}
601
Roland Levillainf89cd092019-07-29 16:22:59 +0100602func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700603 ccLibDepTag, ok := depTag.(libraryDependencyTag)
604 return ok && ccLibDepTag.shared()
605}
606
607func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
608 ccLibDepTag, ok := depTag.(libraryDependencyTag)
609 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100610}
611
Zach Johnson3df4e632020-11-06 11:56:27 -0800612func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
613 ccLibDepTag, ok := depTag.(libraryDependencyTag)
614 return ok && ccLibDepTag.header()
615}
616
Roland Levillainf89cd092019-07-29 16:22:59 +0100617func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross62a0cfd2020-11-10 18:12:15 -0800618 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100619}
620
621func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700622 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100623 return ok && ccDepTag == testPerSrcDepTag
624}
625
Colin Crossca860ac2016-01-04 14:34:37 -0800626// Module contains the properties and members used by all C/C++ module types, and implements
627// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
628// to construct the output file. Behavior can be customized with a Customizer interface
629type Module struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700630 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -0700631 android.DefaultableModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +0900632 android.ApexModuleBase
Jiyong Parkd1063c12019-07-17 20:08:41 +0900633 android.SdkBase
Colin Crossc472d572015-03-17 15:06:21 -0700634
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700635 Properties BaseProperties
636 VendorProperties VendorProperties
Colin Crossfa138792015-04-24 17:31:52 -0700637
Colin Crossca860ac2016-01-04 14:34:37 -0800638 // initialize before calling Init
Colin Cross635c3b02016-05-18 15:37:25 -0700639 hod android.HostOrDeviceSupported
640 multilib android.Multilib
Colin Crossc472d572015-03-17 15:06:21 -0700641
Paul Duffina0843f62019-12-13 19:50:38 +0000642 // Allowable SdkMemberTypes of this module type.
643 sdkMemberTypes []android.SdkMemberType
644
Colin Crossca860ac2016-01-04 14:34:37 -0800645 // delegates, initialize before calling Init
Colin Crossb4ce0ec2016-09-13 13:41:39 -0700646 features []feature
647 compiler compiler
648 linker linker
649 installer installer
650 stl *stl
651 sanitize *sanitize
Dan Willemsen581341d2017-02-09 16:16:31 -0800652 coverage *coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800653 sabi *sabi
Justin Yun8effde42017-06-23 19:24:43 +0900654 vndkdep *vndkdep
Stephen Craneba090d12017-05-09 15:44:35 -0700655 lto *lto
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700656 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800657
Colin Cross31076b32020-10-23 17:22:06 -0700658 library libraryInterface
659
Colin Cross635c3b02016-05-18 15:37:25 -0700660 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800661
Colin Crossb98c8b02016-07-29 13:44:28 -0700662 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700663
664 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800665
666 // Flags used to compile this module
667 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700668
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800669 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700670 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900671
672 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800673 // Kythe (source file indexer) paths for this compilation module
674 kytheFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900675
676 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700677 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700678
679 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700680}
681
Ivan Lozano52767be2019-10-18 14:49:46 -0700682func (c *Module) Toc() android.OptionalPath {
683 if c.linker != nil {
684 if library, ok := c.linker.(libraryInterface); ok {
685 return library.toc()
686 }
687 }
688 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
689}
690
691func (c *Module) ApiLevel() string {
692 if c.linker != nil {
693 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700694 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700695 }
696 }
697 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
698}
699
700func (c *Module) Static() bool {
701 if c.linker != nil {
702 if library, ok := c.linker.(libraryInterface); ok {
703 return library.static()
704 }
705 }
706 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
707}
708
709func (c *Module) Shared() bool {
710 if c.linker != nil {
711 if library, ok := c.linker.(libraryInterface); ok {
712 return library.shared()
713 }
714 }
715 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
716}
717
718func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +0000719 if c.stl != nil {
720 return c.stl.Properties.SelectedStl
721 }
722 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -0700723}
724
725func (c *Module) ToolchainLibrary() bool {
726 if _, ok := c.linker.(*toolchainLibraryDecorator); ok {
727 return true
728 }
729 return false
730}
731
732func (c *Module) NdkPrebuiltStl() bool {
733 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
734 return true
735 }
736 return false
737}
738
739func (c *Module) StubDecorator() bool {
740 if _, ok := c.linker.(*stubDecorator); ok {
741 return true
742 }
743 return false
744}
745
746func (c *Module) SdkVersion() string {
747 return String(c.Properties.Sdk_version)
748}
749
Artur Satayev480e25b2020-04-27 18:53:18 +0100750func (c *Module) MinSdkVersion() string {
751 return String(c.Properties.Min_sdk_version)
752}
753
Dan Albert92fe7402020-07-15 13:33:30 -0700754func (c *Module) SplitPerApiLevel() bool {
Colin Cross1348ce32020-10-01 13:37:16 -0700755 if !c.canUseSdk() {
756 return false
757 }
Dan Albert92fe7402020-07-15 13:33:30 -0700758 if linker, ok := c.linker.(*objectLinker); ok {
759 return linker.isCrt()
760 }
761 return false
762}
763
Colin Crossc511bc52020-04-07 16:50:32 +0000764func (c *Module) AlwaysSdk() bool {
765 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
766}
767
Ivan Lozano183a3212019-10-18 14:18:45 -0700768func (c *Module) CcLibrary() bool {
769 if c.linker != nil {
770 if _, ok := c.linker.(*libraryDecorator); ok {
771 return true
772 }
Colin Crossd48fe732020-09-23 20:37:24 -0700773 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
774 return true
775 }
Ivan Lozano183a3212019-10-18 14:18:45 -0700776 }
777 return false
778}
779
780func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -0700781 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700782 return true
783 }
784 return false
785}
786
Ivan Lozano2b262972019-11-21 12:30:50 -0800787func (c *Module) NonCcVariants() bool {
788 return false
789}
790
Ivan Lozano183a3212019-10-18 14:18:45 -0700791func (c *Module) SetStatic() {
792 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700793 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700794 library.setStatic()
795 return
796 }
797 }
798 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
799}
800
801func (c *Module) SetShared() {
802 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700803 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700804 library.setShared()
805 return
806 }
807 }
808 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
809}
810
811func (c *Module) BuildStaticVariant() bool {
812 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700813 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700814 return library.buildStatic()
815 }
816 }
817 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
818}
819
820func (c *Module) BuildSharedVariant() bool {
821 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700822 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700823 return library.buildShared()
824 }
825 }
826 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
827}
828
829func (c *Module) Module() android.Module {
830 return c
831}
832
Jiyong Parkc20eee32018-09-05 22:36:17 +0900833func (c *Module) OutputFile() android.OptionalPath {
834 return c.outputFile
835}
836
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400837func (c *Module) CoverageFiles() android.Paths {
838 if c.linker != nil {
839 if library, ok := c.linker.(libraryInterface); ok {
840 return library.objs().coverageFiles
841 }
842 }
843 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
844}
845
Ivan Lozano183a3212019-10-18 14:18:45 -0700846var _ LinkableInterface = (*Module)(nil)
847
Jiyong Park719b4462019-01-13 00:39:51 +0900848func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900849 if c.linker != nil {
850 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +0900851 }
852 return nil
853}
854
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900855func (c *Module) CoverageOutputFile() android.OptionalPath {
856 if c.linker != nil {
857 return c.linker.coverageOutputFilePath()
858 }
859 return android.OptionalPath{}
860}
861
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900862func (c *Module) RelativeInstallPath() string {
863 if c.installer != nil {
864 return c.installer.relativeInstallPath()
865 }
866 return ""
867}
868
Jooyung Han344d5432019-08-23 11:17:39 +0900869func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900870 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +0900871}
872
Colin Cross36242852017-06-23 15:06:31 -0700873func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -0700874 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -0800875 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -0700876 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800877 }
878 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -0700879 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800880 }
881 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -0700882 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800883 }
Colin Crossa8e07cc2016-04-04 15:07:06 -0700884 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -0700885 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -0700886 }
Colin Cross16b23492016-01-06 14:41:07 -0800887 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -0700888 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -0800889 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800890 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -0700891 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -0800892 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800893 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -0700894 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800895 }
Justin Yun8effde42017-06-23 19:24:43 +0900896 if c.vndkdep != nil {
897 c.AddProperties(c.vndkdep.props()...)
898 }
Stephen Craneba090d12017-05-09 15:44:35 -0700899 if c.lto != nil {
900 c.AddProperties(c.lto.props()...)
901 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700902 if c.pgo != nil {
903 c.AddProperties(c.pgo.props()...)
904 }
Colin Crossca860ac2016-01-04 14:34:37 -0800905 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -0700906 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800907 }
Colin Crossc472d572015-03-17 15:06:21 -0700908
Jiyong Park1613e552020-09-14 19:43:17 +0900909 c.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, os android.OsType) bool {
Elliott Hughes79ae3412020-04-17 15:49:49 -0700910 // Windows builds always prefer 32-bit
Jiyong Park1613e552020-09-14 19:43:17 +0900911 return os == android.Windows
Colin Crossa9d8bee2018-10-02 13:59:46 -0700912 })
Colin Cross36242852017-06-23 15:06:31 -0700913 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +0900914 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +0900915 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +0900916 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +0900917
Colin Cross36242852017-06-23 15:06:31 -0700918 return c
Colin Crossc472d572015-03-17 15:06:21 -0700919}
920
Colin Crossb916a382016-07-29 17:28:03 -0700921// Returns true for dependency roots (binaries)
922// TODO(ccross): also handle dlopenable libraries
923func (c *Module) isDependencyRoot() bool {
924 if root, ok := c.linker.(interface {
925 isDependencyRoot() bool
926 }); ok {
927 return root.isDependencyRoot()
928 }
929 return false
930}
931
Justin Yun5f7f7e82019-11-18 19:52:14 +0900932// Returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64.
933// "product" and "vendor" variant modules return true for this function.
934// When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true",
935// "soc_specific: true" and more vendor installed modules are included here.
Justin Yun63e9ec72020-10-29 16:49:43 +0900936// When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "product_available: true" or
Justin Yun5f7f7e82019-11-18 19:52:14 +0900937// "product_specific: true" modules are included here.
Ivan Lozano52767be2019-10-18 14:49:46 -0700938func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +0900939 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700940}
941
Colin Crossc511bc52020-04-07 16:50:32 +0000942func (c *Module) canUseSdk() bool {
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700943 return c.Os() == android.Android && !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +0000944}
945
946func (c *Module) UseSdk() bool {
947 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -0700948 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +0000949 }
950 return false
951}
952
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800953func (c *Module) isCoverageVariant() bool {
954 return c.coverage.Properties.IsCoverageVariant
955}
956
Peter Collingbournead84f972019-12-17 16:46:18 -0800957func (c *Module) IsNdk() bool {
Colin Crossf0913fb2020-07-29 12:59:39 -0700958 return inList(c.BaseModuleName(), ndkKnownLibs)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800959}
960
Inseob Kim9516ee92019-05-09 10:56:13 +0900961func (c *Module) isLlndk(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800962 // Returns true for both LLNDK (public) and LLNDK-private libs.
Jooyung Han0302a842019-10-30 18:43:49 +0900963 return isLlndkLibrary(c.BaseModuleName(), config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800964}
965
Inseob Kim9516ee92019-05-09 10:56:13 +0900966func (c *Module) isLlndkPublic(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800967 // Returns true only for LLNDK (public) libs.
Jooyung Han0302a842019-10-30 18:43:49 +0900968 name := c.BaseModuleName()
969 return isLlndkLibrary(name, config) && !isVndkPrivateLibrary(name, config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800970}
971
Inseob Kim9516ee92019-05-09 10:56:13 +0900972func (c *Module) isVndkPrivate(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800973 // Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Jooyung Han0302a842019-10-30 18:43:49 +0900974 return isVndkPrivateLibrary(c.BaseModuleName(), config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800975}
976
Ivan Lozano52767be2019-10-18 14:49:46 -0700977func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +0800978 if vndkdep := c.vndkdep; vndkdep != nil {
979 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +0900980 }
981 return false
982}
983
Yi Kong7e53c572018-02-14 18:16:12 +0800984func (c *Module) isPgoCompile() bool {
985 if pgo := c.pgo; pgo != nil {
986 return pgo.Properties.PgoCompile
987 }
988 return false
989}
990
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800991func (c *Module) isNDKStubLibrary() bool {
992 if _, ok := c.compiler.(*stubDecorator); ok {
993 return true
994 }
995 return false
996}
997
Logan Chienf3511742017-10-31 18:04:35 +0800998func (c *Module) isVndkSp() bool {
999 if vndkdep := c.vndkdep; vndkdep != nil {
1000 return vndkdep.isVndkSp()
1001 }
1002 return false
1003}
1004
1005func (c *Module) isVndkExt() bool {
1006 if vndkdep := c.vndkdep; vndkdep != nil {
1007 return vndkdep.isVndkExt()
1008 }
1009 return false
1010}
1011
Ivan Lozano52767be2019-10-18 14:49:46 -07001012func (c *Module) MustUseVendorVariant() bool {
Jooyung Han097087b2019-10-22 19:32:18 +09001013 return c.isVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001014}
1015
Logan Chienf3511742017-10-31 18:04:35 +08001016func (c *Module) getVndkExtendsModuleName() string {
1017 if vndkdep := c.vndkdep; vndkdep != nil {
1018 return vndkdep.getVndkExtendsModuleName()
1019 }
1020 return ""
1021}
1022
Jiyong Park25fc6a92018-11-18 18:02:45 +09001023func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001024 if lib := c.library; lib != nil {
1025 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001026 }
1027 return false
1028}
1029
1030func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001031 if lib := c.library; lib != nil {
1032 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001033 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001034 return false
1035}
1036
Colin Cross0477b422020-10-13 18:43:54 -07001037// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1038// the implementation. If it is an implementation library it returns its own name.
1039func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1040 name := ctx.OtherModuleName(c)
1041 if versioned, ok := c.linker.(versionedInterface); ok {
1042 name = versioned.implementationModuleName(name)
1043 }
1044 return name
1045}
1046
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001047func (c *Module) bootstrap() bool {
1048 return Bool(c.Properties.Bootstrap)
1049}
1050
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001051func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001052 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1053 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1054 return false
1055 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001056 return c.linker != nil && c.linker.nativeCoverage()
1057}
1058
Inseob Kim8471cda2019-11-15 09:59:12 +09001059func (c *Module) isSnapshotPrebuilt() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09001060 if p, ok := c.linker.(interface{ isSnapshotPrebuilt() bool }); ok {
1061 return p.isSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001062 }
1063 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001064}
1065
Bill Peckham945441c2020-08-31 16:07:58 -07001066func (c *Module) ExcludeFromVendorSnapshot() bool {
1067 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1068}
1069
Jiyong Parkf1194352019-02-25 11:05:47 +09001070func isBionic(name string) bool {
1071 switch name {
Martin Stjernholm203489b2019-11-11 15:33:27 +00001072 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001073 return true
1074 }
1075 return false
1076}
1077
Martin Stjernholm279de572019-09-10 23:18:20 +01001078func InstallToBootstrap(name string, config android.Config) bool {
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001079 if name == "libclang_rt.hwasan-aarch64-android" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001080 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001081 }
1082 return isBionic(name)
1083}
1084
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001085func (c *Module) XrefCcFiles() android.Paths {
1086 return c.kytheFiles
1087}
1088
Colin Crossca860ac2016-01-04 14:34:37 -08001089type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001090 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001091 moduleContextImpl
1092}
1093
Colin Cross37047f12016-12-13 17:06:13 -08001094type depsContext struct {
1095 android.BottomUpMutatorContext
1096 moduleContextImpl
1097}
1098
Colin Crossca860ac2016-01-04 14:34:37 -08001099type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001100 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001101 moduleContextImpl
1102}
1103
1104type moduleContextImpl struct {
1105 mod *Module
1106 ctx BaseModuleContext
1107}
1108
Colin Crossb98c8b02016-07-29 13:44:28 -07001109func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001110 return ctx.mod.toolchain(ctx.ctx)
1111}
1112
1113func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001114 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001115}
1116
1117func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001118 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001119}
1120
Jiyong Park1d1119f2019-07-29 21:27:18 +09001121func (ctx *moduleContextImpl) header() bool {
1122 return ctx.mod.header()
1123}
1124
Inseob Kim7f283f42020-06-01 21:53:49 +09001125func (ctx *moduleContextImpl) binary() bool {
1126 return ctx.mod.binary()
1127}
1128
Inseob Kim1042d292020-06-01 23:23:05 +09001129func (ctx *moduleContextImpl) object() bool {
1130 return ctx.mod.object()
1131}
1132
Jooyung Hanccce2f22020-03-07 03:45:53 +09001133func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001134 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001135}
1136
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001137func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001138 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001139}
1140
1141func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001142 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001143 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001144 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001145 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001146 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001147 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001148 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001149 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001150 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001151 }
1152 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001153}
1154
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001155func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001156 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001157}
Justin Yun8effde42017-06-23 19:24:43 +09001158
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001159func (ctx *moduleContextImpl) isNdk() bool {
Peter Collingbournead84f972019-12-17 16:46:18 -08001160 return ctx.mod.IsNdk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001161}
1162
Inseob Kim9516ee92019-05-09 10:56:13 +09001163func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {
1164 return ctx.mod.isLlndk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001165}
1166
Inseob Kim9516ee92019-05-09 10:56:13 +09001167func (ctx *moduleContextImpl) isLlndkPublic(config android.Config) bool {
1168 return ctx.mod.isLlndkPublic(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001169}
1170
Inseob Kim9516ee92019-05-09 10:56:13 +09001171func (ctx *moduleContextImpl) isVndkPrivate(config android.Config) bool {
1172 return ctx.mod.isVndkPrivate(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001173}
1174
Logan Chienf3511742017-10-31 18:04:35 +08001175func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001176 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001177}
1178
Yi Kong7e53c572018-02-14 18:16:12 +08001179func (ctx *moduleContextImpl) isPgoCompile() bool {
1180 return ctx.mod.isPgoCompile()
1181}
1182
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001183func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1184 return ctx.mod.isNDKStubLibrary()
1185}
1186
Justin Yun8effde42017-06-23 19:24:43 +09001187func (ctx *moduleContextImpl) isVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001188 return ctx.mod.isVndkSp()
1189}
1190
1191func (ctx *moduleContextImpl) isVndkExt() bool {
1192 return ctx.mod.isVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001193}
1194
Vic Yangefd249e2018-11-12 20:19:56 -08001195func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001196 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001197}
1198
Logan Chien2f2b8902018-07-10 15:01:19 +08001199// Check whether ABI dumps should be created for this module.
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +08001200func (ctx *moduleContextImpl) shouldCreateSourceAbiDump() bool {
Logan Chien2f2b8902018-07-10 15:01:19 +08001201 if ctx.ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
1202 return false
Jayant Chowdharyea0a2e12018-03-01 19:12:16 -08001203 }
Doug Hornc32c6b02019-01-17 14:44:05 -08001204
Hsin-Yi Chenf81bb652020-04-07 21:42:19 +08001205 // Coverage builds have extra symbols.
1206 if ctx.mod.isCoverageVariant() {
1207 return false
1208 }
1209
Doug Hornc32c6b02019-01-17 14:44:05 -08001210 if ctx.ctx.Fuchsia() {
1211 return false
1212 }
1213
Logan Chien2f2b8902018-07-10 15:01:19 +08001214 if sanitize := ctx.mod.sanitize; sanitize != nil {
1215 if !sanitize.isVariantOnProductionDevice() {
1216 return false
1217 }
1218 }
1219 if !ctx.ctx.Device() {
1220 // Host modules do not need ABI dumps.
1221 return false
1222 }
Colin Cross31076b32020-10-23 17:22:06 -07001223 if ctx.isNDKStubLibrary() {
Hsin-Yi Chenf6a95462019-06-25 14:46:52 +08001224 // Stubs do not need ABI dumps.
1225 return false
1226 }
Colin Cross31076b32020-10-23 17:22:06 -07001227 if lib := ctx.mod.library; lib != nil && lib.buildStubs() {
1228 // Stubs do not need ABI dumps.
1229 return false
1230 }
1231
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +08001232 return true
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001233}
1234
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001235func (ctx *moduleContextImpl) selectedStl() string {
1236 if stl := ctx.mod.stl; stl != nil {
1237 return stl.Properties.SelectedStl
1238 }
1239 return ""
1240}
1241
Ivan Lozanobd721262018-11-27 14:33:03 -08001242func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1243 return ctx.mod.linker.useClangLld(actx)
1244}
1245
Colin Crossce75d2c2016-10-06 16:12:58 -07001246func (ctx *moduleContextImpl) baseModuleName() string {
1247 return ctx.mod.ModuleBase.BaseModuleName()
1248}
1249
Logan Chienf3511742017-10-31 18:04:35 +08001250func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1251 return ctx.mod.getVndkExtendsModuleName()
1252}
1253
Logan Chiene274fc92019-12-03 11:18:32 -08001254func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001255 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001256}
1257
Colin Crosse07f2312020-08-13 11:24:56 -07001258func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001259 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001260}
1261
Dan Albertc8060532020-07-22 22:32:17 -07001262func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001263 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001264}
1265
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001266func (ctx *moduleContextImpl) bootstrap() bool {
1267 return ctx.mod.bootstrap()
1268}
1269
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001270func (ctx *moduleContextImpl) nativeCoverage() bool {
1271 return ctx.mod.nativeCoverage()
1272}
1273
Colin Cross56a83212020-09-15 18:30:11 -07001274func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1275 return ctx.mod.DirectlyInAnyApex()
1276}
1277
Colin Cross635c3b02016-05-18 15:37:25 -07001278func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001279 return &Module{
1280 hod: hod,
1281 multilib: multilib,
1282 }
1283}
1284
Colin Cross635c3b02016-05-18 15:37:25 -07001285func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001286 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001287 module.features = []feature{
1288 &tidyFeature{},
1289 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001290 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001291 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001292 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001293 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001294 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001295 module.lto = &lto{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001296 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001297 return module
1298}
1299
Colin Crossce75d2c2016-10-06 16:12:58 -07001300func (c *Module) Prebuilt() *android.Prebuilt {
1301 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1302 return p.prebuilt()
1303 }
1304 return nil
1305}
1306
1307func (c *Module) Name() string {
1308 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001309 if p, ok := c.linker.(interface {
1310 Name(string) string
1311 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001312 name = p.Name(name)
1313 }
1314 return name
1315}
1316
Alex Light3d673592019-01-18 14:37:31 -08001317func (c *Module) Symlinks() []string {
1318 if p, ok := c.installer.(interface {
1319 symlinkList() []string
1320 }); ok {
1321 return p.symlinkList()
1322 }
1323 return nil
1324}
1325
Roland Levillainf89cd092019-07-29 16:22:59 +01001326func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1327 test, ok := c.linker.(testPerSrc)
1328 return ok && test.isAllTestsVariation()
1329}
1330
Chris Parsons216e10a2020-07-09 17:12:52 -04001331func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001332 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001333 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001334 }); ok {
1335 return p.dataPaths()
1336 }
1337 return nil
1338}
1339
Justin Yun5f7f7e82019-11-18 19:52:14 +09001340func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
1341 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1342 // "current", it will append the VNDK version to the name suffix.
1343 var vndkVersion string
1344 var nameSuffix string
1345 if c.inProduct() {
1346 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
1347 nameSuffix = productSuffix
1348 } else {
1349 vndkVersion = ctx.DeviceConfig().VndkVersion()
1350 nameSuffix = vendorSuffix
1351 }
1352 if vndkVersion == "current" {
1353 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1354 }
1355 if c.Properties.VndkVersion != vndkVersion {
1356 // add version suffix only if the module is using different vndk version than the
1357 // version in product or vendor partition.
1358 nameSuffix += "." + c.Properties.VndkVersion
1359 }
1360 return nameSuffix
1361}
1362
Colin Cross635c3b02016-05-18 15:37:25 -07001363func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Roland Levillainf2fad972019-06-28 15:41:19 +01001364 // Handle the case of a test module split by `test_per_src` mutator.
Roland Levillainf89cd092019-07-29 16:22:59 +01001365 //
1366 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1367 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1368 // module and return early, as this module does not produce an output file per se.
1369 if c.IsTestPerSrcAllTestsVariation() {
1370 c.outputFile = android.OptionalPath{}
1371 return
Roland Levillainf2fad972019-06-28 15:41:19 +01001372 }
1373
Colin Cross56a83212020-09-15 18:30:11 -07001374 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1375 if !apexInfo.IsForPlatform() {
1376 c.hideApexVariantFromMake = true
1377 }
1378
Jooyung Han38002912019-05-16 04:01:54 +09001379 c.makeLinkType = c.getMakeLinkType(actx)
Inseob Kim9516ee92019-05-09 10:56:13 +09001380
Inseob Kim64c43952019-08-26 16:52:35 +09001381 c.Properties.SubName = ""
1382
1383 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1384 c.Properties.SubName += nativeBridgeSuffix
1385 }
1386
Justin Yun5f7f7e82019-11-18 19:52:14 +09001387 _, llndk := c.linker.(*llndkStubDecorator)
1388 _, llndkHeader := c.linker.(*llndkHeadersDecorator)
Justin Yun63e9ec72020-10-29 16:49:43 +09001389 if llndk || llndkHeader || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001390 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1391 // added for product variant only when we have vendor and product variants with core
1392 // variant. The suffix is not added for vendor-only or product-only module.
1393 c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
1394 } else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
Inseob Kim64c43952019-08-26 16:52:35 +09001395 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1396 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
1397 c.Properties.SubName += vendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001398 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
1399 c.Properties.SubName += ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001400 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
1401 c.Properties.SubName += vendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001402 } else if c.InRecovery() && !c.OnlyInRecovery() {
Inseob Kim64c43952019-08-26 16:52:35 +09001403 c.Properties.SubName += recoverySuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001404 } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
Colin Crossc511bc52020-04-07 16:50:32 +00001405 c.Properties.SubName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001406 if c.SplitPerApiLevel() {
1407 c.Properties.SubName += "." + c.SdkVersion()
1408 }
Inseob Kim64c43952019-08-26 16:52:35 +09001409 }
1410
Colin Crossca860ac2016-01-04 14:34:37 -08001411 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001412 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001413 moduleContextImpl: moduleContextImpl{
1414 mod: c,
1415 },
1416 }
1417 ctx.ctx = ctx
1418
Colin Crossf18e1102017-11-16 14:33:08 -08001419 deps := c.depsToPaths(ctx)
1420 if ctx.Failed() {
1421 return
1422 }
1423
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001424 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1425 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1426 }
1427
Colin Crossca860ac2016-01-04 14:34:37 -08001428 flags := Flags{
1429 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001430 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001431 }
Colin Crossca860ac2016-01-04 14:34:37 -08001432 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001433 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001434 }
1435 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001436 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001437 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001438 if c.stl != nil {
1439 flags = c.stl.flags(ctx, flags)
1440 }
Colin Cross16b23492016-01-06 14:41:07 -08001441 if c.sanitize != nil {
1442 flags = c.sanitize.flags(ctx, flags)
1443 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001444 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001445 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001446 }
Stephen Craneba090d12017-05-09 15:44:35 -07001447 if c.lto != nil {
1448 flags = c.lto.flags(ctx, flags)
1449 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001450 if c.pgo != nil {
1451 flags = c.pgo.flags(ctx, flags)
1452 }
Colin Crossca860ac2016-01-04 14:34:37 -08001453 for _, feature := range c.features {
1454 flags = feature.flags(ctx, flags)
1455 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001456 if ctx.Failed() {
1457 return
1458 }
1459
Colin Cross4af21ed2019-11-04 09:37:55 -08001460 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1461 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1462 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001463
Colin Cross4af21ed2019-11-04 09:37:55 -08001464 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001465
1466 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001467 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001468 }
1469 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001470 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001471 }
1472
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001473 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001474 // We need access to all the flags seen by a source file.
1475 if c.sabi != nil {
1476 flags = c.sabi.flags(ctx, flags)
1477 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001478
Colin Cross4af21ed2019-11-04 09:37:55 -08001479 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001480
Colin Crossca860ac2016-01-04 14:34:37 -08001481 // Optimization to reduce size of build.ninja
1482 // Replace the long list of flags for each file with a module-local variable
Colin Cross4af21ed2019-11-04 09:37:55 -08001483 ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
1484 ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
1485 ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
1486 flags.Local.CFlags = []string{"$cflags"}
1487 flags.Local.CppFlags = []string{"$cppflags"}
1488 flags.Local.AsFlags = []string{"$asflags"}
Colin Crossca860ac2016-01-04 14:34:37 -08001489
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001490 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001491 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001492 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001493 if ctx.Failed() {
1494 return
1495 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001496 c.kytheFiles = objs.kytheFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001497 }
1498
Colin Crossca860ac2016-01-04 14:34:37 -08001499 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001500 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001501 if ctx.Failed() {
1502 return
1503 }
Colin Cross635c3b02016-05-18 15:37:25 -07001504 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001505
1506 // If a lib is directly included in any of the APEXes, unhide the stubs
1507 // variant having the latest version gets visible to make. In addition,
1508 // the non-stubs variant is renamed to <libname>.bootstrap. This is to
1509 // force anything in the make world to link against the stubs library.
1510 // (unless it is explicitly referenced via .bootstrap suffix or the
1511 // module is marked with 'bootstrap: true').
Colin Cross56a83212020-09-15 18:30:11 -07001512 if c.HasStubsVariants() && c.AnyVariantDirectlyInAnyApex() && !c.InRamdisk() &&
Ivan Lozano52767be2019-10-18 14:49:46 -07001513 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001514 c.IsStubs() && !c.InVendorRamdisk() {
Jiyong Parkb0788572018-12-20 22:10:17 +09001515 c.Properties.HideFromMake = false // unhide
1516 // Note: this is still non-installable
1517 }
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001518
1519 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current.
1520 if i, ok := c.linker.(snapshotLibraryInterface); ok && ctx.DeviceConfig().VndkVersion() == "current" {
Colin Cross56a83212020-09-15 18:30:11 -07001521 if isSnapshotAware(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001522 i.collectHeadersForSnapshot(ctx)
1523 }
1524 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001525 }
Colin Cross5049f022015-03-18 13:28:46 -07001526
Colin Cross56a83212020-09-15 18:30:11 -07001527 if c.installable(apexInfo) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001528 c.installer.install(ctx, c.outputFile.Path())
1529 if ctx.Failed() {
1530 return
Colin Crossca860ac2016-01-04 14:34:37 -08001531 }
Paul Duffin0cb37b92020-03-04 14:52:46 +00001532 } else if !proptools.BoolDefault(c.Properties.Installable, true) {
1533 // If the module has been specifically configure to not be installed then
1534 // skip the installation as otherwise it will break when running inside make
1535 // as the output path to install will not be specified. Not all uninstallable
1536 // modules can skip installation as some are needed for resolving make side
1537 // dependencies.
1538 c.SkipInstall()
Dan Albertc403f7c2015-03-18 14:01:18 -07001539 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001540}
1541
Colin Cross0ea8ba82019-06-06 14:33:29 -07001542func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001543 if c.cachedToolchain == nil {
Colin Crossb98c8b02016-07-29 13:44:28 -07001544 c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
Colin Cross3f40fa42015-01-30 17:27:36 -08001545 }
Colin Crossca860ac2016-01-04 14:34:37 -08001546 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08001547}
1548
Colin Crossca860ac2016-01-04 14:34:37 -08001549func (c *Module) begin(ctx BaseModuleContext) {
1550 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001551 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07001552 }
Colin Crossca860ac2016-01-04 14:34:37 -08001553 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001554 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001555 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001556 if c.stl != nil {
1557 c.stl.begin(ctx)
1558 }
Colin Cross16b23492016-01-06 14:41:07 -08001559 if c.sanitize != nil {
1560 c.sanitize.begin(ctx)
1561 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001562 if c.coverage != nil {
1563 c.coverage.begin(ctx)
1564 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001565 if c.sabi != nil {
1566 c.sabi.begin(ctx)
1567 }
Justin Yun8effde42017-06-23 19:24:43 +09001568 if c.vndkdep != nil {
1569 c.vndkdep.begin(ctx)
1570 }
Stephen Craneba090d12017-05-09 15:44:35 -07001571 if c.lto != nil {
1572 c.lto.begin(ctx)
1573 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001574 if c.pgo != nil {
1575 c.pgo.begin(ctx)
1576 }
Colin Crossca860ac2016-01-04 14:34:37 -08001577 for _, feature := range c.features {
1578 feature.begin(ctx)
1579 }
Dan Albert92fe7402020-07-15 13:33:30 -07001580 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07001581 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001582 if err != nil {
1583 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07001584 c.Properties.Sdk_version = nil
1585 } else {
1586 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001587 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001588 }
Colin Crossca860ac2016-01-04 14:34:37 -08001589}
1590
Colin Cross37047f12016-12-13 17:06:13 -08001591func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07001592 deps := Deps{}
1593
1594 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001595 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001596 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001597 // Add the PGO dependency (the clang_rt.profile runtime library), which
1598 // sometimes depends on symbols from libgcc, before libgcc gets added
1599 // in linkerDeps().
Pirama Arumuga Nainar49b53d52017-10-04 16:47:29 -07001600 if c.pgo != nil {
1601 deps = c.pgo.deps(ctx, deps)
1602 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001603 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001604 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001605 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001606 if c.stl != nil {
1607 deps = c.stl.deps(ctx, deps)
1608 }
Colin Cross16b23492016-01-06 14:41:07 -08001609 if c.sanitize != nil {
1610 deps = c.sanitize.deps(ctx, deps)
1611 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001612 if c.coverage != nil {
1613 deps = c.coverage.deps(ctx, deps)
1614 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001615 if c.sabi != nil {
1616 deps = c.sabi.deps(ctx, deps)
1617 }
Justin Yun8effde42017-06-23 19:24:43 +09001618 if c.vndkdep != nil {
1619 deps = c.vndkdep.deps(ctx, deps)
1620 }
Stephen Craneba090d12017-05-09 15:44:35 -07001621 if c.lto != nil {
1622 deps = c.lto.deps(ctx, deps)
1623 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001624 for _, feature := range c.features {
1625 deps = feature.deps(ctx, deps)
1626 }
1627
Colin Crossb6715442017-10-24 11:13:31 -07001628 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1629 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1630 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
1631 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1632 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
1633 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08001634 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07001635
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001636 for _, lib := range deps.ReexportSharedLibHeaders {
1637 if !inList(lib, deps.SharedLibs) {
1638 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
1639 }
1640 }
1641
1642 for _, lib := range deps.ReexportStaticLibHeaders {
1643 if !inList(lib, deps.StaticLibs) {
1644 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib)
1645 }
1646 }
1647
Colin Cross5950f382016-12-13 12:50:57 -08001648 for _, lib := range deps.ReexportHeaderLibHeaders {
1649 if !inList(lib, deps.HeaderLibs) {
1650 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
1651 }
1652 }
1653
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001654 for _, gen := range deps.ReexportGeneratedHeaders {
1655 if !inList(gen, deps.GeneratedHeaders) {
1656 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
1657 }
1658 }
1659
Colin Crossc99deeb2016-04-11 15:06:20 -07001660 return deps
1661}
1662
Dan Albert7e9d2952016-08-04 13:02:36 -07001663func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08001664 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001665 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001666 moduleContextImpl: moduleContextImpl{
1667 mod: c,
1668 },
1669 }
1670 ctx.ctx = ctx
1671
Colin Crossca860ac2016-01-04 14:34:37 -08001672 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07001673}
1674
Jiyong Park7ed9de32018-10-15 22:25:07 +09001675// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09001676func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001677 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
1678 version := name[sharp+1:]
1679 libname := name[:sharp]
1680 return libname, version
1681 }
1682 return name, ""
1683}
1684
Dan Albert92fe7402020-07-15 13:33:30 -07001685func GetCrtVariations(ctx android.BottomUpMutatorContext,
1686 m LinkableInterface) []blueprint.Variation {
1687 if ctx.Os() != android.Android {
1688 return nil
1689 }
1690 if m.UseSdk() {
1691 return []blueprint.Variation{
1692 {Mutator: "sdk", Variation: "sdk"},
Colin Crossbbc941b2020-09-30 12:27:01 -07001693 {Mutator: "version", Variation: m.SdkVersion()},
Dan Albert92fe7402020-07-15 13:33:30 -07001694 }
1695 }
1696 return []blueprint.Variation{
1697 {Mutator: "sdk", Variation: ""},
1698 }
1699}
1700
Colin Crosse7257d22020-09-24 09:56:18 -07001701func (c *Module) addSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext,
1702 variations []blueprint.Variation, depTag libraryDependencyTag, name, version string, far bool) {
1703
1704 variations = append([]blueprint.Variation(nil), variations...)
1705
Colin Cross3146c5c2020-09-30 15:34:40 -07001706 if version != "" && CanBeOrLinkAgainstVersionVariants(c) {
Colin Crosse7257d22020-09-24 09:56:18 -07001707 // Version is explicitly specified. i.e. libFoo#30
1708 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
1709 depTag.explicitlyVersioned = true
1710 }
Colin Crosse7257d22020-09-24 09:56:18 -07001711
Colin Cross0de8a1e2020-09-18 14:15:30 -07001712 if far {
1713 ctx.AddFarVariationDependencies(variations, depTag, name)
1714 } else {
1715 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07001716 }
1717}
1718
Colin Cross1e676be2016-10-12 14:38:15 -07001719func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09001720 if !c.Enabled() {
1721 return
1722 }
1723
Colin Cross37047f12016-12-13 17:06:13 -08001724 ctx := &depsContext{
1725 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07001726 moduleContextImpl: moduleContextImpl{
1727 mod: c,
1728 },
1729 }
1730 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08001731
Colin Crossc99deeb2016-04-11 15:06:20 -07001732 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001733
Yo Chiang219968c2020-09-22 18:45:04 +08001734 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
1735
Dan Albert914449f2016-06-17 16:45:24 -07001736 variantNdkLibs := []string{}
1737 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07001738 if ctx.Os() == android.Android {
Inseob Kimeec88e12020-01-22 11:11:29 +09001739 // rewriteLibs takes a list of names of shared libraries and scans it for three types
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001740 // of names:
Dan Albert914449f2016-06-17 16:45:24 -07001741 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001742 // 1. Name of an NDK library that refers to a prebuilt module.
1743 // For each of these, it adds the name of the prebuilt module (which will be in
1744 // prebuilts/ndk) to the list of nonvariant libs.
1745 // 2. Name of an NDK library that refers to an ndk_library module.
1746 // For each of these, it adds the name of the ndk_library module to the list of
1747 // variant libs.
1748 // 3. Anything else (so anything that isn't an NDK library).
1749 // It adds these to the nonvariantLibs list.
Dan Albert914449f2016-06-17 16:45:24 -07001750 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001751 // The caller can then know to add the variantLibs dependencies differently from the
1752 // nonvariantLibs
Inseob Kim9516ee92019-05-09 10:56:13 +09001753
Inseob Kim9516ee92019-05-09 10:56:13 +09001754 vendorPublicLibraries := vendorPublicLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001755 vendorSnapshotSharedLibs := vendorSnapshotSharedLibs(actx.Config())
1756
1757 rewriteVendorLibs := func(lib string) string {
1758 if isLlndkLibrary(lib, ctx.Config()) {
1759 return lib + llndkLibrarySuffix
1760 }
1761
1762 // only modules with BOARD_VNDK_VERSION uses snapshot.
1763 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1764 return lib
1765 }
1766
1767 if snapshot, ok := vendorSnapshotSharedLibs.get(lib, actx.Arch().ArchType); ok {
1768 return snapshot
1769 }
1770
1771 return lib
1772 }
1773
1774 rewriteLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001775 variantLibs = []string{}
1776 nonvariantLibs = []string{}
Dan Albert914449f2016-06-17 16:45:24 -07001777 for _, entry := range list {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001778 // strip #version suffix out
Jiyong Park73c54ee2019-10-22 20:31:18 +09001779 name, _ := StubsLibNameAndVersion(entry)
Dan Albertde5aade2020-06-30 12:32:51 -07001780 if ctx.useSdk() && inList(name, ndkKnownLibs) {
1781 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Inseob Kimeec88e12020-01-22 11:11:29 +09001782 } else if ctx.useVndk() {
1783 nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
Inseob Kim9516ee92019-05-09 10:56:13 +09001784 } else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, *vendorPublicLibraries) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001785 vendorPublicLib := name + vendorPublicLibrarySuffix
Jiyong Park374510b2018-03-19 18:23:01 +09001786 if actx.OtherModuleExists(vendorPublicLib) {
1787 nonvariantLibs = append(nonvariantLibs, vendorPublicLib)
1788 } else {
1789 // This can happen if vendor_public_library module is defined in a
1790 // namespace that isn't visible to the current module. In that case,
1791 // link to the original library.
Jiyong Park7ed9de32018-10-15 22:25:07 +09001792 nonvariantLibs = append(nonvariantLibs, name)
Jiyong Park374510b2018-03-19 18:23:01 +09001793 }
Dan Albert914449f2016-06-17 16:45:24 -07001794 } else {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001795 // put name#version back
Dan Willemsen7cbf5f82017-03-28 00:08:30 -07001796 nonvariantLibs = append(nonvariantLibs, entry)
Dan Willemsen72d39932016-07-08 23:23:48 -07001797 }
1798 }
Dan Albert914449f2016-06-17 16:45:24 -07001799 return nonvariantLibs, variantLibs
Dan Willemsen72d39932016-07-08 23:23:48 -07001800 }
1801
Inseob Kimeec88e12020-01-22 11:11:29 +09001802 deps.SharedLibs, variantNdkLibs = rewriteLibs(deps.SharedLibs)
1803 deps.LateSharedLibs, variantLateNdkLibs = rewriteLibs(deps.LateSharedLibs)
1804 deps.ReexportSharedLibHeaders, _ = rewriteLibs(deps.ReexportSharedLibHeaders)
1805 if ctx.useVndk() {
1806 for idx, lib := range deps.RuntimeLibs {
1807 deps.RuntimeLibs[idx] = rewriteVendorLibs(lib)
1808 }
1809 }
Dan Willemsen72d39932016-07-08 23:23:48 -07001810 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001811
Jiyong Park7e636d02019-01-28 16:16:54 +09001812 buildStubs := false
Colin Crossc88c2722020-09-28 17:32:47 -07001813 if versioned, ok := c.linker.(versionedInterface); ok {
1814 if versioned.buildStubs() {
1815 buildStubs = true
Colin Crossd48fe732020-09-23 20:37:24 -07001816 }
Jiyong Park7ed9de32018-10-15 22:25:07 +09001817 }
1818
Inseob Kimeec88e12020-01-22 11:11:29 +09001819 rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string {
1820 // only modules with BOARD_VNDK_VERSION uses snapshot.
1821 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1822 return lib
1823 }
1824
1825 if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
1826 return snapshot
1827 }
1828
1829 return lib
1830 }
1831
1832 vendorSnapshotHeaderLibs := vendorSnapshotHeaderLibs(actx.Config())
Colin Cross32ec36c2016-12-15 07:39:51 -08001833 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001834 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08001835 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001836 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08001837 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001838
1839 lib = rewriteSnapshotLibs(lib, vendorSnapshotHeaderLibs)
1840
Jiyong Park7e636d02019-01-28 16:16:54 +09001841 if buildStubs {
Colin Cross7228ecd2019-11-18 16:00:16 -08001842 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07001843 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09001844 } else {
1845 actx.AddVariationDependencies(nil, depTag, lib)
1846 }
1847 }
1848
1849 if buildStubs {
1850 // Stubs lib does not have dependency to other static/shared libraries.
1851 // Don't proceed.
1852 return
Colin Cross32ec36c2016-12-15 07:39:51 -08001853 }
Colin Cross5950f382016-12-13 12:50:57 -08001854
Inseob Kimc0907f12019-02-08 21:00:45 +09001855 syspropImplLibraries := syspropImplLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001856 vendorSnapshotStaticLibs := vendorSnapshotStaticLibs(actx.Config())
Inseob Kimc0907f12019-02-08 21:00:45 +09001857
Jiyong Park5d1598f2019-02-25 22:14:17 +09001858 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001859 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09001860 if impl, ok := syspropImplLibraries[lib]; ok {
1861 lib = impl
1862 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001863
1864 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1865
Jiyong Park5d1598f2019-02-25 22:14:17 +09001866 actx.AddVariationDependencies([]blueprint.Variation{
1867 {Mutator: "link", Variation: "static"},
1868 }, depTag, lib)
1869 }
1870
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001871 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001872 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001873 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001874 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001875 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001876
1877 if impl, ok := syspropImplLibraries[lib]; ok {
1878 lib = impl
1879 }
1880
Inseob Kimeec88e12020-01-22 11:11:29 +09001881 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1882
Dan Willemsen59339a22018-07-22 21:18:45 -07001883 actx.AddVariationDependencies([]blueprint.Variation{
1884 {Mutator: "link", Variation: "static"},
1885 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001886 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001887
Jooyung Han75568392020-03-20 04:29:24 +09001888 // staticUnwinderDep is treated as staticDep for Q apexes
1889 // so that native libraries/binaries are linked with static unwinder
1890 // because Q libc doesn't have unwinder APIs
1891 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07001892 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001893 actx.AddVariationDependencies([]blueprint.Variation{
1894 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001895 }, depTag, rewriteSnapshotLibs(staticUnwinder(actx), vendorSnapshotStaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001896 }
1897
Inseob Kimeec88e12020-01-22 11:11:29 +09001898 for _, lib := range deps.LateStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001899 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Inseob Kimeec88e12020-01-22 11:11:29 +09001900 actx.AddVariationDependencies([]blueprint.Variation{
1901 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001902 }, depTag, rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs))
Inseob Kimeec88e12020-01-22 11:11:29 +09001903 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001904
Jiyong Park7ed9de32018-10-15 22:25:07 +09001905 // shared lib names without the #version suffix
1906 var sharedLibNames []string
1907
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001908 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001909 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001910 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001911 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001912 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001913
1914 if impl, ok := syspropImplLibraries[lib]; ok {
1915 lib = impl
1916 }
1917
Jiyong Park73c54ee2019-10-22 20:31:18 +09001918 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09001919 sharedLibNames = append(sharedLibNames, name)
1920
Colin Crosse7257d22020-09-24 09:56:18 -07001921 variations := []blueprint.Variation{
1922 {Mutator: "link", Variation: "shared"},
1923 }
1924 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001925 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001926
Jiyong Park7ed9de32018-10-15 22:25:07 +09001927 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09001928 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001929 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
1930 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
1931 // linking against both the stubs lib and the non-stubs lib at the same time.
1932 continue
1933 }
Colin Cross6e511a92020-07-27 21:26:48 -07001934 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07001935 variations := []blueprint.Variation{
1936 {Mutator: "link", Variation: "shared"},
1937 }
1938 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09001939 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001940
Dan Willemsen59339a22018-07-22 21:18:45 -07001941 actx.AddVariationDependencies([]blueprint.Variation{
1942 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04001943 }, dataLibDepTag, deps.DataLibs...)
1944
1945 actx.AddVariationDependencies([]blueprint.Variation{
1946 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07001947 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08001948
Colin Cross68861832016-07-08 10:41:41 -07001949 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001950
1951 for _, gen := range deps.GeneratedHeaders {
1952 depTag := genHeaderDepTag
1953 if inList(gen, deps.ReexportGeneratedHeaders) {
1954 depTag = genHeaderExportDepTag
1955 }
1956 actx.AddDependency(c, depTag, gen)
1957 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07001958
Inseob Kim1042d292020-06-01 23:23:05 +09001959 vendorSnapshotObjects := vendorSnapshotObjects(actx.Config())
1960
Dan Albert92fe7402020-07-15 13:33:30 -07001961 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07001962 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc99deeb2016-04-11 15:06:20 -07001963 if deps.CrtBegin != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07001964 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
1965 rewriteSnapshotLibs(deps.CrtBegin, vendorSnapshotObjects))
Colin Crossca860ac2016-01-04 14:34:37 -08001966 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001967 if deps.CrtEnd != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07001968 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
1969 rewriteSnapshotLibs(deps.CrtEnd, vendorSnapshotObjects))
Colin Cross21b9a242015-03-24 14:15:58 -07001970 }
Dan Willemsena0790e32018-10-12 00:24:23 -07001971 if deps.LinkerFlagsFile != "" {
1972 actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
1973 }
1974 if deps.DynamicLinker != "" {
1975 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07001976 }
Dan Albert914449f2016-06-17 16:45:24 -07001977
1978 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07001979
1980 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07001981 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07001982 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07001983 {Mutator: "link", Variation: "shared"},
1984 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07001985
1986 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07001987 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07001988 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07001989 {Mutator: "link", Variation: "shared"},
1990 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08001991
1992 if vndkdep := c.vndkdep; vndkdep != nil {
1993 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08001994 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08001995 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07001996 {Mutator: "link", Variation: "shared"},
1997 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08001998 }
1999 }
Colin Cross6362e272015-10-29 15:25:03 -07002000}
Colin Cross21b9a242015-03-24 14:15:58 -07002001
Colin Crosse40b4ea2018-10-02 22:25:58 -07002002func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002003 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2004 c.beginMutator(ctx)
2005 }
2006}
2007
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002008// Whether a module can link to another module, taking into
2009// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002010func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002011 tag blueprint.DependencyTag) {
2012
2013 switch t := tag.(type) {
2014 case dependencyTag:
2015 if t != vndkExtDepTag {
2016 return
2017 }
2018 case libraryDependencyTag:
2019 default:
2020 return
2021 }
2022
Ivan Lozano52767be2019-10-18 14:49:46 -07002023 if from.Module().Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002024 // Host code is not restricted
2025 return
2026 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002027
2028 // VNDK is cc.Module supported only for now.
2029 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002030 // Though allowed dependency is limited by the image mutator,
2031 // each vendor and product module needs to check link-type
2032 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002033 if ccTo, ok := to.(*Module); ok {
2034 if ccFrom.vndkdep != nil {
2035 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2036 }
2037 } else {
2038 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002039 }
2040 return
2041 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002042 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002043 // Platform code can link to anything
2044 return
2045 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002046 if from.InRamdisk() {
2047 // Ramdisk code is not NDK
2048 return
2049 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002050 if from.InVendorRamdisk() {
2051 // Vendor ramdisk code is not NDK
2052 return
2053 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002054 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002055 // Recovery code is not NDK
2056 return
2057 }
Colin Cross31076b32020-10-23 17:22:06 -07002058 if c, ok := to.(*Module); ok {
2059 if c.ToolchainLibrary() {
2060 // These are always allowed
2061 return
2062 }
2063 if c.NdkPrebuiltStl() {
2064 // These are allowed, but they don't set sdk_version
2065 return
2066 }
2067 if c.StubDecorator() {
2068 // These aren't real libraries, but are the stub shared libraries that are included in
2069 // the NDK.
2070 return
2071 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002072 }
Logan Chien834b9a62019-01-14 15:39:03 +08002073
Ivan Lozano52767be2019-10-18 14:49:46 -07002074 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002075 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2076 // to link to libc++ (non-NDK and without sdk_version).
2077 return
2078 }
2079
Ivan Lozano52767be2019-10-18 14:49:46 -07002080 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002081 // NDK code linking to platform code is never okay.
2082 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002083 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002084 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002085 }
2086
2087 // At this point we know we have two NDK libraries, but we need to
2088 // check that we're not linking against anything built against a higher
2089 // API level, as it is only valid to link against older or equivalent
2090 // APIs.
2091
Inseob Kim01a28722018-04-11 09:48:45 +09002092 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002093 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002094 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002095 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002096 // Current can't be linked against by anything else.
2097 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002098 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002099 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002100 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002101 if err != nil {
2102 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002103 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002104 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002105 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002106 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002107 if err != nil {
2108 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002109 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002110 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002111 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002112
Inseob Kim01a28722018-04-11 09:48:45 +09002113 if toApi > fromApi {
2114 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002115 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002116 }
2117 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002118 }
Dan Albert202fe492017-12-15 13:56:59 -08002119
2120 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002121 fromStl := from.SelectedStl()
2122 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002123 if fromStl == "" || toStl == "" {
2124 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002125 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002126 // We can be permissive with the system "STL" since it is only the C++
2127 // ABI layer, but in the future we should make sure that everyone is
2128 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002129 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002130 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002131 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2132 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002133 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002134}
2135
Jooyung Han479ca172020-10-19 18:51:07 +09002136func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2137 if c, ok := ctx.Module().(*Module); ok {
2138 ctx.VisitDirectDeps(func(dep android.Module) {
2139 depTag := ctx.OtherModuleDependencyTag(dep)
2140 ccDep, ok := dep.(LinkableInterface)
2141 if ok {
2142 checkLinkType(ctx, c, ccDep, depTag)
2143 }
2144 })
2145 }
2146}
2147
Jiyong Park5fb8c102018-04-09 12:03:06 +09002148// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002149// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2150// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002151// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002152func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2153 check := func(child, parent android.Module) bool {
2154 to, ok := child.(*Module)
2155 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002156 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002157 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002158
Jooyung Hana70f0672019-01-18 15:20:43 +09002159 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2160 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002161 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002162
Justin Yun63e9ec72020-10-29 16:49:43 +09002163 // Even if target lib has no vendor variant, keep checking dependency
2164 // graph in case it depends on vendor_available or product_available
2165 // but not double_loadable transtively.
2166 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002167 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002168 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002169
Jooyung Han0302a842019-10-30 18:43:49 +09002170 if to.isVndkSp() || to.isLlndk(ctx.Config()) || Bool(to.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002171 return false
2172 }
2173
2174 var stringPath []string
2175 for _, m := range ctx.GetWalkPath() {
2176 stringPath = append(stringPath, m.Name())
2177 }
2178 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2179 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
2180 "(dependency: %s)", ctx.OtherModuleName(to), strings.Join(stringPath, " -> "))
2181 return false
2182 }
2183 if module, ok := ctx.Module().(*Module); ok {
2184 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jooyung Han0302a842019-10-30 18:43:49 +09002185 if module.isLlndk(ctx.Config()) || Bool(module.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002186 ctx.WalkDeps(check)
2187 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002188 }
2189 }
2190}
2191
Colin Cross0de8a1e2020-09-18 14:15:30 -07002192// Returns the highest version which is <= maxSdkVersion.
2193// For example, with maxSdkVersion is 10 and versionList is [9,11]
2194// it returns 9 as string. The list of stubs must be in order from
2195// oldest to newest.
2196func (c *Module) chooseSdkVersion(ctx android.PathContext, stubsInfo []SharedLibraryStubsInfo,
2197 maxSdkVersion android.ApiLevel) (SharedLibraryStubsInfo, error) {
2198
2199 for i := range stubsInfo {
2200 stubInfo := stubsInfo[len(stubsInfo)-i-1]
2201 var ver android.ApiLevel
2202 if stubInfo.Version == "" {
2203 ver = android.FutureApiLevel
2204 } else {
2205 var err error
2206 ver, err = android.ApiLevelFromUser(ctx, stubInfo.Version)
2207 if err != nil {
2208 return SharedLibraryStubsInfo{}, err
2209 }
2210 }
2211 if ver.LessThanOrEqualTo(maxSdkVersion) {
2212 return stubInfo, nil
2213 }
2214 }
2215 var versionList []string
2216 for _, stubInfo := range stubsInfo {
2217 versionList = append(versionList, stubInfo.Version)
2218 }
2219 return SharedLibraryStubsInfo{}, fmt.Errorf("not found a version(<=%s) in versionList: %v", maxSdkVersion.String(), versionList)
2220}
2221
Colin Crossc99deeb2016-04-11 15:06:20 -07002222// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002223func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002224 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002225
Colin Cross0de8a1e2020-09-18 14:15:30 -07002226 var directStaticDeps []StaticLibraryInfo
2227 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002228
Colin Cross0de8a1e2020-09-18 14:15:30 -07002229 reexportExporter := func(exporter FlagExporterInfo) {
2230 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2231 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2232 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2233 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2234 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002235 }
2236
Jooyung Hande34d232020-07-23 13:04:15 +09002237 // For the dependency from platform to apex, use the latest stubs
2238 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002239 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2240 if !apexInfo.IsForPlatform() {
2241 c.apexSdkVersion = apexInfo.MinSdkVersion(ctx)
Jooyung Hande34d232020-07-23 13:04:15 +09002242 }
2243
2244 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2245 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2246 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2247 // (b/144430859)
2248 c.apexSdkVersion = android.FutureApiLevel
2249 }
2250
Colin Crossd11fcda2017-10-23 17:59:01 -07002251 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002252 depName := ctx.OtherModuleName(dep)
2253 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002254
Ivan Lozano52767be2019-10-18 14:49:46 -07002255 ccDep, ok := dep.(LinkableInterface)
2256 if !ok {
2257
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002258 // handling for a few module types that aren't cc Module but that are also supported
2259 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002260 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002261 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002262 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2263 genRule.GeneratedSourceFiles()...)
2264 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002265 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002266 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002267 // Support exported headers from a generated_sources dependency
2268 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002269 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002270 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002271 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002272 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002273 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002274 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002275 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002276 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002277 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2278 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002279 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002280 // 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 +09002281 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002282
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002283 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002284 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002285 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002286 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002287 case linkerFlagsDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002288 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002289 files := genRule.GeneratedSourceFiles()
2290 if len(files) == 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002291 depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002292 } else if len(files) > 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002293 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 -07002294 }
2295 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002296 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002297 }
Colin Crossca860ac2016-01-04 14:34:37 -08002298 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002299 return
2300 }
2301
Colin Crossfe17f6f2019-03-28 19:30:56 -07002302 if depTag == android.ProtoPluginDepTag {
2303 return
2304 }
Jooyung Han61b66e92020-03-21 14:21:46 +00002305 if depTag == llndkImplDep {
2306 return
2307 }
Colin Crossfe17f6f2019-03-28 19:30:56 -07002308
Colin Crossd11fcda2017-10-23 17:59:01 -07002309 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002310 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2311 return
2312 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002313 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002314 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2315 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002316 return
2317 }
2318
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002319 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07002320 // Skip reused objects for stub libraries, they use their own stub object file instead.
2321 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
2322 // version mutator, so the stubs variant is created from the shared variant that
2323 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07002324 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07002325 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2326 objs := staticAnalogue.ReuseObjects
2327 depPaths.Objs = depPaths.Objs.Append(objs)
2328 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2329 reexportExporter(depExporterInfo)
2330 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002331 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002332 }
2333
Colin Cross6e511a92020-07-27 21:26:48 -07002334 linkFile := ccDep.OutputFile()
2335
2336 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2337 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002338 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002339 return
2340 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002341
Colin Cross0de8a1e2020-09-18 14:15:30 -07002342 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002343
Colin Cross6e511a92020-07-27 21:26:48 -07002344 var ptr *android.Paths
2345 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002346
Colin Cross6e511a92020-07-27 21:26:48 -07002347 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002348
Colin Cross6e511a92020-07-27 21:26:48 -07002349 switch {
2350 case libDepTag.header():
2351 // nothing
2352 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002353 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2354 if !ctx.Config().AllowMissingDependencies() {
2355 ctx.ModuleErrorf("module %q is not a shared library", depName)
2356 } else {
2357 ctx.AddMissingDependencies([]string{depName})
2358 }
2359 return
2360 }
2361 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
2362 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryImplementationStubsInfoProvider).(SharedLibraryImplementationStubsInfo)
2363
2364 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedLibraryStubsInfos) > 0 {
2365 useStubs := false
Colin Cross31076b32020-10-23 17:22:06 -07002366
2367 if lib := moduleLibraryInterface(dep); lib.buildStubs() && c.UseVndk() { // LLNDK
Colin Cross0de8a1e2020-09-18 14:15:30 -07002368 if !apexInfo.IsForPlatform() {
2369 // For platform libraries, use current version of LLNDK
2370 // If this is for use_vendor apex we will apply the same rules
2371 // of apex sdk enforcement below to choose right version.
2372 useStubs = true
2373 }
2374 } else if apexInfo.IsForPlatform() {
2375 // If not building for APEX, use stubs only when it is from
2376 // an APEX (and not from platform)
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002377 // However, for host, ramdisk, vendor_ramdisk, recovery or bootstrap modules,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002378 // always link to non-stub variant
2379 useStubs = dep.(android.ApexModule).AnyVariantDirectlyInAnyApex() && !c.bootstrap()
2380 // Another exception: if this module is bundled with an APEX, then
2381 // it is linked with the non-stub variant of a module in the APEX
2382 // as if this is part of the APEX.
2383 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
2384 for _, apexContents := range testFor.ApexContents {
2385 if apexContents.DirectlyInApex(depName) {
2386 useStubs = false
2387 break
2388 }
2389 }
2390 } else {
2391 // If building for APEX, use stubs when the parent is in any APEX that
2392 // the child is not in.
2393 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
2394 }
2395
2396 // when to use (unspecified) stubs, check min_sdk_version and choose the right one
2397 if useStubs {
2398 sharedLibraryStubsInfo, err :=
2399 c.chooseSdkVersion(ctx, sharedLibraryStubsInfo.SharedLibraryStubsInfos, c.apexSdkVersion)
2400 if err != nil {
2401 ctx.OtherModuleErrorf(dep, err.Error())
2402 return
2403 }
2404 sharedLibraryInfo = sharedLibraryStubsInfo.SharedLibraryInfo
2405 depExporterInfo = sharedLibraryStubsInfo.FlagExporterInfo
2406 }
2407 }
2408
2409 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2410 depFile = sharedLibraryInfo.TableOfContents
2411
Colin Cross6e511a92020-07-27 21:26:48 -07002412 ptr = &depPaths.SharedLibs
2413 switch libDepTag.Order {
2414 case earlyLibraryDependency:
2415 ptr = &depPaths.EarlySharedLibs
2416 depPtr = &depPaths.EarlySharedLibsDeps
2417 case normalLibraryDependency:
2418 ptr = &depPaths.SharedLibs
2419 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002420 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002421 case lateLibraryDependency:
2422 ptr = &depPaths.LateSharedLibs
2423 depPtr = &depPaths.LateSharedLibsDeps
2424 default:
2425 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002426 }
Colin Cross6e511a92020-07-27 21:26:48 -07002427 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002428 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2429 if !ctx.Config().AllowMissingDependencies() {
2430 ctx.ModuleErrorf("module %q is not a static library", depName)
2431 } else {
2432 ctx.AddMissingDependencies([]string{depName})
2433 }
2434 return
2435 }
2436 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2437 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002438 if libDepTag.wholeStatic {
2439 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002440 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2441 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002442 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002443 // This case normally catches prebuilt static
2444 // libraries, but it can also occur when
2445 // AllowMissingDependencies is on and the
2446 // dependencies has no sources of its own
2447 // but has a whole_static_libs dependency
2448 // on a missing library. We want to depend
2449 // on the .a file so that there is something
2450 // in the dependency tree that contains the
2451 // error rule for the missing transitive
2452 // dependency.
2453 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002454 }
Colin Cross6e511a92020-07-27 21:26:48 -07002455 } else {
2456 switch libDepTag.Order {
2457 case earlyLibraryDependency:
2458 panic(fmt.Errorf("early static libs not suppported"))
2459 case normalLibraryDependency:
2460 // static dependencies will be handled separately so they can be ordered
2461 // using transitive dependencies.
2462 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002463 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002464 case lateLibraryDependency:
2465 ptr = &depPaths.LateStaticLibs
2466 default:
2467 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002468 }
2469 }
2470 }
2471
Colin Cross6e511a92020-07-27 21:26:48 -07002472 if libDepTag.static() && !libDepTag.wholeStatic {
2473 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2474 ctx.ModuleErrorf("module %q not a static library", depName)
2475 return
2476 }
Logan Chien43d34c32017-12-20 01:17:32 +08002477
Colin Cross6e511a92020-07-27 21:26:48 -07002478 // When combining coverage files for shared libraries and executables, coverage files
2479 // in static libraries act as if they were whole static libraries. The same goes for
2480 // source based Abi dump files.
2481 if c, ok := ccDep.(*Module); ok {
2482 staticLib := c.linker.(libraryInterface)
2483 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2484 staticLib.objs().coverageFiles...)
2485 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2486 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002487 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002488 // Handle non-CC modules here
2489 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002490 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002491 }
2492 }
2493
Colin Cross6e511a92020-07-27 21:26:48 -07002494 if ptr != nil {
2495 if !linkFile.Valid() {
2496 if !ctx.Config().AllowMissingDependencies() {
2497 ctx.ModuleErrorf("module %q missing output file", depName)
2498 } else {
2499 ctx.AddMissingDependencies([]string{depName})
2500 }
2501 return
2502 }
2503 *ptr = append(*ptr, linkFile.Path())
2504 }
2505
2506 if depPtr != nil {
2507 dep := depFile
2508 if !dep.Valid() {
2509 dep = linkFile
2510 }
2511 *depPtr = append(*depPtr, dep.Path())
2512 }
2513
Colin Cross0de8a1e2020-09-18 14:15:30 -07002514 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2515 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2516 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2517 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2518
2519 if libDepTag.reexportFlags {
2520 reexportExporter(depExporterInfo)
2521 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2522 // Re-exported shared library headers must be included as well since they can help us with type information
2523 // about template instantiations (instantiated from their headers).
2524 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2525 // scripts.
2526 c.sabi.Properties.ReexportedIncludes = append(
2527 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2528 }
2529
Colin Cross6e511a92020-07-27 21:26:48 -07002530 makeLibName := c.makeLibName(ctx, ccDep, depName) + libDepTag.makeSuffix
2531 switch {
2532 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002533 c.Properties.AndroidMkHeaderLibs = append(
2534 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002535 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07002536 if lib := moduleLibraryInterface(dep); lib != nil {
2537 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002538 // Add the dependency to the APEX(es) providing the library so that
2539 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002540 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
2541 for _, an := range depApexInfo.InApexes {
Colin Cross6e511a92020-07-27 21:26:48 -07002542 c.Properties.ApexesProvidingSharedLibs = append(
2543 c.Properties.ApexesProvidingSharedLibs, an)
2544 }
2545 }
2546 }
2547
2548 // Note: the order of libs in this list is not important because
2549 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002550 c.Properties.AndroidMkSharedLibs = append(
2551 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002552 // Record baseLibName for snapshots.
2553 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, baseLibName(depName))
2554 case libDepTag.static():
2555 if libDepTag.wholeStatic {
2556 c.Properties.AndroidMkWholeStaticLibs = append(
2557 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2558 } else {
2559 c.Properties.AndroidMkStaticLibs = append(
2560 c.Properties.AndroidMkStaticLibs, makeLibName)
2561 }
2562 }
2563 } else {
2564 switch depTag {
2565 case runtimeDepTag:
2566 c.Properties.AndroidMkRuntimeLibs = append(
2567 c.Properties.AndroidMkRuntimeLibs, c.makeLibName(ctx, ccDep, depName)+libDepTag.makeSuffix)
2568 // Record baseLibName for snapshots.
2569 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, baseLibName(depName))
2570 case objDepTag:
2571 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2572 case CrtBeginDepTag:
2573 depPaths.CrtBegin = linkFile
2574 case CrtEndDepTag:
2575 depPaths.CrtEnd = linkFile
2576 case dynamicLinkerDepTag:
2577 depPaths.DynamicLinker = linkFile
2578 }
Jiyong Park27b188b2017-07-18 13:23:39 +09002579 }
Colin Crossca860ac2016-01-04 14:34:37 -08002580 })
2581
Jeff Gaston294356f2017-09-27 17:05:30 -07002582 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07002583 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
2584 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
2585 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07002586
Colin Crossdd84e052017-05-17 13:44:16 -07002587 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07002588 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09002589 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
2590 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09002591 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09002592 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
2593 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07002594 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09002595 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09002596 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002597
2598 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09002599 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002600 }
Colin Crossdd84e052017-05-17 13:44:16 -07002601
Colin Crossca860ac2016-01-04 14:34:37 -08002602 return depPaths
2603}
2604
Colin Cross0de8a1e2020-09-18 14:15:30 -07002605// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
2606// to match the topological order of the dependency tree, including any static analogues of
2607// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
2608// of the transitive dependencies.
2609func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
2610 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
2611 var staticPaths android.Paths
2612 for _, staticDep := range staticDeps {
2613 staticPaths = append(staticPaths, staticDep.StaticLibrary)
2614 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
2615 }
2616 for _, sharedDep := range sharedDeps {
2617 if sharedDep.StaticAnalogue != nil {
2618 transitiveStaticLibsBuilder.Transitive(sharedDep.StaticAnalogue.TransitiveStaticLibrariesForOrdering)
2619 }
2620 }
2621 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
2622
2623 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
2624
2625 // reorder the dependencies based on transitive dependencies
2626 staticPaths = android.FirstUniquePaths(staticPaths)
2627 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
2628
2629 if len(orderedStaticPaths) != len(staticPaths) {
2630 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
2631 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
2632 }
2633
2634 return orderedStaticPaths, transitiveStaticLibs
2635}
2636
Colin Cross6e511a92020-07-27 21:26:48 -07002637// baseLibName trims known prefixes and suffixes
2638func baseLibName(depName string) string {
2639 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
2640 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
2641 libName = strings.TrimPrefix(libName, "prebuilt_")
2642 return libName
2643}
2644
2645func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, depName string) string {
2646 vendorSuffixModules := vendorSuffixModules(ctx.Config())
2647 vendorPublicLibraries := vendorPublicLibraries(ctx.Config())
2648
2649 libName := baseLibName(depName)
2650 isLLndk := isLlndkLibrary(libName, ctx.Config())
2651 isVendorPublicLib := inList(libName, *vendorPublicLibraries)
2652 bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk
2653
2654 if c, ok := ccDep.(*Module); ok {
2655 // Use base module name for snapshots when exporting to Makefile.
2656 if c.isSnapshotPrebuilt() {
2657 baseName := c.BaseModuleName()
2658
2659 if c.IsVndk() {
2660 return baseName + ".vendor"
2661 }
2662
2663 if vendorSuffixModules[baseName] {
2664 return baseName + ".vendor"
2665 } else {
2666 return baseName
2667 }
2668 }
2669 }
2670
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002671 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
2672 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07002673 // The vendor module is a no-vendor-variant VNDK library. Depend on the
2674 // core module instead.
2675 return libName
2676 } else if c.UseVndk() && bothVendorAndCoreVariantsExist {
2677 // The vendor module in Make will have been renamed to not conflict with the core
2678 // module, so update the dependency name here accordingly.
2679 return libName + c.getNameSuffixWithVndkVersion(ctx)
2680 } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
2681 return libName + vendorPublicLibrarySuffix
2682 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
2683 return libName + ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002684 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
2685 return libName + vendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07002686 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
2687 return libName + recoverySuffix
2688 } else if ccDep.Module().Target().NativeBridge == android.NativeBridgeEnabled {
2689 return libName + nativeBridgeSuffix
2690 } else {
2691 return libName
2692 }
2693}
2694
Colin Crossca860ac2016-01-04 14:34:37 -08002695func (c *Module) InstallInData() bool {
2696 if c.installer == nil {
2697 return false
2698 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002699 return c.installer.inData()
2700}
2701
2702func (c *Module) InstallInSanitizerDir() bool {
2703 if c.installer == nil {
2704 return false
2705 }
2706 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07002707 return true
2708 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002709 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08002710}
2711
Yifan Hong1b3348d2020-01-21 15:53:22 -08002712func (c *Module) InstallInRamdisk() bool {
2713 return c.InRamdisk()
2714}
2715
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002716func (c *Module) InstallInVendorRamdisk() bool {
2717 return c.InVendorRamdisk()
2718}
2719
Jiyong Parkf9332f12018-02-01 00:54:12 +09002720func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07002721 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002722}
2723
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002724func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002725 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002726 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002727 return
2728 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002729 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002730}
2731
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07002732func (c *Module) HostToolPath() android.OptionalPath {
2733 if c.installer == nil {
2734 return android.OptionalPath{}
2735 }
2736 return c.installer.hostToolPath()
2737}
2738
Nan Zhangd4e641b2017-07-12 12:55:28 -07002739func (c *Module) IntermPathForModuleOut() android.OptionalPath {
2740 return c.outputFile
2741}
2742
Colin Cross41955e82019-05-29 14:40:35 -07002743func (c *Module) OutputFiles(tag string) (android.Paths, error) {
2744 switch tag {
2745 case "":
2746 if c.outputFile.Valid() {
2747 return android.Paths{c.outputFile.Path()}, nil
2748 }
2749 return android.Paths{}, nil
2750 default:
2751 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002752 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002753}
2754
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00002755func (c *Module) static() bool {
2756 if static, ok := c.linker.(interface {
2757 static() bool
2758 }); ok {
2759 return static.static()
2760 }
2761 return false
2762}
2763
Jiyong Park379de2f2018-12-19 02:47:14 +09002764func (c *Module) staticBinary() bool {
2765 if static, ok := c.linker.(interface {
2766 staticBinary() bool
2767 }); ok {
2768 return static.staticBinary()
2769 }
2770 return false
2771}
2772
Jiyong Park1d1119f2019-07-29 21:27:18 +09002773func (c *Module) header() bool {
2774 if h, ok := c.linker.(interface {
2775 header() bool
2776 }); ok {
2777 return h.header()
2778 }
2779 return false
2780}
2781
Inseob Kim7f283f42020-06-01 21:53:49 +09002782func (c *Module) binary() bool {
2783 if b, ok := c.linker.(interface {
2784 binary() bool
2785 }); ok {
2786 return b.binary()
2787 }
2788 return false
2789}
2790
Inseob Kim1042d292020-06-01 23:23:05 +09002791func (c *Module) object() bool {
2792 if o, ok := c.linker.(interface {
2793 object() bool
2794 }); ok {
2795 return o.object()
2796 }
2797 return false
2798}
2799
Jooyung Han38002912019-05-16 04:01:54 +09002800func (c *Module) getMakeLinkType(actx android.ModuleContext) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07002801 if c.UseVndk() {
Jooyung Han38002912019-05-16 04:01:54 +09002802 if lib, ok := c.linker.(*llndkStubDecorator); ok {
2803 if Bool(lib.Properties.Vendor_available) {
Colin Crossb60190a2018-09-04 16:28:17 -07002804 return "native:vndk"
2805 }
Jooyung Han38002912019-05-16 04:01:54 +09002806 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07002807 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002808 if c.IsVndk() && !c.isVndkExt() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002809 // Product_available, if defined, must have the same value with Vendor_available.
Jooyung Han38002912019-05-16 04:01:54 +09002810 if Bool(c.VendorProperties.Vendor_available) {
2811 return "native:vndk"
2812 }
2813 return "native:vndk_private"
2814 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09002815 if c.inProduct() {
2816 return "native:product"
2817 }
Jooyung Han38002912019-05-16 04:01:54 +09002818 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08002819 } else if c.InRamdisk() {
2820 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002821 } else if c.InVendorRamdisk() {
2822 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07002823 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07002824 return "native:recovery"
2825 } else if c.Target().Os == android.Android && String(c.Properties.Sdk_version) != "" {
2826 return "native:ndk:none:none"
2827 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
2828 //family, link := getNdkStlFamilyAndLinkType(c)
2829 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07002830 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08002831 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07002832 } else {
2833 return "native:platform"
2834 }
2835}
2836
Jiyong Park9d452992018-10-03 00:38:19 +09002837// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01002838// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09002839func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07002840 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09002841 // Stub libs and prebuilt libs in a versioned SDK are not
2842 // installable to APEX even though they are shared libs.
Colin Cross31076b32020-10-23 17:22:06 -07002843 return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01002844 } else if _, ok := c.linker.(testPerSrc); ok {
2845 return true
Jiyong Park9d452992018-10-03 00:38:19 +09002846 }
2847 return false
2848}
2849
Jiyong Parka90ca002019-10-07 15:47:24 +09002850func (c *Module) AvailableFor(what string) bool {
2851 if linker, ok := c.linker.(interface {
2852 availableFor(string) bool
2853 }); ok {
2854 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
2855 } else {
2856 return c.ApexModuleBase.AvailableFor(what)
2857 }
2858}
2859
Jiyong Park62304bb2020-04-13 16:19:48 +09002860func (c *Module) TestFor() []string {
2861 if test, ok := c.linker.(interface {
2862 testFor() []string
2863 }); ok {
2864 return test.testFor()
2865 } else {
2866 return c.ApexModuleBase.TestFor()
2867 }
2868}
2869
Colin Crossaede88c2020-08-11 12:17:01 -07002870func (c *Module) UniqueApexVariations() bool {
2871 if u, ok := c.compiler.(interface {
2872 uniqueApexVariations() bool
2873 }); ok {
2874 return u.uniqueApexVariations()
2875 } else {
2876 return false
2877 }
2878}
2879
Paul Duffin0cb37b92020-03-04 14:52:46 +00002880// Return true if the module is ever installable.
2881func (c *Module) EverInstallable() bool {
2882 return c.installer != nil &&
2883 // Check to see whether the module is actually ever installable.
2884 c.installer.everInstallable()
2885}
2886
Colin Cross56a83212020-09-15 18:30:11 -07002887func (c *Module) installable(apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00002888 ret := c.EverInstallable() &&
2889 // Check to see whether the module has been configured to not be installed.
2890 proptools.BoolDefault(c.Properties.Installable, true) &&
2891 !c.Properties.PreventInstall && c.outputFile.Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002892
2893 // The platform variant doesn't need further condition. Apex variants however might not
2894 // be installable because it will likely to be included in the APEX and won't appear
2895 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07002896 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002897 return ret
2898 }
2899
2900 // Special case for modules that are configured to be installed to /data, which includes
2901 // test modules. For these modules, both APEX and non-APEX variants are considered as
2902 // installable. This is because even the APEX variants won't be included in the APEX, but
2903 // will anyway be installed to /data/*.
2904 // See b/146995717
2905 if c.InstallInData() {
2906 return ret
2907 }
2908
2909 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09002910}
2911
Logan Chien41eabe62019-04-10 13:33:58 +08002912func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
2913 if c.linker != nil {
2914 if library, ok := c.linker.(*libraryDecorator); ok {
2915 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
2916 }
2917 }
2918}
2919
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002920func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07002921 depTag := ctx.OtherModuleDependencyTag(dep)
2922 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
2923
2924 if cc, ok := dep.(*Module); ok {
2925 if cc.HasStubsVariants() {
2926 if isLibDepTag && libDepTag.shared() {
2927 // dynamic dep to a stubs lib crosses APEX boundary
2928 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09002929 }
Colin Cross6e511a92020-07-27 21:26:48 -07002930 if IsRuntimeDepTag(depTag) {
2931 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09002932 return false
2933 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002934 }
Colin Crossaac32222020-07-29 12:51:56 -07002935 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07002936 // shared_lib dependency from a static lib is considered as crossing
2937 // the APEX boundary because the dependency doesn't actually is
2938 // linked; the dependency is used only during the compilation phase.
2939 return false
2940 }
2941 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002942 if depTag == stubImplDepTag || depTag == llndkImplDep {
2943 // We don't track beyond LLNDK or from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09002944 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002945 }
2946 return true
2947}
2948
Dan Albertc8060532020-07-22 22:32:17 -07002949func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
2950 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09002951 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
2952 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
2953 return nil
2954 }
2955 // b/154569636: set min_sdk_version correctly for toolchain_libraries
2956 if c.ToolchainLibrary() {
2957 return nil
2958 }
2959 // We don't check for prebuilt modules
2960 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
2961 return nil
2962 }
2963 minSdkVersion := c.MinSdkVersion()
2964 if minSdkVersion == "apex_inherit" {
2965 return nil
2966 }
2967 if minSdkVersion == "" {
2968 // JNI libs within APK-in-APEX fall into here
2969 // Those are okay to set sdk_version instead
2970 // We don't have to check if this is a SDK variant because
2971 // non-SDK variant resets sdk_version, which works too.
2972 minSdkVersion = c.SdkVersion()
2973 }
Dan Albertc8060532020-07-22 22:32:17 -07002974 if minSdkVersion == "" {
2975 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
2976 }
2977 // Not using nativeApiLevelFromUser because the context here is not
2978 // necessarily a native context.
2979 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09002980 if err != nil {
2981 return err
2982 }
Dan Albertc8060532020-07-22 22:32:17 -07002983
2984 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09002985 return fmt.Errorf("newer SDK(%v)", ver)
2986 }
2987 return nil
2988}
2989
Colin Cross2ba19d92015-05-07 15:44:20 -07002990//
Colin Crosscfad1192015-11-02 16:43:11 -08002991// Defaults
2992//
Colin Crossca860ac2016-01-04 14:34:37 -08002993type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07002994 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07002995 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09002996 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08002997}
2998
Patrice Arrudac249c712019-03-19 17:00:29 -07002999// cc_defaults provides a set of properties that can be inherited by other cc
3000// modules. A module can use the properties from a cc_defaults using
3001// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3002// merged (when possible) by prepending the default module's values to the
3003// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003004func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003005 return DefaultsFactory()
3006}
3007
Colin Cross36242852017-06-23 15:06:31 -07003008func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003009 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003010
Colin Cross36242852017-06-23 15:06:31 -07003011 module.AddProperties(props...)
3012 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003013 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003014 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003015 &BaseCompilerProperties{},
3016 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003017 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003018 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003019 &StaticProperties{},
3020 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003021 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003022 &BinaryLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003023 &TestProperties{},
3024 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003025 &BenchmarkProperties{},
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -07003026 &FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003027 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003028 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003029 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003030 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003031 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003032 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003033 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003034 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003035 &LTOProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003036 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003037 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003038 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3039 &RustBindgenClangProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003040 )
Colin Crosscfad1192015-11-02 16:43:11 -08003041
Jooyung Hancc372c52019-09-25 15:18:44 +09003042 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003043
3044 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003045}
3046
Jiyong Park2286afd2020-06-16 21:58:53 +09003047func (c *Module) IsSdkVariant() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07003048 return c.Properties.IsSdkVariant || c.AlwaysSdk()
Jiyong Park2286afd2020-06-16 21:58:53 +09003049}
3050
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003051func kytheExtractAllFactory() android.Singleton {
3052 return &kytheExtractAllSingleton{}
3053}
3054
3055type kytheExtractAllSingleton struct {
3056}
3057
3058func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3059 var xrefTargets android.Paths
3060 ctx.VisitAllModules(func(module android.Module) {
3061 if ccModule, ok := module.(xref); ok {
3062 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3063 }
3064 })
3065 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3066 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003067 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003068 }
3069}
3070
Colin Cross06a931b2015-10-28 17:23:31 -07003071var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003072var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003073var BoolPtr = proptools.BoolPtr
3074var String = proptools.String
3075var StringPtr = proptools.StringPtr