blob: 910d6102661229b751faf6a8afd962d281143f67 [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
87 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070088 })
Colin Crossb98c8b02016-07-29 13:44:28 -070089
Sasha Smundak2a4549e2018-11-05 16:49:08 -080090 android.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070091}
92
Colin Crossca860ac2016-01-04 14:34:37 -080093type Deps struct {
94 SharedLibs, LateSharedLibs []string
95 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -080096 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +080097 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -070098
Chris Parsons79d66a52020-06-05 17:26:16 -040099 // Used for data dependencies adjacent to tests
100 DataLibs []string
101
Yo Chiang219968c2020-09-22 18:45:04 +0800102 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
103 SystemSharedLibs []string
104
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800105 StaticUnwinderIfLegacy bool
106
Colin Cross5950f382016-12-13 12:50:57 -0800107 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700108
Colin Cross81413472016-04-11 14:37:39 -0700109 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700110
Dan Willemsenb40aab62016-04-20 14:21:14 -0700111 GeneratedSources []string
112 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900113 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700114
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700115 ReexportGeneratedHeaders []string
116
Colin Cross97ba0732015-03-23 17:50:24 -0700117 CrtBegin, CrtEnd string
Dan Willemsena0790e32018-10-12 00:24:23 -0700118
119 // Used for host bionic
120 LinkerFlagsFile string
121 DynamicLinker string
Colin Crossc472d572015-03-17 15:06:21 -0700122}
123
Colin Crossca860ac2016-01-04 14:34:37 -0800124type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700125 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900126 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700127 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900128 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700129 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700130 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700131
Colin Cross0de8a1e2020-09-18 14:15:30 -0700132 // Transitive static library dependencies of static libraries for use in ordering.
133 TranstiveStaticLibrariesForOrdering *android.DepSet
134
Colin Cross26c34ed2016-09-30 17:10:16 -0700135 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100136 Objs Objects
137 // Paths to .o files in dependencies that provide them. Note that these lists
138 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800139 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700140 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700141
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100142 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
143 // the libs from all whole_static_lib dependencies.
144 WholeStaticLibsFromPrebuilts android.Paths
145
Colin Cross26c34ed2016-09-30 17:10:16 -0700146 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700147 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900148 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700149
Inseob Kimd110f872019-12-06 13:15:38 +0900150 Flags []string
151 IncludeDirs android.Paths
152 SystemIncludeDirs android.Paths
153 ReexportedDirs android.Paths
154 ReexportedSystemDirs android.Paths
155 ReexportedFlags []string
156 ReexportedGeneratedHeaders android.Paths
157 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700158
Colin Cross26c34ed2016-09-30 17:10:16 -0700159 // Paths to crt*.o files
Colin Cross635c3b02016-05-18 15:37:25 -0700160 CrtBegin, CrtEnd android.OptionalPath
Dan Willemsena0790e32018-10-12 00:24:23 -0700161
162 // Path to the file container flags to use with the linker
163 LinkerFlagsFile android.OptionalPath
164
165 // Path to the dynamic linker binary
166 DynamicLinker android.OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700167}
168
Colin Cross4af21ed2019-11-04 09:37:55 -0800169// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
170// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
171// command line so they can be overridden by the local module flags).
172type LocalOrGlobalFlags struct {
173 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700174 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800175 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700176 CFlags []string // Flags that apply to C and C++ source files
177 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
178 ConlyFlags []string // Flags that apply to C source files
179 CppFlags []string // Flags that apply to C++ source files
180 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700181 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800182}
183
184type Flags struct {
185 Local LocalOrGlobalFlags
186 Global LocalOrGlobalFlags
187
188 aidlFlags []string // Flags that apply to aidl source files
189 rsFlags []string // Flags that apply to renderscript source files
190 libFlags []string // Flags to add libraries early to the link order
191 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
192 TidyFlags []string // Flags that apply to clang-tidy
193 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700194
Colin Crossc3199482017-03-30 15:03:04 -0700195 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800196 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700197 SystemIncludeFlags []string
198
Oliver Nguyen04526782020-04-21 12:40:27 -0700199 Toolchain config.Toolchain
200 Tidy bool
201 GcovCoverage bool
202 SAbiDump bool
203 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800204
205 RequiredInstructionSet string
Colin Cross16b23492016-01-06 14:41:07 -0800206 DynamicLinker string
207
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700208 CFlagsDeps android.Paths // Files depended on by compiler flags
209 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800210
Dan Willemsen98ab3112019-08-27 21:20:40 -0700211 AssemblerWithCpp bool
212 GroupStaticLibs bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800213
Colin Cross19878da2019-03-28 14:45:07 -0700214 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700215 protoC bool // Whether to use C instead of C++
216 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700217
218 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200219 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700220}
221
Colin Crossca860ac2016-01-04 14:34:37 -0800222// Properties used to compile all C or C++ modules
223type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700224 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800225 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700226
Colin Crossc511bc52020-04-07 16:50:32 +0000227 // Minimum sdk version supported when compiling against the ndk. Setting this property causes
228 // two variants to be built, one for the platform and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800229 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700230
Jooyung Han379660c2020-04-21 15:24:00 +0900231 // Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
232 Min_sdk_version *string
233
Colin Crossc511bc52020-04-07 16:50:32 +0000234 // If true, always create an sdk variant and don't create a platform variant.
235 Sdk_variant_only *bool
236
Jiyong Parkde866cb2018-12-07 23:08:36 +0900237 AndroidMkSharedLibs []string `blueprint:"mutated"`
238 AndroidMkStaticLibs []string `blueprint:"mutated"`
239 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
240 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700241 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900242 HideFromMake bool `blueprint:"mutated"`
243 PreventInstall bool `blueprint:"mutated"`
244 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700245
Yo Chiang219968c2020-09-22 18:45:04 +0800246 // Set by DepsMutator.
247 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
248
Justin Yun5f7f7e82019-11-18 19:52:14 +0900249 ImageVariationPrefix string `blueprint:"mutated"`
250 VndkVersion string `blueprint:"mutated"`
251 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800252
253 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
254 // file
255 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900256
Yifan Hong1b3348d2020-01-21 15:53:22 -0800257 // Make this module available when building for ramdisk
258 Ramdisk_available *bool
259
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700260 // Make this module available when building for vendor ramdisk
261 Vendor_ramdisk_available *bool
262
Jiyong Parkf9332f12018-02-01 00:54:12 +0900263 // Make this module available when building for recovery
264 Recovery_available *bool
265
Colin Crossae6c5202019-11-20 13:35:50 -0800266 // Set by imageMutator
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700267 CoreVariantNeeded bool `blueprint:"mutated"`
268 RamdiskVariantNeeded bool `blueprint:"mutated"`
269 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
270 RecoveryVariantNeeded bool `blueprint:"mutated"`
271 ExtraVariants []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900272
273 // Allows this module to use non-APEX version of libraries. Useful
274 // for building binaries that are started before APEXes are activated.
275 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900276
277 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
278 // see soong/cc/config/vndk.go
279 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900280
281 // Used by vendor snapshot to record dependencies from snapshot modules.
282 SnapshotSharedLibs []string `blueprint:"mutated"`
283 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000284
285 Installable *bool
Colin Crossc511bc52020-04-07 16:50:32 +0000286
287 // Set by factories of module types that can only be referenced from variants compiled against
288 // the SDK.
289 AlwaysSdk bool `blueprint:"mutated"`
290
291 // Variant is an SDK variant created by sdkMutator
292 IsSdkVariant bool `blueprint:"mutated"`
293 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
294 // variant to have a ".sdk" suffix.
295 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700296
297 // Normally Soong uses the directory structure to decide which modules
298 // should be included (framework) or excluded (non-framework) from the
299 // vendor snapshot, but this property allows a partner to exclude a
300 // module normally thought of as a framework module from the vendor
301 // snapshot.
302 Exclude_from_vendor_snapshot *bool
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700303}
304
305type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900306 // whether this module should be allowed to be directly depended by other
307 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun5f7f7e82019-11-18 19:52:14 +0900308 // In addition, this module should be allowed to be directly depended by
309 // product modules with `product_specific: true`.
310 // If set to true, three variants will be built separately, one like
311 // normal, another limited to the set of libraries and headers
312 // that are exposed to /vendor modules, and the other to /product modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700313 //
Justin Yun5f7f7e82019-11-18 19:52:14 +0900314 // The vendor and product variants may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700315 // so it shouldn't have any unversioned runtime dependencies, or
316 // make assumptions about the system that may not be true in the
317 // future.
318 //
Justin Yun5f7f7e82019-11-18 19:52:14 +0900319 // If set to false, this module becomes inaccessible from /vendor or /product
320 // modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900321 //
322 // Default value is true when vndk: {enabled: true} or vendor: true.
323 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700324 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
Justin Yun5f7f7e82019-11-18 19:52:14 +0900325 // If PRODUCT_PRODUCT_VNDK_VERSION isn't set, product variant will not be used.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700326 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900327
328 // whether this module is capable of being loaded with other instance
329 // (possibly an older version) of the same module in the same process.
330 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
331 // can be double loaded in a vendor process if the library is also a
332 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
333 // explicitly marked as `double_loadable: true` by the owner, or the dependency
334 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
335 Double_loadable *bool
Colin Crossca860ac2016-01-04 14:34:37 -0800336}
337
Colin Crossca860ac2016-01-04 14:34:37 -0800338type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800339 static() bool
340 staticBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900341 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900342 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900343 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700344 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900345 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700346 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800347 sdkVersion() string
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700348 useVndk() bool
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800349 isNdk() bool
Inseob Kim9516ee92019-05-09 10:56:13 +0900350 isLlndk(config android.Config) bool
351 isLlndkPublic(config android.Config) bool
352 isVndkPrivate(config android.Config) bool
Justin Yun8effde42017-06-23 19:24:43 +0900353 isVndk() bool
354 isVndkSp() bool
Logan Chienf3511742017-10-31 18:04:35 +0800355 isVndkExt() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900356 inProduct() bool
357 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800358 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700359 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900360 inRecovery() bool
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +0800361 shouldCreateSourceAbiDump() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700362 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700363 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800364 getVndkExtendsModuleName() string
Yi Kong7e53c572018-02-14 18:16:12 +0800365 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800366 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800367 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800368 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700369 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700370 apexSdkVersion() android.ApiLevel
Jiyong Parkb0788572018-12-20 22:10:17 +0900371 hasStubsVariants() bool
372 isStubs() bool
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900373 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800374 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700375 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700376 directlyInAnyApex() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800377}
378
379type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700380 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800381 ModuleContextIntf
382}
383
384type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700385 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800386 ModuleContextIntf
387}
388
Colin Cross37047f12016-12-13 17:06:13 -0800389type DepsContext interface {
390 android.BottomUpMutatorContext
391 ModuleContextIntf
392}
393
Colin Crossca860ac2016-01-04 14:34:37 -0800394type feature interface {
395 begin(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800396 deps(ctx DepsContext, deps Deps) Deps
Colin Crossca860ac2016-01-04 14:34:37 -0800397 flags(ctx ModuleContext, flags Flags) Flags
398 props() []interface{}
399}
400
401type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700402 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800403 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800404 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700405 compilerProps() []interface{}
406
Colin Cross76fada02016-07-27 10:31:13 -0700407 appendCflags([]string)
408 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700409 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800410}
411
412type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700413 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800414 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700415 linkerFlags(ctx ModuleContext, flags Flags) Flags
416 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800417 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700418
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700419 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700420 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900421 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700422
423 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900424 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000425
426 // Get the deps that have been explicitly specified in the properties.
427 // Only updates the
428 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
429}
430
431type specifiedDeps struct {
432 sharedLibs []string
Martin Stjernholm10566a02020-03-24 01:19:52 +0000433 systemSharedLibs []string // Note nil and [] are semantically distinct.
Colin Crossca860ac2016-01-04 14:34:37 -0800434}
435
436type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700437 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700438 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000439 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800440 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700441 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700442 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900443 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100444 makeUninstallable(mod *Module)
Colin Crossca860ac2016-01-04 14:34:37 -0800445}
446
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800447type xref interface {
448 XrefCcFiles() android.Paths
449}
450
Colin Cross6e511a92020-07-27 21:26:48 -0700451type libraryDependencyKind int
452
453const (
454 headerLibraryDependency = iota
455 sharedLibraryDependency
456 staticLibraryDependency
457)
458
459func (k libraryDependencyKind) String() string {
460 switch k {
461 case headerLibraryDependency:
462 return "headerLibraryDependency"
463 case sharedLibraryDependency:
464 return "sharedLibraryDependency"
465 case staticLibraryDependency:
466 return "staticLibraryDependency"
467 default:
468 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
469 }
470}
471
472type libraryDependencyOrder int
473
474const (
475 earlyLibraryDependency = -1
476 normalLibraryDependency = 0
477 lateLibraryDependency = 1
478)
479
480func (o libraryDependencyOrder) String() string {
481 switch o {
482 case earlyLibraryDependency:
483 return "earlyLibraryDependency"
484 case normalLibraryDependency:
485 return "normalLibraryDependency"
486 case lateLibraryDependency:
487 return "lateLibraryDependency"
488 default:
489 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
490 }
491}
492
493// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
494// tags that have a set of predefined tag objects that are reused for each dependency, a
495// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
496// That means that comparing a libraryDependencyTag for equality will only be equal if all
497// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
498// then check individual metadata fields instead.
499type libraryDependencyTag struct {
500 blueprint.BaseDependencyTag
501
502 // These are exported so that fmt.Printf("%#v") can call their String methods.
503 Kind libraryDependencyKind
504 Order libraryDependencyOrder
505
506 wholeStatic bool
507
508 reexportFlags bool
509 explicitlyVersioned bool
510 dataLib bool
511 ndk bool
512
513 staticUnwinder bool
514
515 makeSuffix string
516}
517
518// header returns true if the libraryDependencyTag is tagging a header lib dependency.
519func (d libraryDependencyTag) header() bool {
520 return d.Kind == headerLibraryDependency
521}
522
523// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
524func (d libraryDependencyTag) shared() bool {
525 return d.Kind == sharedLibraryDependency
526}
527
528// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
529func (d libraryDependencyTag) static() bool {
530 return d.Kind == staticLibraryDependency
531}
532
533// dependencyTag is used for tagging miscellanous dependency types that don't fit into
534// libraryDependencyTag. Each tag object is created globally and reused for multiple
535// dependencies (although since the object contains no references, assigning a tag to a
536// variable and modifying it will not modify the original). Users can compare the tag
537// returned by ctx.OtherModuleDependencyTag against the global original
538type dependencyTag struct {
539 blueprint.BaseDependencyTag
540 name string
541}
542
Colin Crossc99deeb2016-04-11 15:06:20 -0700543var (
Colin Cross6e511a92020-07-27 21:26:48 -0700544 genSourceDepTag = dependencyTag{name: "gen source"}
545 genHeaderDepTag = dependencyTag{name: "gen header"}
546 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
547 objDepTag = dependencyTag{name: "obj"}
548 linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
549 dynamicLinkerDepTag = dependencyTag{name: "dynamic linker"}
550 reuseObjTag = dependencyTag{name: "reuse objects"}
551 staticVariantTag = dependencyTag{name: "static variant"}
552 vndkExtDepTag = dependencyTag{name: "vndk extends"}
553 dataLibDepTag = dependencyTag{name: "data lib"}
554 runtimeDepTag = dependencyTag{name: "runtime lib"}
555 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700556 stubImplDepTag = dependencyTag{name: "stub_impl"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700557)
558
Colin Cross56a83212020-09-15 18:30:11 -0700559type copyDirectlyInAnyApexDependencyTag dependencyTag
560
561func (copyDirectlyInAnyApexDependencyTag) CopyDirectlyInAnyApex() {}
562
563var _ android.CopyDirectlyInAnyApexTag = copyDirectlyInAnyApexDependencyTag{}
564
Roland Levillainf89cd092019-07-29 16:22:59 +0100565func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700566 ccLibDepTag, ok := depTag.(libraryDependencyTag)
567 return ok && ccLibDepTag.shared()
568}
569
570func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
571 ccLibDepTag, ok := depTag.(libraryDependencyTag)
572 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100573}
574
575func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700576 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100577 return ok && ccDepTag == runtimeDepTag
578}
579
580func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700581 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100582 return ok && ccDepTag == testPerSrcDepTag
583}
584
Colin Crossca860ac2016-01-04 14:34:37 -0800585// Module contains the properties and members used by all C/C++ module types, and implements
586// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
587// to construct the output file. Behavior can be customized with a Customizer interface
588type Module struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700589 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -0700590 android.DefaultableModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +0900591 android.ApexModuleBase
Jiyong Parkd1063c12019-07-17 20:08:41 +0900592 android.SdkBase
Colin Crossc472d572015-03-17 15:06:21 -0700593
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700594 Properties BaseProperties
595 VendorProperties VendorProperties
Colin Crossfa138792015-04-24 17:31:52 -0700596
Colin Crossca860ac2016-01-04 14:34:37 -0800597 // initialize before calling Init
Colin Cross635c3b02016-05-18 15:37:25 -0700598 hod android.HostOrDeviceSupported
599 multilib android.Multilib
Colin Crossc472d572015-03-17 15:06:21 -0700600
Paul Duffina0843f62019-12-13 19:50:38 +0000601 // Allowable SdkMemberTypes of this module type.
602 sdkMemberTypes []android.SdkMemberType
603
Colin Crossca860ac2016-01-04 14:34:37 -0800604 // delegates, initialize before calling Init
Colin Crossb4ce0ec2016-09-13 13:41:39 -0700605 features []feature
606 compiler compiler
607 linker linker
608 installer installer
609 stl *stl
610 sanitize *sanitize
Dan Willemsen581341d2017-02-09 16:16:31 -0800611 coverage *coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800612 sabi *sabi
Justin Yun8effde42017-06-23 19:24:43 +0900613 vndkdep *vndkdep
Stephen Craneba090d12017-05-09 15:44:35 -0700614 lto *lto
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700615 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800616
Colin Cross635c3b02016-05-18 15:37:25 -0700617 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800618
Colin Crossb98c8b02016-07-29 13:44:28 -0700619 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700620
621 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800622
623 // Flags used to compile this module
624 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700625
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800626 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700627 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900628
629 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800630 // Kythe (source file indexer) paths for this compilation module
631 kytheFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900632
633 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700634 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700635
636 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700637}
638
Ivan Lozano52767be2019-10-18 14:49:46 -0700639func (c *Module) Toc() android.OptionalPath {
640 if c.linker != nil {
641 if library, ok := c.linker.(libraryInterface); ok {
642 return library.toc()
643 }
644 }
645 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
646}
647
648func (c *Module) ApiLevel() string {
649 if c.linker != nil {
650 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700651 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700652 }
653 }
654 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
655}
656
657func (c *Module) Static() bool {
658 if c.linker != nil {
659 if library, ok := c.linker.(libraryInterface); ok {
660 return library.static()
661 }
662 }
663 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
664}
665
666func (c *Module) Shared() bool {
667 if c.linker != nil {
668 if library, ok := c.linker.(libraryInterface); ok {
669 return library.shared()
670 }
671 }
672 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
673}
674
675func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +0000676 if c.stl != nil {
677 return c.stl.Properties.SelectedStl
678 }
679 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -0700680}
681
682func (c *Module) ToolchainLibrary() bool {
683 if _, ok := c.linker.(*toolchainLibraryDecorator); ok {
684 return true
685 }
686 return false
687}
688
689func (c *Module) NdkPrebuiltStl() bool {
690 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
691 return true
692 }
693 return false
694}
695
696func (c *Module) StubDecorator() bool {
697 if _, ok := c.linker.(*stubDecorator); ok {
698 return true
699 }
700 return false
701}
702
703func (c *Module) SdkVersion() string {
704 return String(c.Properties.Sdk_version)
705}
706
Artur Satayev480e25b2020-04-27 18:53:18 +0100707func (c *Module) MinSdkVersion() string {
708 return String(c.Properties.Min_sdk_version)
709}
710
Dan Albert92fe7402020-07-15 13:33:30 -0700711func (c *Module) SplitPerApiLevel() bool {
Colin Cross1348ce32020-10-01 13:37:16 -0700712 if !c.canUseSdk() {
713 return false
714 }
Dan Albert92fe7402020-07-15 13:33:30 -0700715 if linker, ok := c.linker.(*objectLinker); ok {
716 return linker.isCrt()
717 }
718 return false
719}
720
Colin Crossc511bc52020-04-07 16:50:32 +0000721func (c *Module) AlwaysSdk() bool {
722 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
723}
724
Colin Cross3572cf72020-10-01 15:58:11 -0700725func (c *Module) StubsVersions(ctx android.BaseMutatorContext) []string {
Colin Crossc88c2722020-09-28 17:32:47 -0700726 if versioned, ok := c.linker.(versionedInterface); ok {
Colin Cross3572cf72020-10-01 15:58:11 -0700727 return versioned.stubsVersions(ctx)
Ivan Lozano183a3212019-10-18 14:18:45 -0700728 }
729 panic(fmt.Errorf("StubsVersions called on non-library module: %q", c.BaseModuleName()))
730}
731
732func (c *Module) CcLibrary() bool {
733 if c.linker != nil {
734 if _, ok := c.linker.(*libraryDecorator); ok {
735 return true
736 }
Colin Crossd48fe732020-09-23 20:37:24 -0700737 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
738 return true
739 }
Ivan Lozano183a3212019-10-18 14:18:45 -0700740 }
741 return false
742}
743
744func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -0700745 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700746 return true
747 }
748 return false
749}
750
Ivan Lozano2b262972019-11-21 12:30:50 -0800751func (c *Module) NonCcVariants() bool {
752 return false
753}
754
Ivan Lozano183a3212019-10-18 14:18:45 -0700755func (c *Module) SetBuildStubs() {
Colin Crossc88c2722020-09-28 17:32:47 -0700756 if versioned, ok := c.linker.(versionedInterface); ok {
757 versioned.setBuildStubs()
758 c.Properties.HideFromMake = true
759 c.sanitize = nil
760 c.stl = nil
761 c.Properties.PreventInstall = true
762 return
Ivan Lozano183a3212019-10-18 14:18:45 -0700763 }
764 panic(fmt.Errorf("SetBuildStubs called on non-library module: %q", c.BaseModuleName()))
765}
766
Ivan Lozano52767be2019-10-18 14:49:46 -0700767func (c *Module) BuildStubs() bool {
Colin Crossc88c2722020-09-28 17:32:47 -0700768 if versioned, ok := c.linker.(versionedInterface); ok {
769 return versioned.buildStubs()
Ivan Lozano52767be2019-10-18 14:49:46 -0700770 }
771 panic(fmt.Errorf("BuildStubs called on non-library module: %q", c.BaseModuleName()))
772}
773
Colin Crossd1f898e2020-08-18 18:35:15 -0700774func (c *Module) SetAllStubsVersions(versions []string) {
Colin Crossc88c2722020-09-28 17:32:47 -0700775 if versioned, ok := c.linker.(versionedInterface); ok {
776 versioned.setAllStubsVersions(versions)
Colin Crossd1f898e2020-08-18 18:35:15 -0700777 }
778}
779
780func (c *Module) AllStubsVersions() []string {
Colin Crossc88c2722020-09-28 17:32:47 -0700781 if versioned, ok := c.linker.(versionedInterface); ok {
782 return versioned.allStubsVersions()
Colin Crossd1f898e2020-08-18 18:35:15 -0700783 }
784 return nil
785}
786
787func (c *Module) SetStubsVersion(version string) {
Colin Crossc88c2722020-09-28 17:32:47 -0700788 if versioned, ok := c.linker.(versionedInterface); ok {
789 versioned.setStubsVersion(version)
790 return
Ivan Lozano183a3212019-10-18 14:18:45 -0700791 }
Colin Crossd1f898e2020-08-18 18:35:15 -0700792 panic(fmt.Errorf("SetStubsVersion called on non-library module: %q", c.BaseModuleName()))
Ivan Lozano183a3212019-10-18 14:18:45 -0700793}
794
Jooyung Han03b51852020-02-26 22:45:42 +0900795func (c *Module) StubsVersion() string {
Colin Crossc88c2722020-09-28 17:32:47 -0700796 if versioned, ok := c.linker.(versionedInterface); ok {
797 return versioned.stubsVersion()
Jooyung Han03b51852020-02-26 22:45:42 +0900798 }
799 panic(fmt.Errorf("StubsVersion called on non-library module: %q", c.BaseModuleName()))
800}
801
Ivan Lozano183a3212019-10-18 14:18:45 -0700802func (c *Module) SetStatic() {
803 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700804 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700805 library.setStatic()
806 return
807 }
808 }
809 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
810}
811
812func (c *Module) SetShared() {
813 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700814 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700815 library.setShared()
816 return
817 }
818 }
819 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
820}
821
822func (c *Module) BuildStaticVariant() bool {
823 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700824 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700825 return library.buildStatic()
826 }
827 }
828 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
829}
830
831func (c *Module) BuildSharedVariant() bool {
832 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700833 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700834 return library.buildShared()
835 }
836 }
837 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
838}
839
840func (c *Module) Module() android.Module {
841 return c
842}
843
Jiyong Parkc20eee32018-09-05 22:36:17 +0900844func (c *Module) OutputFile() android.OptionalPath {
845 return c.outputFile
846}
847
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400848func (c *Module) CoverageFiles() android.Paths {
849 if c.linker != nil {
850 if library, ok := c.linker.(libraryInterface); ok {
851 return library.objs().coverageFiles
852 }
853 }
854 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
855}
856
Ivan Lozano183a3212019-10-18 14:18:45 -0700857var _ LinkableInterface = (*Module)(nil)
858
Jiyong Park719b4462019-01-13 00:39:51 +0900859func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900860 if c.linker != nil {
861 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +0900862 }
863 return nil
864}
865
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900866func (c *Module) CoverageOutputFile() android.OptionalPath {
867 if c.linker != nil {
868 return c.linker.coverageOutputFilePath()
869 }
870 return android.OptionalPath{}
871}
872
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900873func (c *Module) RelativeInstallPath() string {
874 if c.installer != nil {
875 return c.installer.relativeInstallPath()
876 }
877 return ""
878}
879
Jooyung Han344d5432019-08-23 11:17:39 +0900880func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900881 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +0900882}
883
Colin Cross36242852017-06-23 15:06:31 -0700884func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -0700885 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -0800886 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -0700887 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800888 }
889 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -0700890 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800891 }
892 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -0700893 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800894 }
Colin Crossa8e07cc2016-04-04 15:07:06 -0700895 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -0700896 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -0700897 }
Colin Cross16b23492016-01-06 14:41:07 -0800898 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -0700899 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -0800900 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800901 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -0700902 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -0800903 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800904 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -0700905 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800906 }
Justin Yun8effde42017-06-23 19:24:43 +0900907 if c.vndkdep != nil {
908 c.AddProperties(c.vndkdep.props()...)
909 }
Stephen Craneba090d12017-05-09 15:44:35 -0700910 if c.lto != nil {
911 c.AddProperties(c.lto.props()...)
912 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700913 if c.pgo != nil {
914 c.AddProperties(c.pgo.props()...)
915 }
Colin Crossca860ac2016-01-04 14:34:37 -0800916 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -0700917 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800918 }
Colin Crossc472d572015-03-17 15:06:21 -0700919
Jiyong Park1613e552020-09-14 19:43:17 +0900920 c.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, os android.OsType) bool {
Elliott Hughes79ae3412020-04-17 15:49:49 -0700921 // Windows builds always prefer 32-bit
Jiyong Park1613e552020-09-14 19:43:17 +0900922 return os == android.Windows
Colin Crossa9d8bee2018-10-02 13:59:46 -0700923 })
Colin Cross36242852017-06-23 15:06:31 -0700924 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +0900925 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +0900926 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +0900927 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +0900928
Colin Cross36242852017-06-23 15:06:31 -0700929 return c
Colin Crossc472d572015-03-17 15:06:21 -0700930}
931
Colin Crossb916a382016-07-29 17:28:03 -0700932// Returns true for dependency roots (binaries)
933// TODO(ccross): also handle dlopenable libraries
934func (c *Module) isDependencyRoot() bool {
935 if root, ok := c.linker.(interface {
936 isDependencyRoot() bool
937 }); ok {
938 return root.isDependencyRoot()
939 }
940 return false
941}
942
Justin Yun5f7f7e82019-11-18 19:52:14 +0900943// Returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64.
944// "product" and "vendor" variant modules return true for this function.
945// When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true",
946// "soc_specific: true" and more vendor installed modules are included here.
947// When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "vendor_available: true" or
948// "product_specific: true" modules are included here.
Ivan Lozano52767be2019-10-18 14:49:46 -0700949func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +0900950 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700951}
952
Colin Crossc511bc52020-04-07 16:50:32 +0000953func (c *Module) canUseSdk() bool {
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700954 return c.Os() == android.Android && !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +0000955}
956
957func (c *Module) UseSdk() bool {
958 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -0700959 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +0000960 }
961 return false
962}
963
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800964func (c *Module) isCoverageVariant() bool {
965 return c.coverage.Properties.IsCoverageVariant
966}
967
Peter Collingbournead84f972019-12-17 16:46:18 -0800968func (c *Module) IsNdk() bool {
Colin Crossf0913fb2020-07-29 12:59:39 -0700969 return inList(c.BaseModuleName(), ndkKnownLibs)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800970}
971
Inseob Kim9516ee92019-05-09 10:56:13 +0900972func (c *Module) isLlndk(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800973 // Returns true for both LLNDK (public) and LLNDK-private libs.
Jooyung Han0302a842019-10-30 18:43:49 +0900974 return isLlndkLibrary(c.BaseModuleName(), config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800975}
976
Inseob Kim9516ee92019-05-09 10:56:13 +0900977func (c *Module) isLlndkPublic(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800978 // Returns true only for LLNDK (public) libs.
Jooyung Han0302a842019-10-30 18:43:49 +0900979 name := c.BaseModuleName()
980 return isLlndkLibrary(name, config) && !isVndkPrivateLibrary(name, config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800981}
982
Inseob Kim9516ee92019-05-09 10:56:13 +0900983func (c *Module) isVndkPrivate(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800984 // Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Jooyung Han0302a842019-10-30 18:43:49 +0900985 return isVndkPrivateLibrary(c.BaseModuleName(), config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800986}
987
Ivan Lozano52767be2019-10-18 14:49:46 -0700988func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +0800989 if vndkdep := c.vndkdep; vndkdep != nil {
990 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +0900991 }
992 return false
993}
994
Yi Kong7e53c572018-02-14 18:16:12 +0800995func (c *Module) isPgoCompile() bool {
996 if pgo := c.pgo; pgo != nil {
997 return pgo.Properties.PgoCompile
998 }
999 return false
1000}
1001
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001002func (c *Module) isNDKStubLibrary() bool {
1003 if _, ok := c.compiler.(*stubDecorator); ok {
1004 return true
1005 }
1006 return false
1007}
1008
Logan Chienf3511742017-10-31 18:04:35 +08001009func (c *Module) isVndkSp() bool {
1010 if vndkdep := c.vndkdep; vndkdep != nil {
1011 return vndkdep.isVndkSp()
1012 }
1013 return false
1014}
1015
1016func (c *Module) isVndkExt() bool {
1017 if vndkdep := c.vndkdep; vndkdep != nil {
1018 return vndkdep.isVndkExt()
1019 }
1020 return false
1021}
1022
Ivan Lozano52767be2019-10-18 14:49:46 -07001023func (c *Module) MustUseVendorVariant() bool {
Jooyung Han097087b2019-10-22 19:32:18 +09001024 return c.isVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001025}
1026
Logan Chienf3511742017-10-31 18:04:35 +08001027func (c *Module) getVndkExtendsModuleName() string {
1028 if vndkdep := c.vndkdep; vndkdep != nil {
1029 return vndkdep.getVndkExtendsModuleName()
1030 }
1031 return ""
1032}
1033
Jiyong Park25fc6a92018-11-18 18:02:45 +09001034func (c *Module) IsStubs() bool {
Colin Crossc88c2722020-09-28 17:32:47 -07001035 if versioned, ok := c.linker.(versionedInterface); ok {
1036 return versioned.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001037 }
1038 return false
1039}
1040
1041func (c *Module) HasStubsVariants() bool {
Colin Crossc88c2722020-09-28 17:32:47 -07001042 if versioned, ok := c.linker.(versionedInterface); ok {
1043 return versioned.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001044 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001045 return false
1046}
1047
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001048func (c *Module) bootstrap() bool {
1049 return Bool(c.Properties.Bootstrap)
1050}
1051
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001052func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001053 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1054 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1055 return false
1056 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001057 return c.linker != nil && c.linker.nativeCoverage()
1058}
1059
Inseob Kim8471cda2019-11-15 09:59:12 +09001060func (c *Module) isSnapshotPrebuilt() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09001061 if p, ok := c.linker.(interface{ isSnapshotPrebuilt() bool }); ok {
1062 return p.isSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001063 }
1064 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001065}
1066
Bill Peckham945441c2020-08-31 16:07:58 -07001067func (c *Module) ExcludeFromVendorSnapshot() bool {
1068 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1069}
1070
Jiyong Parkf1194352019-02-25 11:05:47 +09001071func isBionic(name string) bool {
1072 switch name {
Martin Stjernholm203489b2019-11-11 15:33:27 +00001073 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001074 return true
1075 }
1076 return false
1077}
1078
Martin Stjernholm279de572019-09-10 23:18:20 +01001079func InstallToBootstrap(name string, config android.Config) bool {
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001080 if name == "libclang_rt.hwasan-aarch64-android" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001081 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001082 }
1083 return isBionic(name)
1084}
1085
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001086func (c *Module) XrefCcFiles() android.Paths {
1087 return c.kytheFiles
1088}
1089
Colin Crossca860ac2016-01-04 14:34:37 -08001090type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001091 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001092 moduleContextImpl
1093}
1094
Colin Cross37047f12016-12-13 17:06:13 -08001095type depsContext struct {
1096 android.BottomUpMutatorContext
1097 moduleContextImpl
1098}
1099
Colin Crossca860ac2016-01-04 14:34:37 -08001100type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001101 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001102 moduleContextImpl
1103}
1104
1105type moduleContextImpl struct {
1106 mod *Module
1107 ctx BaseModuleContext
1108}
1109
Colin Crossb98c8b02016-07-29 13:44:28 -07001110func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001111 return ctx.mod.toolchain(ctx.ctx)
1112}
1113
1114func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001115 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001116}
1117
1118func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001119 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001120}
1121
Jiyong Park1d1119f2019-07-29 21:27:18 +09001122func (ctx *moduleContextImpl) header() bool {
1123 return ctx.mod.header()
1124}
1125
Inseob Kim7f283f42020-06-01 21:53:49 +09001126func (ctx *moduleContextImpl) binary() bool {
1127 return ctx.mod.binary()
1128}
1129
Inseob Kim1042d292020-06-01 23:23:05 +09001130func (ctx *moduleContextImpl) object() bool {
1131 return ctx.mod.object()
1132}
1133
Jooyung Hanccce2f22020-03-07 03:45:53 +09001134func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001135 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001136}
1137
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001138func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001139 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001140}
1141
1142func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001143 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001144 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001145 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001146 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001147 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001148 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001149 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001150 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001151 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001152 }
1153 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001154}
1155
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001156func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001157 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001158}
Justin Yun8effde42017-06-23 19:24:43 +09001159
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001160func (ctx *moduleContextImpl) isNdk() bool {
Peter Collingbournead84f972019-12-17 16:46:18 -08001161 return ctx.mod.IsNdk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001162}
1163
Inseob Kim9516ee92019-05-09 10:56:13 +09001164func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {
1165 return ctx.mod.isLlndk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001166}
1167
Inseob Kim9516ee92019-05-09 10:56:13 +09001168func (ctx *moduleContextImpl) isLlndkPublic(config android.Config) bool {
1169 return ctx.mod.isLlndkPublic(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001170}
1171
Inseob Kim9516ee92019-05-09 10:56:13 +09001172func (ctx *moduleContextImpl) isVndkPrivate(config android.Config) bool {
1173 return ctx.mod.isVndkPrivate(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001174}
1175
Logan Chienf3511742017-10-31 18:04:35 +08001176func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001177 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001178}
1179
Yi Kong7e53c572018-02-14 18:16:12 +08001180func (ctx *moduleContextImpl) isPgoCompile() bool {
1181 return ctx.mod.isPgoCompile()
1182}
1183
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001184func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1185 return ctx.mod.isNDKStubLibrary()
1186}
1187
Justin Yun8effde42017-06-23 19:24:43 +09001188func (ctx *moduleContextImpl) isVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001189 return ctx.mod.isVndkSp()
1190}
1191
1192func (ctx *moduleContextImpl) isVndkExt() bool {
1193 return ctx.mod.isVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001194}
1195
Vic Yangefd249e2018-11-12 20:19:56 -08001196func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001197 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001198}
1199
Logan Chien2f2b8902018-07-10 15:01:19 +08001200// Check whether ABI dumps should be created for this module.
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +08001201func (ctx *moduleContextImpl) shouldCreateSourceAbiDump() bool {
Logan Chien2f2b8902018-07-10 15:01:19 +08001202 if ctx.ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
1203 return false
Jayant Chowdharyea0a2e12018-03-01 19:12:16 -08001204 }
Doug Hornc32c6b02019-01-17 14:44:05 -08001205
Hsin-Yi Chenf81bb652020-04-07 21:42:19 +08001206 // Coverage builds have extra symbols.
1207 if ctx.mod.isCoverageVariant() {
1208 return false
1209 }
1210
Doug Hornc32c6b02019-01-17 14:44:05 -08001211 if ctx.ctx.Fuchsia() {
1212 return false
1213 }
1214
Logan Chien2f2b8902018-07-10 15:01:19 +08001215 if sanitize := ctx.mod.sanitize; sanitize != nil {
1216 if !sanitize.isVariantOnProductionDevice() {
1217 return false
1218 }
1219 }
1220 if !ctx.ctx.Device() {
1221 // Host modules do not need ABI dumps.
1222 return false
1223 }
Hsin-Yi Chend2451682020-01-10 16:47:50 +08001224 if ctx.isStubs() || ctx.isNDKStubLibrary() {
Hsin-Yi Chenf6a95462019-06-25 14:46:52 +08001225 // Stubs do not need ABI dumps.
1226 return false
1227 }
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +08001228 return true
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001229}
1230
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001231func (ctx *moduleContextImpl) selectedStl() string {
1232 if stl := ctx.mod.stl; stl != nil {
1233 return stl.Properties.SelectedStl
1234 }
1235 return ""
1236}
1237
Ivan Lozanobd721262018-11-27 14:33:03 -08001238func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1239 return ctx.mod.linker.useClangLld(actx)
1240}
1241
Colin Crossce75d2c2016-10-06 16:12:58 -07001242func (ctx *moduleContextImpl) baseModuleName() string {
1243 return ctx.mod.ModuleBase.BaseModuleName()
1244}
1245
Logan Chienf3511742017-10-31 18:04:35 +08001246func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1247 return ctx.mod.getVndkExtendsModuleName()
1248}
1249
Logan Chiene274fc92019-12-03 11:18:32 -08001250func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001251 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001252}
1253
Colin Crosse07f2312020-08-13 11:24:56 -07001254func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001255 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001256}
1257
Dan Albertc8060532020-07-22 22:32:17 -07001258func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001259 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001260}
1261
Jiyong Parkb0788572018-12-20 22:10:17 +09001262func (ctx *moduleContextImpl) hasStubsVariants() bool {
1263 return ctx.mod.HasStubsVariants()
1264}
1265
1266func (ctx *moduleContextImpl) isStubs() bool {
1267 return ctx.mod.IsStubs()
1268}
1269
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001270func (ctx *moduleContextImpl) bootstrap() bool {
1271 return ctx.mod.bootstrap()
1272}
1273
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001274func (ctx *moduleContextImpl) nativeCoverage() bool {
1275 return ctx.mod.nativeCoverage()
1276}
1277
Colin Cross56a83212020-09-15 18:30:11 -07001278func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1279 return ctx.mod.DirectlyInAnyApex()
1280}
1281
Colin Cross635c3b02016-05-18 15:37:25 -07001282func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001283 return &Module{
1284 hod: hod,
1285 multilib: multilib,
1286 }
1287}
1288
Colin Cross635c3b02016-05-18 15:37:25 -07001289func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001290 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001291 module.features = []feature{
1292 &tidyFeature{},
1293 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001294 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001295 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001296 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001297 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001298 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001299 module.lto = &lto{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001300 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001301 return module
1302}
1303
Colin Crossce75d2c2016-10-06 16:12:58 -07001304func (c *Module) Prebuilt() *android.Prebuilt {
1305 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1306 return p.prebuilt()
1307 }
1308 return nil
1309}
1310
1311func (c *Module) Name() string {
1312 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001313 if p, ok := c.linker.(interface {
1314 Name(string) string
1315 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001316 name = p.Name(name)
1317 }
1318 return name
1319}
1320
Alex Light3d673592019-01-18 14:37:31 -08001321func (c *Module) Symlinks() []string {
1322 if p, ok := c.installer.(interface {
1323 symlinkList() []string
1324 }); ok {
1325 return p.symlinkList()
1326 }
1327 return nil
1328}
1329
Roland Levillainf89cd092019-07-29 16:22:59 +01001330func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1331 test, ok := c.linker.(testPerSrc)
1332 return ok && test.isAllTestsVariation()
1333}
1334
Chris Parsons216e10a2020-07-09 17:12:52 -04001335func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001336 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001337 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001338 }); ok {
1339 return p.dataPaths()
1340 }
1341 return nil
1342}
1343
Justin Yun5f7f7e82019-11-18 19:52:14 +09001344func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
1345 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1346 // "current", it will append the VNDK version to the name suffix.
1347 var vndkVersion string
1348 var nameSuffix string
1349 if c.inProduct() {
1350 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
1351 nameSuffix = productSuffix
1352 } else {
1353 vndkVersion = ctx.DeviceConfig().VndkVersion()
1354 nameSuffix = vendorSuffix
1355 }
1356 if vndkVersion == "current" {
1357 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1358 }
1359 if c.Properties.VndkVersion != vndkVersion {
1360 // add version suffix only if the module is using different vndk version than the
1361 // version in product or vendor partition.
1362 nameSuffix += "." + c.Properties.VndkVersion
1363 }
1364 return nameSuffix
1365}
1366
Colin Cross635c3b02016-05-18 15:37:25 -07001367func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Roland Levillainf2fad972019-06-28 15:41:19 +01001368 // Handle the case of a test module split by `test_per_src` mutator.
Roland Levillainf89cd092019-07-29 16:22:59 +01001369 //
1370 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1371 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1372 // module and return early, as this module does not produce an output file per se.
1373 if c.IsTestPerSrcAllTestsVariation() {
1374 c.outputFile = android.OptionalPath{}
1375 return
Roland Levillainf2fad972019-06-28 15:41:19 +01001376 }
1377
Colin Cross56a83212020-09-15 18:30:11 -07001378 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1379 if !apexInfo.IsForPlatform() {
1380 c.hideApexVariantFromMake = true
1381 }
1382
Jooyung Han38002912019-05-16 04:01:54 +09001383 c.makeLinkType = c.getMakeLinkType(actx)
Inseob Kim9516ee92019-05-09 10:56:13 +09001384
Inseob Kim64c43952019-08-26 16:52:35 +09001385 c.Properties.SubName = ""
1386
1387 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1388 c.Properties.SubName += nativeBridgeSuffix
1389 }
1390
Justin Yun5f7f7e82019-11-18 19:52:14 +09001391 _, llndk := c.linker.(*llndkStubDecorator)
1392 _, llndkHeader := c.linker.(*llndkHeadersDecorator)
1393 if llndk || llndkHeader || (c.UseVndk() && c.HasVendorVariant()) {
1394 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1395 // added for product variant only when we have vendor and product variants with core
1396 // variant. The suffix is not added for vendor-only or product-only module.
1397 c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
1398 } else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
Inseob Kim64c43952019-08-26 16:52:35 +09001399 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1400 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
1401 c.Properties.SubName += vendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001402 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
1403 c.Properties.SubName += ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001404 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
1405 c.Properties.SubName += vendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001406 } else if c.InRecovery() && !c.OnlyInRecovery() {
Inseob Kim64c43952019-08-26 16:52:35 +09001407 c.Properties.SubName += recoverySuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001408 } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
Colin Crossc511bc52020-04-07 16:50:32 +00001409 c.Properties.SubName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001410 if c.SplitPerApiLevel() {
1411 c.Properties.SubName += "." + c.SdkVersion()
1412 }
Inseob Kim64c43952019-08-26 16:52:35 +09001413 }
1414
Colin Crossca860ac2016-01-04 14:34:37 -08001415 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001416 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001417 moduleContextImpl: moduleContextImpl{
1418 mod: c,
1419 },
1420 }
1421 ctx.ctx = ctx
1422
Colin Crossf18e1102017-11-16 14:33:08 -08001423 deps := c.depsToPaths(ctx)
1424 if ctx.Failed() {
1425 return
1426 }
1427
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001428 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1429 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1430 }
1431
Colin Crossca860ac2016-01-04 14:34:37 -08001432 flags := Flags{
1433 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001434 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001435 }
Colin Crossca860ac2016-01-04 14:34:37 -08001436 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001437 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001438 }
1439 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001440 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001441 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001442 if c.stl != nil {
1443 flags = c.stl.flags(ctx, flags)
1444 }
Colin Cross16b23492016-01-06 14:41:07 -08001445 if c.sanitize != nil {
1446 flags = c.sanitize.flags(ctx, flags)
1447 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001448 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001449 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001450 }
Stephen Craneba090d12017-05-09 15:44:35 -07001451 if c.lto != nil {
1452 flags = c.lto.flags(ctx, flags)
1453 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001454 if c.pgo != nil {
1455 flags = c.pgo.flags(ctx, flags)
1456 }
Colin Crossca860ac2016-01-04 14:34:37 -08001457 for _, feature := range c.features {
1458 flags = feature.flags(ctx, flags)
1459 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001460 if ctx.Failed() {
1461 return
1462 }
1463
Colin Cross4af21ed2019-11-04 09:37:55 -08001464 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1465 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1466 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001467
Colin Cross4af21ed2019-11-04 09:37:55 -08001468 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001469
1470 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001471 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001472 }
1473 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001474 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001475 }
1476
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001477 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001478 // We need access to all the flags seen by a source file.
1479 if c.sabi != nil {
1480 flags = c.sabi.flags(ctx, flags)
1481 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001482
Colin Cross4af21ed2019-11-04 09:37:55 -08001483 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001484
Colin Crossca860ac2016-01-04 14:34:37 -08001485 // Optimization to reduce size of build.ninja
1486 // Replace the long list of flags for each file with a module-local variable
Colin Cross4af21ed2019-11-04 09:37:55 -08001487 ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
1488 ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
1489 ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
1490 flags.Local.CFlags = []string{"$cflags"}
1491 flags.Local.CppFlags = []string{"$cppflags"}
1492 flags.Local.AsFlags = []string{"$asflags"}
Colin Crossca860ac2016-01-04 14:34:37 -08001493
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001494 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001495 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001496 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001497 if ctx.Failed() {
1498 return
1499 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001500 c.kytheFiles = objs.kytheFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001501 }
1502
Colin Crossca860ac2016-01-04 14:34:37 -08001503 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001504 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001505 if ctx.Failed() {
1506 return
1507 }
Colin Cross635c3b02016-05-18 15:37:25 -07001508 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001509
1510 // If a lib is directly included in any of the APEXes, unhide the stubs
1511 // variant having the latest version gets visible to make. In addition,
1512 // the non-stubs variant is renamed to <libname>.bootstrap. This is to
1513 // force anything in the make world to link against the stubs library.
1514 // (unless it is explicitly referenced via .bootstrap suffix or the
1515 // module is marked with 'bootstrap: true').
Colin Cross56a83212020-09-15 18:30:11 -07001516 if c.HasStubsVariants() && c.AnyVariantDirectlyInAnyApex() && !c.InRamdisk() &&
Ivan Lozano52767be2019-10-18 14:49:46 -07001517 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001518 c.IsStubs() && !c.InVendorRamdisk() {
Jiyong Parkb0788572018-12-20 22:10:17 +09001519 c.Properties.HideFromMake = false // unhide
1520 // Note: this is still non-installable
1521 }
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001522
1523 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current.
1524 if i, ok := c.linker.(snapshotLibraryInterface); ok && ctx.DeviceConfig().VndkVersion() == "current" {
Colin Cross56a83212020-09-15 18:30:11 -07001525 if isSnapshotAware(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001526 i.collectHeadersForSnapshot(ctx)
1527 }
1528 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001529 }
Colin Cross5049f022015-03-18 13:28:46 -07001530
Colin Cross56a83212020-09-15 18:30:11 -07001531 if c.installable(apexInfo) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001532 c.installer.install(ctx, c.outputFile.Path())
1533 if ctx.Failed() {
1534 return
Colin Crossca860ac2016-01-04 14:34:37 -08001535 }
Paul Duffin0cb37b92020-03-04 14:52:46 +00001536 } else if !proptools.BoolDefault(c.Properties.Installable, true) {
1537 // If the module has been specifically configure to not be installed then
1538 // skip the installation as otherwise it will break when running inside make
1539 // as the output path to install will not be specified. Not all uninstallable
1540 // modules can skip installation as some are needed for resolving make side
1541 // dependencies.
1542 c.SkipInstall()
Dan Albertc403f7c2015-03-18 14:01:18 -07001543 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001544}
1545
Colin Cross0ea8ba82019-06-06 14:33:29 -07001546func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001547 if c.cachedToolchain == nil {
Colin Crossb98c8b02016-07-29 13:44:28 -07001548 c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
Colin Cross3f40fa42015-01-30 17:27:36 -08001549 }
Colin Crossca860ac2016-01-04 14:34:37 -08001550 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08001551}
1552
Colin Crossca860ac2016-01-04 14:34:37 -08001553func (c *Module) begin(ctx BaseModuleContext) {
1554 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001555 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07001556 }
Colin Crossca860ac2016-01-04 14:34:37 -08001557 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001558 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001559 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001560 if c.stl != nil {
1561 c.stl.begin(ctx)
1562 }
Colin Cross16b23492016-01-06 14:41:07 -08001563 if c.sanitize != nil {
1564 c.sanitize.begin(ctx)
1565 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001566 if c.coverage != nil {
1567 c.coverage.begin(ctx)
1568 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001569 if c.sabi != nil {
1570 c.sabi.begin(ctx)
1571 }
Justin Yun8effde42017-06-23 19:24:43 +09001572 if c.vndkdep != nil {
1573 c.vndkdep.begin(ctx)
1574 }
Stephen Craneba090d12017-05-09 15:44:35 -07001575 if c.lto != nil {
1576 c.lto.begin(ctx)
1577 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001578 if c.pgo != nil {
1579 c.pgo.begin(ctx)
1580 }
Colin Crossca860ac2016-01-04 14:34:37 -08001581 for _, feature := range c.features {
1582 feature.begin(ctx)
1583 }
Dan Albert92fe7402020-07-15 13:33:30 -07001584 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07001585 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001586 if err != nil {
1587 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07001588 c.Properties.Sdk_version = nil
1589 } else {
1590 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001591 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001592 }
Colin Crossca860ac2016-01-04 14:34:37 -08001593}
1594
Colin Cross37047f12016-12-13 17:06:13 -08001595func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07001596 deps := Deps{}
1597
1598 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001599 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001600 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001601 // Add the PGO dependency (the clang_rt.profile runtime library), which
1602 // sometimes depends on symbols from libgcc, before libgcc gets added
1603 // in linkerDeps().
Pirama Arumuga Nainar49b53d52017-10-04 16:47:29 -07001604 if c.pgo != nil {
1605 deps = c.pgo.deps(ctx, deps)
1606 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001607 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001608 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001609 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001610 if c.stl != nil {
1611 deps = c.stl.deps(ctx, deps)
1612 }
Colin Cross16b23492016-01-06 14:41:07 -08001613 if c.sanitize != nil {
1614 deps = c.sanitize.deps(ctx, deps)
1615 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001616 if c.coverage != nil {
1617 deps = c.coverage.deps(ctx, deps)
1618 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001619 if c.sabi != nil {
1620 deps = c.sabi.deps(ctx, deps)
1621 }
Justin Yun8effde42017-06-23 19:24:43 +09001622 if c.vndkdep != nil {
1623 deps = c.vndkdep.deps(ctx, deps)
1624 }
Stephen Craneba090d12017-05-09 15:44:35 -07001625 if c.lto != nil {
1626 deps = c.lto.deps(ctx, deps)
1627 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001628 for _, feature := range c.features {
1629 deps = feature.deps(ctx, deps)
1630 }
1631
Colin Crossb6715442017-10-24 11:13:31 -07001632 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1633 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1634 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
1635 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1636 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
1637 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08001638 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07001639
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001640 for _, lib := range deps.ReexportSharedLibHeaders {
1641 if !inList(lib, deps.SharedLibs) {
1642 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
1643 }
1644 }
1645
1646 for _, lib := range deps.ReexportStaticLibHeaders {
1647 if !inList(lib, deps.StaticLibs) {
1648 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib)
1649 }
1650 }
1651
Colin Cross5950f382016-12-13 12:50:57 -08001652 for _, lib := range deps.ReexportHeaderLibHeaders {
1653 if !inList(lib, deps.HeaderLibs) {
1654 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
1655 }
1656 }
1657
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001658 for _, gen := range deps.ReexportGeneratedHeaders {
1659 if !inList(gen, deps.GeneratedHeaders) {
1660 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
1661 }
1662 }
1663
Colin Crossc99deeb2016-04-11 15:06:20 -07001664 return deps
1665}
1666
Dan Albert7e9d2952016-08-04 13:02:36 -07001667func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08001668 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001669 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001670 moduleContextImpl: moduleContextImpl{
1671 mod: c,
1672 },
1673 }
1674 ctx.ctx = ctx
1675
Colin Crossca860ac2016-01-04 14:34:37 -08001676 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07001677}
1678
Jiyong Park7ed9de32018-10-15 22:25:07 +09001679// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09001680func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001681 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
1682 version := name[sharp+1:]
1683 libname := name[:sharp]
1684 return libname, version
1685 }
1686 return name, ""
1687}
1688
Dan Albert92fe7402020-07-15 13:33:30 -07001689func GetCrtVariations(ctx android.BottomUpMutatorContext,
1690 m LinkableInterface) []blueprint.Variation {
1691 if ctx.Os() != android.Android {
1692 return nil
1693 }
1694 if m.UseSdk() {
1695 return []blueprint.Variation{
1696 {Mutator: "sdk", Variation: "sdk"},
Colin Crossbbc941b2020-09-30 12:27:01 -07001697 {Mutator: "version", Variation: m.SdkVersion()},
Dan Albert92fe7402020-07-15 13:33:30 -07001698 }
1699 }
1700 return []blueprint.Variation{
1701 {Mutator: "sdk", Variation: ""},
1702 }
1703}
1704
Colin Crosse7257d22020-09-24 09:56:18 -07001705func (c *Module) addSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext,
1706 variations []blueprint.Variation, depTag libraryDependencyTag, name, version string, far bool) {
1707
1708 variations = append([]blueprint.Variation(nil), variations...)
1709
Colin Cross3146c5c2020-09-30 15:34:40 -07001710 if version != "" && CanBeOrLinkAgainstVersionVariants(c) {
Colin Crosse7257d22020-09-24 09:56:18 -07001711 // Version is explicitly specified. i.e. libFoo#30
1712 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
1713 depTag.explicitlyVersioned = true
1714 }
Colin Crosse7257d22020-09-24 09:56:18 -07001715
Colin Cross0de8a1e2020-09-18 14:15:30 -07001716 if far {
1717 ctx.AddFarVariationDependencies(variations, depTag, name)
1718 } else {
1719 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07001720 }
1721}
1722
Colin Cross1e676be2016-10-12 14:38:15 -07001723func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09001724 if !c.Enabled() {
1725 return
1726 }
1727
Colin Cross37047f12016-12-13 17:06:13 -08001728 ctx := &depsContext{
1729 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07001730 moduleContextImpl: moduleContextImpl{
1731 mod: c,
1732 },
1733 }
1734 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08001735
Colin Crossc99deeb2016-04-11 15:06:20 -07001736 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001737
Yo Chiang219968c2020-09-22 18:45:04 +08001738 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
1739
Dan Albert914449f2016-06-17 16:45:24 -07001740 variantNdkLibs := []string{}
1741 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07001742 if ctx.Os() == android.Android {
Inseob Kimeec88e12020-01-22 11:11:29 +09001743 // rewriteLibs takes a list of names of shared libraries and scans it for three types
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001744 // of names:
Dan Albert914449f2016-06-17 16:45:24 -07001745 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001746 // 1. Name of an NDK library that refers to a prebuilt module.
1747 // For each of these, it adds the name of the prebuilt module (which will be in
1748 // prebuilts/ndk) to the list of nonvariant libs.
1749 // 2. Name of an NDK library that refers to an ndk_library module.
1750 // For each of these, it adds the name of the ndk_library module to the list of
1751 // variant libs.
1752 // 3. Anything else (so anything that isn't an NDK library).
1753 // It adds these to the nonvariantLibs list.
Dan Albert914449f2016-06-17 16:45:24 -07001754 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001755 // The caller can then know to add the variantLibs dependencies differently from the
1756 // nonvariantLibs
Inseob Kim9516ee92019-05-09 10:56:13 +09001757
Inseob Kim9516ee92019-05-09 10:56:13 +09001758 vendorPublicLibraries := vendorPublicLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001759 vendorSnapshotSharedLibs := vendorSnapshotSharedLibs(actx.Config())
1760
1761 rewriteVendorLibs := func(lib string) string {
1762 if isLlndkLibrary(lib, ctx.Config()) {
1763 return lib + llndkLibrarySuffix
1764 }
1765
1766 // only modules with BOARD_VNDK_VERSION uses snapshot.
1767 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1768 return lib
1769 }
1770
1771 if snapshot, ok := vendorSnapshotSharedLibs.get(lib, actx.Arch().ArchType); ok {
1772 return snapshot
1773 }
1774
1775 return lib
1776 }
1777
1778 rewriteLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001779 variantLibs = []string{}
1780 nonvariantLibs = []string{}
Dan Albert914449f2016-06-17 16:45:24 -07001781 for _, entry := range list {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001782 // strip #version suffix out
Jiyong Park73c54ee2019-10-22 20:31:18 +09001783 name, _ := StubsLibNameAndVersion(entry)
Dan Albertde5aade2020-06-30 12:32:51 -07001784 if ctx.useSdk() && inList(name, ndkKnownLibs) {
1785 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Inseob Kimeec88e12020-01-22 11:11:29 +09001786 } else if ctx.useVndk() {
1787 nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
Inseob Kim9516ee92019-05-09 10:56:13 +09001788 } else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, *vendorPublicLibraries) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001789 vendorPublicLib := name + vendorPublicLibrarySuffix
Jiyong Park374510b2018-03-19 18:23:01 +09001790 if actx.OtherModuleExists(vendorPublicLib) {
1791 nonvariantLibs = append(nonvariantLibs, vendorPublicLib)
1792 } else {
1793 // This can happen if vendor_public_library module is defined in a
1794 // namespace that isn't visible to the current module. In that case,
1795 // link to the original library.
Jiyong Park7ed9de32018-10-15 22:25:07 +09001796 nonvariantLibs = append(nonvariantLibs, name)
Jiyong Park374510b2018-03-19 18:23:01 +09001797 }
Dan Albert914449f2016-06-17 16:45:24 -07001798 } else {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001799 // put name#version back
Dan Willemsen7cbf5f82017-03-28 00:08:30 -07001800 nonvariantLibs = append(nonvariantLibs, entry)
Dan Willemsen72d39932016-07-08 23:23:48 -07001801 }
1802 }
Dan Albert914449f2016-06-17 16:45:24 -07001803 return nonvariantLibs, variantLibs
Dan Willemsen72d39932016-07-08 23:23:48 -07001804 }
1805
Inseob Kimeec88e12020-01-22 11:11:29 +09001806 deps.SharedLibs, variantNdkLibs = rewriteLibs(deps.SharedLibs)
1807 deps.LateSharedLibs, variantLateNdkLibs = rewriteLibs(deps.LateSharedLibs)
1808 deps.ReexportSharedLibHeaders, _ = rewriteLibs(deps.ReexportSharedLibHeaders)
1809 if ctx.useVndk() {
1810 for idx, lib := range deps.RuntimeLibs {
1811 deps.RuntimeLibs[idx] = rewriteVendorLibs(lib)
1812 }
1813 }
Dan Willemsen72d39932016-07-08 23:23:48 -07001814 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001815
Jiyong Park7e636d02019-01-28 16:16:54 +09001816 buildStubs := false
Colin Crossc88c2722020-09-28 17:32:47 -07001817 if versioned, ok := c.linker.(versionedInterface); ok {
1818 if versioned.buildStubs() {
1819 buildStubs = true
Colin Crossd48fe732020-09-23 20:37:24 -07001820 }
Jiyong Park7ed9de32018-10-15 22:25:07 +09001821 }
1822
Inseob Kimeec88e12020-01-22 11:11:29 +09001823 rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string {
1824 // only modules with BOARD_VNDK_VERSION uses snapshot.
1825 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1826 return lib
1827 }
1828
1829 if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
1830 return snapshot
1831 }
1832
1833 return lib
1834 }
1835
1836 vendorSnapshotHeaderLibs := vendorSnapshotHeaderLibs(actx.Config())
Colin Cross32ec36c2016-12-15 07:39:51 -08001837 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001838 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08001839 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001840 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08001841 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001842
1843 lib = rewriteSnapshotLibs(lib, vendorSnapshotHeaderLibs)
1844
Jiyong Park7e636d02019-01-28 16:16:54 +09001845 if buildStubs {
Colin Cross7228ecd2019-11-18 16:00:16 -08001846 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07001847 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09001848 } else {
1849 actx.AddVariationDependencies(nil, depTag, lib)
1850 }
1851 }
1852
1853 if buildStubs {
1854 // Stubs lib does not have dependency to other static/shared libraries.
1855 // Don't proceed.
1856 return
Colin Cross32ec36c2016-12-15 07:39:51 -08001857 }
Colin Cross5950f382016-12-13 12:50:57 -08001858
Inseob Kimc0907f12019-02-08 21:00:45 +09001859 syspropImplLibraries := syspropImplLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001860 vendorSnapshotStaticLibs := vendorSnapshotStaticLibs(actx.Config())
Inseob Kimc0907f12019-02-08 21:00:45 +09001861
Jiyong Park5d1598f2019-02-25 22:14:17 +09001862 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001863 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09001864 if impl, ok := syspropImplLibraries[lib]; ok {
1865 lib = impl
1866 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001867
1868 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1869
Jiyong Park5d1598f2019-02-25 22:14:17 +09001870 actx.AddVariationDependencies([]blueprint.Variation{
1871 {Mutator: "link", Variation: "static"},
1872 }, depTag, lib)
1873 }
1874
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001875 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001876 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001877 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001878 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001879 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001880
1881 if impl, ok := syspropImplLibraries[lib]; ok {
1882 lib = impl
1883 }
1884
Inseob Kimeec88e12020-01-22 11:11:29 +09001885 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1886
Dan Willemsen59339a22018-07-22 21:18:45 -07001887 actx.AddVariationDependencies([]blueprint.Variation{
1888 {Mutator: "link", Variation: "static"},
1889 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001890 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001891
Jooyung Han75568392020-03-20 04:29:24 +09001892 // staticUnwinderDep is treated as staticDep for Q apexes
1893 // so that native libraries/binaries are linked with static unwinder
1894 // because Q libc doesn't have unwinder APIs
1895 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07001896 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001897 actx.AddVariationDependencies([]blueprint.Variation{
1898 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001899 }, depTag, rewriteSnapshotLibs(staticUnwinder(actx), vendorSnapshotStaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001900 }
1901
Inseob Kimeec88e12020-01-22 11:11:29 +09001902 for _, lib := range deps.LateStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001903 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Inseob Kimeec88e12020-01-22 11:11:29 +09001904 actx.AddVariationDependencies([]blueprint.Variation{
1905 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001906 }, depTag, rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs))
Inseob Kimeec88e12020-01-22 11:11:29 +09001907 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001908
Jiyong Park7ed9de32018-10-15 22:25:07 +09001909 // shared lib names without the #version suffix
1910 var sharedLibNames []string
1911
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001912 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001913 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001914 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001915 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001916 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001917
1918 if impl, ok := syspropImplLibraries[lib]; ok {
1919 lib = impl
1920 }
1921
Jiyong Park73c54ee2019-10-22 20:31:18 +09001922 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09001923 sharedLibNames = append(sharedLibNames, name)
1924
Colin Crosse7257d22020-09-24 09:56:18 -07001925 variations := []blueprint.Variation{
1926 {Mutator: "link", Variation: "shared"},
1927 }
1928 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001929 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001930
Jiyong Park7ed9de32018-10-15 22:25:07 +09001931 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09001932 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001933 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
1934 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
1935 // linking against both the stubs lib and the non-stubs lib at the same time.
1936 continue
1937 }
Colin Cross6e511a92020-07-27 21:26:48 -07001938 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07001939 variations := []blueprint.Variation{
1940 {Mutator: "link", Variation: "shared"},
1941 }
1942 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09001943 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001944
Dan Willemsen59339a22018-07-22 21:18:45 -07001945 actx.AddVariationDependencies([]blueprint.Variation{
1946 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04001947 }, dataLibDepTag, deps.DataLibs...)
1948
1949 actx.AddVariationDependencies([]blueprint.Variation{
1950 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07001951 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08001952
Colin Cross68861832016-07-08 10:41:41 -07001953 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001954
1955 for _, gen := range deps.GeneratedHeaders {
1956 depTag := genHeaderDepTag
1957 if inList(gen, deps.ReexportGeneratedHeaders) {
1958 depTag = genHeaderExportDepTag
1959 }
1960 actx.AddDependency(c, depTag, gen)
1961 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07001962
Inseob Kim1042d292020-06-01 23:23:05 +09001963 vendorSnapshotObjects := vendorSnapshotObjects(actx.Config())
1964
Dan Albert92fe7402020-07-15 13:33:30 -07001965 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07001966 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc99deeb2016-04-11 15:06:20 -07001967 if deps.CrtBegin != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07001968 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
1969 rewriteSnapshotLibs(deps.CrtBegin, vendorSnapshotObjects))
Colin Crossca860ac2016-01-04 14:34:37 -08001970 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001971 if deps.CrtEnd != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07001972 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
1973 rewriteSnapshotLibs(deps.CrtEnd, vendorSnapshotObjects))
Colin Cross21b9a242015-03-24 14:15:58 -07001974 }
Dan Willemsena0790e32018-10-12 00:24:23 -07001975 if deps.LinkerFlagsFile != "" {
1976 actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
1977 }
1978 if deps.DynamicLinker != "" {
1979 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07001980 }
Dan Albert914449f2016-06-17 16:45:24 -07001981
1982 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07001983
1984 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07001985 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07001986 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07001987 {Mutator: "link", Variation: "shared"},
1988 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07001989
1990 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07001991 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07001992 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07001993 {Mutator: "link", Variation: "shared"},
1994 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08001995
1996 if vndkdep := c.vndkdep; vndkdep != nil {
1997 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08001998 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08001999 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002000 {Mutator: "link", Variation: "shared"},
2001 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002002 }
2003 }
Colin Cross6362e272015-10-29 15:25:03 -07002004}
Colin Cross21b9a242015-03-24 14:15:58 -07002005
Colin Crosse40b4ea2018-10-02 22:25:58 -07002006func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002007 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2008 c.beginMutator(ctx)
2009 }
2010}
2011
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002012// Whether a module can link to another module, taking into
2013// account NDK linking.
Colin Cross6e511a92020-07-27 21:26:48 -07002014func checkLinkType(ctx android.ModuleContext, from LinkableInterface, to LinkableInterface,
2015 tag blueprint.DependencyTag) {
2016
2017 switch t := tag.(type) {
2018 case dependencyTag:
2019 if t != vndkExtDepTag {
2020 return
2021 }
2022 case libraryDependencyTag:
2023 default:
2024 return
2025 }
2026
Ivan Lozano52767be2019-10-18 14:49:46 -07002027 if from.Module().Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002028 // Host code is not restricted
2029 return
2030 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002031
2032 // VNDK is cc.Module supported only for now.
2033 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002034 // Though vendor code is limited by the vendor mutator,
2035 // each vendor-available module needs to check
2036 // link-type for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002037 if ccTo, ok := to.(*Module); ok {
2038 if ccFrom.vndkdep != nil {
2039 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2040 }
2041 } else {
2042 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002043 }
2044 return
2045 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002046 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002047 // Platform code can link to anything
2048 return
2049 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002050 if from.InRamdisk() {
2051 // Ramdisk code is not NDK
2052 return
2053 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002054 if from.InVendorRamdisk() {
2055 // Vendor ramdisk code is not NDK
2056 return
2057 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002058 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002059 // Recovery code is not NDK
2060 return
2061 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002062 if to.ToolchainLibrary() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002063 // These are always allowed
2064 return
2065 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002066 if to.NdkPrebuiltStl() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002067 // These are allowed, but they don't set sdk_version
2068 return
2069 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002070 if to.StubDecorator() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002071 // These aren't real libraries, but are the stub shared libraries that are included in
2072 // the NDK.
2073 return
2074 }
Logan Chien834b9a62019-01-14 15:39:03 +08002075
Ivan Lozano52767be2019-10-18 14:49:46 -07002076 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002077 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2078 // to link to libc++ (non-NDK and without sdk_version).
2079 return
2080 }
2081
Ivan Lozano52767be2019-10-18 14:49:46 -07002082 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002083 // NDK code linking to platform code is never okay.
2084 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002085 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002086 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002087 }
2088
2089 // At this point we know we have two NDK libraries, but we need to
2090 // check that we're not linking against anything built against a higher
2091 // API level, as it is only valid to link against older or equivalent
2092 // APIs.
2093
Inseob Kim01a28722018-04-11 09:48:45 +09002094 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002095 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002096 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002097 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002098 // Current can't be linked against by anything else.
2099 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002100 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002101 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002102 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002103 if err != nil {
2104 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002105 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002106 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002107 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002108 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002109 if err != nil {
2110 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002111 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002112 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002113 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002114
Inseob Kim01a28722018-04-11 09:48:45 +09002115 if toApi > fromApi {
2116 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002117 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002118 }
2119 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002120 }
Dan Albert202fe492017-12-15 13:56:59 -08002121
2122 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002123 fromStl := from.SelectedStl()
2124 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002125 if fromStl == "" || toStl == "" {
2126 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002127 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002128 // We can be permissive with the system "STL" since it is only the C++
2129 // ABI layer, but in the future we should make sure that everyone is
2130 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002131 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002132 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002133 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2134 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002135 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002136}
2137
Jiyong Park5fb8c102018-04-09 12:03:06 +09002138// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002139// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2140// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002141// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002142func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2143 check := func(child, parent android.Module) bool {
2144 to, ok := child.(*Module)
2145 if !ok {
2146 // follow thru cc.Defaults, etc.
2147 return true
2148 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002149
Jooyung Hana70f0672019-01-18 15:20:43 +09002150 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2151 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002152 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002153
2154 // if target lib has no vendor variant, keep checking dependency graph
Ivan Lozano52767be2019-10-18 14:49:46 -07002155 if !to.HasVendorVariant() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002156 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002157 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002158
Jooyung Han0302a842019-10-30 18:43:49 +09002159 if to.isVndkSp() || to.isLlndk(ctx.Config()) || Bool(to.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002160 return false
2161 }
2162
2163 var stringPath []string
2164 for _, m := range ctx.GetWalkPath() {
2165 stringPath = append(stringPath, m.Name())
2166 }
2167 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2168 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
2169 "(dependency: %s)", ctx.OtherModuleName(to), strings.Join(stringPath, " -> "))
2170 return false
2171 }
2172 if module, ok := ctx.Module().(*Module); ok {
2173 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jooyung Han0302a842019-10-30 18:43:49 +09002174 if module.isLlndk(ctx.Config()) || Bool(module.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002175 ctx.WalkDeps(check)
2176 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002177 }
2178 }
2179}
2180
Colin Cross0de8a1e2020-09-18 14:15:30 -07002181// Returns the highest version which is <= maxSdkVersion.
2182// For example, with maxSdkVersion is 10 and versionList is [9,11]
2183// it returns 9 as string. The list of stubs must be in order from
2184// oldest to newest.
2185func (c *Module) chooseSdkVersion(ctx android.PathContext, stubsInfo []SharedLibraryStubsInfo,
2186 maxSdkVersion android.ApiLevel) (SharedLibraryStubsInfo, error) {
2187
2188 for i := range stubsInfo {
2189 stubInfo := stubsInfo[len(stubsInfo)-i-1]
2190 var ver android.ApiLevel
2191 if stubInfo.Version == "" {
2192 ver = android.FutureApiLevel
2193 } else {
2194 var err error
2195 ver, err = android.ApiLevelFromUser(ctx, stubInfo.Version)
2196 if err != nil {
2197 return SharedLibraryStubsInfo{}, err
2198 }
2199 }
2200 if ver.LessThanOrEqualTo(maxSdkVersion) {
2201 return stubInfo, nil
2202 }
2203 }
2204 var versionList []string
2205 for _, stubInfo := range stubsInfo {
2206 versionList = append(versionList, stubInfo.Version)
2207 }
2208 return SharedLibraryStubsInfo{}, fmt.Errorf("not found a version(<=%s) in versionList: %v", maxSdkVersion.String(), versionList)
2209}
2210
Colin Crossc99deeb2016-04-11 15:06:20 -07002211// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002212func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002213 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002214
Colin Cross0de8a1e2020-09-18 14:15:30 -07002215 var directStaticDeps []StaticLibraryInfo
2216 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002217
Colin Cross0de8a1e2020-09-18 14:15:30 -07002218 reexportExporter := func(exporter FlagExporterInfo) {
2219 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2220 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2221 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2222 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2223 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002224 }
2225
Jooyung Hande34d232020-07-23 13:04:15 +09002226 // For the dependency from platform to apex, use the latest stubs
2227 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002228 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2229 if !apexInfo.IsForPlatform() {
2230 c.apexSdkVersion = apexInfo.MinSdkVersion(ctx)
Jooyung Hande34d232020-07-23 13:04:15 +09002231 }
2232
2233 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2234 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2235 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2236 // (b/144430859)
2237 c.apexSdkVersion = android.FutureApiLevel
2238 }
2239
Colin Crossd11fcda2017-10-23 17:59:01 -07002240 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002241 depName := ctx.OtherModuleName(dep)
2242 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002243
Ivan Lozano52767be2019-10-18 14:49:46 -07002244 ccDep, ok := dep.(LinkableInterface)
2245 if !ok {
2246
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002247 // handling for a few module types that aren't cc Module but that are also supported
2248 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002249 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002250 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002251 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2252 genRule.GeneratedSourceFiles()...)
2253 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002254 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002255 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002256 // Support exported headers from a generated_sources dependency
2257 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002258 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002259 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002260 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002261 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002262 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002263 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002264 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002265 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002266 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2267 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002268 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002269 // 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 +09002270 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002271
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002272 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002273 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002274 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002275 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002276 case linkerFlagsDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002277 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002278 files := genRule.GeneratedSourceFiles()
2279 if len(files) == 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002280 depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002281 } else if len(files) > 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002282 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 -07002283 }
2284 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002285 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002286 }
Colin Crossca860ac2016-01-04 14:34:37 -08002287 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002288 return
2289 }
2290
Colin Crossfe17f6f2019-03-28 19:30:56 -07002291 if depTag == android.ProtoPluginDepTag {
2292 return
2293 }
Jooyung Han61b66e92020-03-21 14:21:46 +00002294 if depTag == llndkImplDep {
2295 return
2296 }
Colin Crossfe17f6f2019-03-28 19:30:56 -07002297
Colin Crossd11fcda2017-10-23 17:59:01 -07002298 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002299 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2300 return
2301 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002302 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002303 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2304 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002305 return
2306 }
2307
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002308 if depTag == reuseObjTag {
Ivan Lozano52767be2019-10-18 14:49:46 -07002309 // reusing objects only make sense for cc.Modules.
Colin Cross0de8a1e2020-09-18 14:15:30 -07002310 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2311 objs := staticAnalogue.ReuseObjects
2312 depPaths.Objs = depPaths.Objs.Append(objs)
2313 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2314 reexportExporter(depExporterInfo)
2315 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002316 }
2317
Colin Cross6e511a92020-07-27 21:26:48 -07002318 checkLinkType(ctx, c, ccDep, depTag)
2319
2320 linkFile := ccDep.OutputFile()
2321
2322 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2323 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002324 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002325 return
2326 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002327
Colin Cross0de8a1e2020-09-18 14:15:30 -07002328 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002329
Colin Cross6e511a92020-07-27 21:26:48 -07002330 var ptr *android.Paths
2331 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002332
Colin Cross6e511a92020-07-27 21:26:48 -07002333 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002334
Colin Cross6e511a92020-07-27 21:26:48 -07002335 switch {
2336 case libDepTag.header():
2337 // nothing
2338 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002339 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2340 if !ctx.Config().AllowMissingDependencies() {
2341 ctx.ModuleErrorf("module %q is not a shared library", depName)
2342 } else {
2343 ctx.AddMissingDependencies([]string{depName})
2344 }
2345 return
2346 }
2347 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
2348 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryImplementationStubsInfoProvider).(SharedLibraryImplementationStubsInfo)
2349
2350 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedLibraryStubsInfos) > 0 {
2351 useStubs := false
2352 if m, ok := ccDep.(*Module); ok && m.IsStubs() && c.UseVndk() { // LLNDK
2353 if !apexInfo.IsForPlatform() {
2354 // For platform libraries, use current version of LLNDK
2355 // If this is for use_vendor apex we will apply the same rules
2356 // of apex sdk enforcement below to choose right version.
2357 useStubs = true
2358 }
2359 } else if apexInfo.IsForPlatform() {
2360 // If not building for APEX, use stubs only when it is from
2361 // an APEX (and not from platform)
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002362 // However, for host, ramdisk, vendor_ramdisk, recovery or bootstrap modules,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002363 // always link to non-stub variant
2364 useStubs = dep.(android.ApexModule).AnyVariantDirectlyInAnyApex() && !c.bootstrap()
2365 // Another exception: if this module is bundled with an APEX, then
2366 // it is linked with the non-stub variant of a module in the APEX
2367 // as if this is part of the APEX.
2368 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
2369 for _, apexContents := range testFor.ApexContents {
2370 if apexContents.DirectlyInApex(depName) {
2371 useStubs = false
2372 break
2373 }
2374 }
2375 } else {
2376 // If building for APEX, use stubs when the parent is in any APEX that
2377 // the child is not in.
2378 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
2379 }
2380
2381 // when to use (unspecified) stubs, check min_sdk_version and choose the right one
2382 if useStubs {
2383 sharedLibraryStubsInfo, err :=
2384 c.chooseSdkVersion(ctx, sharedLibraryStubsInfo.SharedLibraryStubsInfos, c.apexSdkVersion)
2385 if err != nil {
2386 ctx.OtherModuleErrorf(dep, err.Error())
2387 return
2388 }
2389 sharedLibraryInfo = sharedLibraryStubsInfo.SharedLibraryInfo
2390 depExporterInfo = sharedLibraryStubsInfo.FlagExporterInfo
2391 }
2392 }
2393
2394 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2395 depFile = sharedLibraryInfo.TableOfContents
2396
Colin Cross6e511a92020-07-27 21:26:48 -07002397 ptr = &depPaths.SharedLibs
2398 switch libDepTag.Order {
2399 case earlyLibraryDependency:
2400 ptr = &depPaths.EarlySharedLibs
2401 depPtr = &depPaths.EarlySharedLibsDeps
2402 case normalLibraryDependency:
2403 ptr = &depPaths.SharedLibs
2404 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002405 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002406 case lateLibraryDependency:
2407 ptr = &depPaths.LateSharedLibs
2408 depPtr = &depPaths.LateSharedLibsDeps
2409 default:
2410 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002411 }
Colin Cross6e511a92020-07-27 21:26:48 -07002412 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002413 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2414 if !ctx.Config().AllowMissingDependencies() {
2415 ctx.ModuleErrorf("module %q is not a static library", depName)
2416 } else {
2417 ctx.AddMissingDependencies([]string{depName})
2418 }
2419 return
2420 }
2421 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2422 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002423 if libDepTag.wholeStatic {
2424 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002425 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2426 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002427 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002428 // This case normally catches prebuilt static
2429 // libraries, but it can also occur when
2430 // AllowMissingDependencies is on and the
2431 // dependencies has no sources of its own
2432 // but has a whole_static_libs dependency
2433 // on a missing library. We want to depend
2434 // on the .a file so that there is something
2435 // in the dependency tree that contains the
2436 // error rule for the missing transitive
2437 // dependency.
2438 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002439 }
Colin Cross6e511a92020-07-27 21:26:48 -07002440 } else {
2441 switch libDepTag.Order {
2442 case earlyLibraryDependency:
2443 panic(fmt.Errorf("early static libs not suppported"))
2444 case normalLibraryDependency:
2445 // static dependencies will be handled separately so they can be ordered
2446 // using transitive dependencies.
2447 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002448 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002449 case lateLibraryDependency:
2450 ptr = &depPaths.LateStaticLibs
2451 default:
2452 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002453 }
2454 }
2455 }
2456
Colin Cross6e511a92020-07-27 21:26:48 -07002457 if libDepTag.static() && !libDepTag.wholeStatic {
2458 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2459 ctx.ModuleErrorf("module %q not a static library", depName)
2460 return
2461 }
Logan Chien43d34c32017-12-20 01:17:32 +08002462
Colin Cross6e511a92020-07-27 21:26:48 -07002463 // When combining coverage files for shared libraries and executables, coverage files
2464 // in static libraries act as if they were whole static libraries. The same goes for
2465 // source based Abi dump files.
2466 if c, ok := ccDep.(*Module); ok {
2467 staticLib := c.linker.(libraryInterface)
2468 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2469 staticLib.objs().coverageFiles...)
2470 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2471 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002472 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002473 // Handle non-CC modules here
2474 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002475 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002476 }
2477 }
2478
Colin Cross6e511a92020-07-27 21:26:48 -07002479 if ptr != nil {
2480 if !linkFile.Valid() {
2481 if !ctx.Config().AllowMissingDependencies() {
2482 ctx.ModuleErrorf("module %q missing output file", depName)
2483 } else {
2484 ctx.AddMissingDependencies([]string{depName})
2485 }
2486 return
2487 }
2488 *ptr = append(*ptr, linkFile.Path())
2489 }
2490
2491 if depPtr != nil {
2492 dep := depFile
2493 if !dep.Valid() {
2494 dep = linkFile
2495 }
2496 *depPtr = append(*depPtr, dep.Path())
2497 }
2498
Colin Cross0de8a1e2020-09-18 14:15:30 -07002499 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2500 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2501 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2502 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2503
2504 if libDepTag.reexportFlags {
2505 reexportExporter(depExporterInfo)
2506 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2507 // Re-exported shared library headers must be included as well since they can help us with type information
2508 // about template instantiations (instantiated from their headers).
2509 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2510 // scripts.
2511 c.sabi.Properties.ReexportedIncludes = append(
2512 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2513 }
2514
Colin Cross6e511a92020-07-27 21:26:48 -07002515 makeLibName := c.makeLibName(ctx, ccDep, depName) + libDepTag.makeSuffix
2516 switch {
2517 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002518 c.Properties.AndroidMkHeaderLibs = append(
2519 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002520 case libDepTag.shared():
2521 if ccDep.CcLibrary() {
Colin Cross56a83212020-09-15 18:30:11 -07002522 if ccDep.BuildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002523 // Add the dependency to the APEX(es) providing the library so that
2524 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002525 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
2526 for _, an := range depApexInfo.InApexes {
Colin Cross6e511a92020-07-27 21:26:48 -07002527 c.Properties.ApexesProvidingSharedLibs = append(
2528 c.Properties.ApexesProvidingSharedLibs, an)
2529 }
2530 }
2531 }
2532
2533 // Note: the order of libs in this list is not important because
2534 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002535 c.Properties.AndroidMkSharedLibs = append(
2536 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002537 // Record baseLibName for snapshots.
2538 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, baseLibName(depName))
2539 case libDepTag.static():
2540 if libDepTag.wholeStatic {
2541 c.Properties.AndroidMkWholeStaticLibs = append(
2542 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2543 } else {
2544 c.Properties.AndroidMkStaticLibs = append(
2545 c.Properties.AndroidMkStaticLibs, makeLibName)
2546 }
2547 }
2548 } else {
2549 switch depTag {
2550 case runtimeDepTag:
2551 c.Properties.AndroidMkRuntimeLibs = append(
2552 c.Properties.AndroidMkRuntimeLibs, c.makeLibName(ctx, ccDep, depName)+libDepTag.makeSuffix)
2553 // Record baseLibName for snapshots.
2554 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, baseLibName(depName))
2555 case objDepTag:
2556 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2557 case CrtBeginDepTag:
2558 depPaths.CrtBegin = linkFile
2559 case CrtEndDepTag:
2560 depPaths.CrtEnd = linkFile
2561 case dynamicLinkerDepTag:
2562 depPaths.DynamicLinker = linkFile
2563 }
Jiyong Park27b188b2017-07-18 13:23:39 +09002564 }
Colin Crossca860ac2016-01-04 14:34:37 -08002565 })
2566
Jeff Gaston294356f2017-09-27 17:05:30 -07002567 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07002568 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
2569 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
2570 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07002571
Colin Crossdd84e052017-05-17 13:44:16 -07002572 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07002573 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09002574 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
2575 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09002576 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09002577 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
2578 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07002579 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09002580 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09002581 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002582
2583 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09002584 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002585 }
Colin Crossdd84e052017-05-17 13:44:16 -07002586
Colin Crossca860ac2016-01-04 14:34:37 -08002587 return depPaths
2588}
2589
Colin Cross0de8a1e2020-09-18 14:15:30 -07002590// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
2591// to match the topological order of the dependency tree, including any static analogues of
2592// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
2593// of the transitive dependencies.
2594func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
2595 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
2596 var staticPaths android.Paths
2597 for _, staticDep := range staticDeps {
2598 staticPaths = append(staticPaths, staticDep.StaticLibrary)
2599 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
2600 }
2601 for _, sharedDep := range sharedDeps {
2602 if sharedDep.StaticAnalogue != nil {
2603 transitiveStaticLibsBuilder.Transitive(sharedDep.StaticAnalogue.TransitiveStaticLibrariesForOrdering)
2604 }
2605 }
2606 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
2607
2608 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
2609
2610 // reorder the dependencies based on transitive dependencies
2611 staticPaths = android.FirstUniquePaths(staticPaths)
2612 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
2613
2614 if len(orderedStaticPaths) != len(staticPaths) {
2615 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
2616 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
2617 }
2618
2619 return orderedStaticPaths, transitiveStaticLibs
2620}
2621
Colin Cross6e511a92020-07-27 21:26:48 -07002622// baseLibName trims known prefixes and suffixes
2623func baseLibName(depName string) string {
2624 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
2625 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
2626 libName = strings.TrimPrefix(libName, "prebuilt_")
2627 return libName
2628}
2629
2630func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, depName string) string {
2631 vendorSuffixModules := vendorSuffixModules(ctx.Config())
2632 vendorPublicLibraries := vendorPublicLibraries(ctx.Config())
2633
2634 libName := baseLibName(depName)
2635 isLLndk := isLlndkLibrary(libName, ctx.Config())
2636 isVendorPublicLib := inList(libName, *vendorPublicLibraries)
2637 bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk
2638
2639 if c, ok := ccDep.(*Module); ok {
2640 // Use base module name for snapshots when exporting to Makefile.
2641 if c.isSnapshotPrebuilt() {
2642 baseName := c.BaseModuleName()
2643
2644 if c.IsVndk() {
2645 return baseName + ".vendor"
2646 }
2647
2648 if vendorSuffixModules[baseName] {
2649 return baseName + ".vendor"
2650 } else {
2651 return baseName
2652 }
2653 }
2654 }
2655
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002656 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
2657 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07002658 // The vendor module is a no-vendor-variant VNDK library. Depend on the
2659 // core module instead.
2660 return libName
2661 } else if c.UseVndk() && bothVendorAndCoreVariantsExist {
2662 // The vendor module in Make will have been renamed to not conflict with the core
2663 // module, so update the dependency name here accordingly.
2664 return libName + c.getNameSuffixWithVndkVersion(ctx)
2665 } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
2666 return libName + vendorPublicLibrarySuffix
2667 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
2668 return libName + ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002669 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
2670 return libName + vendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07002671 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
2672 return libName + recoverySuffix
2673 } else if ccDep.Module().Target().NativeBridge == android.NativeBridgeEnabled {
2674 return libName + nativeBridgeSuffix
2675 } else {
2676 return libName
2677 }
2678}
2679
Colin Crossca860ac2016-01-04 14:34:37 -08002680func (c *Module) InstallInData() bool {
2681 if c.installer == nil {
2682 return false
2683 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002684 return c.installer.inData()
2685}
2686
2687func (c *Module) InstallInSanitizerDir() bool {
2688 if c.installer == nil {
2689 return false
2690 }
2691 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07002692 return true
2693 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002694 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08002695}
2696
Yifan Hong1b3348d2020-01-21 15:53:22 -08002697func (c *Module) InstallInRamdisk() bool {
2698 return c.InRamdisk()
2699}
2700
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002701func (c *Module) InstallInVendorRamdisk() bool {
2702 return c.InVendorRamdisk()
2703}
2704
Jiyong Parkf9332f12018-02-01 00:54:12 +09002705func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07002706 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002707}
2708
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002709func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002710 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002711 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002712 return
2713 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002714 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002715}
2716
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07002717func (c *Module) HostToolPath() android.OptionalPath {
2718 if c.installer == nil {
2719 return android.OptionalPath{}
2720 }
2721 return c.installer.hostToolPath()
2722}
2723
Nan Zhangd4e641b2017-07-12 12:55:28 -07002724func (c *Module) IntermPathForModuleOut() android.OptionalPath {
2725 return c.outputFile
2726}
2727
Colin Cross41955e82019-05-29 14:40:35 -07002728func (c *Module) OutputFiles(tag string) (android.Paths, error) {
2729 switch tag {
2730 case "":
2731 if c.outputFile.Valid() {
2732 return android.Paths{c.outputFile.Path()}, nil
2733 }
2734 return android.Paths{}, nil
2735 default:
2736 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002737 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002738}
2739
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00002740func (c *Module) static() bool {
2741 if static, ok := c.linker.(interface {
2742 static() bool
2743 }); ok {
2744 return static.static()
2745 }
2746 return false
2747}
2748
Jiyong Park379de2f2018-12-19 02:47:14 +09002749func (c *Module) staticBinary() bool {
2750 if static, ok := c.linker.(interface {
2751 staticBinary() bool
2752 }); ok {
2753 return static.staticBinary()
2754 }
2755 return false
2756}
2757
Jiyong Park1d1119f2019-07-29 21:27:18 +09002758func (c *Module) header() bool {
2759 if h, ok := c.linker.(interface {
2760 header() bool
2761 }); ok {
2762 return h.header()
2763 }
2764 return false
2765}
2766
Inseob Kim7f283f42020-06-01 21:53:49 +09002767func (c *Module) binary() bool {
2768 if b, ok := c.linker.(interface {
2769 binary() bool
2770 }); ok {
2771 return b.binary()
2772 }
2773 return false
2774}
2775
Inseob Kim1042d292020-06-01 23:23:05 +09002776func (c *Module) object() bool {
2777 if o, ok := c.linker.(interface {
2778 object() bool
2779 }); ok {
2780 return o.object()
2781 }
2782 return false
2783}
2784
Jooyung Han38002912019-05-16 04:01:54 +09002785func (c *Module) getMakeLinkType(actx android.ModuleContext) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07002786 if c.UseVndk() {
Jooyung Han38002912019-05-16 04:01:54 +09002787 if lib, ok := c.linker.(*llndkStubDecorator); ok {
2788 if Bool(lib.Properties.Vendor_available) {
Colin Crossb60190a2018-09-04 16:28:17 -07002789 return "native:vndk"
2790 }
Jooyung Han38002912019-05-16 04:01:54 +09002791 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07002792 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002793 if c.IsVndk() && !c.isVndkExt() {
Jooyung Han38002912019-05-16 04:01:54 +09002794 if Bool(c.VendorProperties.Vendor_available) {
2795 return "native:vndk"
2796 }
2797 return "native:vndk_private"
2798 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09002799 if c.inProduct() {
2800 return "native:product"
2801 }
Jooyung Han38002912019-05-16 04:01:54 +09002802 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08002803 } else if c.InRamdisk() {
2804 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002805 } else if c.InVendorRamdisk() {
2806 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07002807 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07002808 return "native:recovery"
2809 } else if c.Target().Os == android.Android && String(c.Properties.Sdk_version) != "" {
2810 return "native:ndk:none:none"
2811 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
2812 //family, link := getNdkStlFamilyAndLinkType(c)
2813 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07002814 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08002815 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07002816 } else {
2817 return "native:platform"
2818 }
2819}
2820
Jiyong Park9d452992018-10-03 00:38:19 +09002821// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01002822// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09002823func (c *Module) IsInstallableToApex() bool {
2824 if shared, ok := c.linker.(interface {
2825 shared() bool
2826 }); ok {
Jiyong Park73c54ee2019-10-22 20:31:18 +09002827 // Stub libs and prebuilt libs in a versioned SDK are not
2828 // installable to APEX even though they are shared libs.
2829 return shared.shared() && !c.IsStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01002830 } else if _, ok := c.linker.(testPerSrc); ok {
2831 return true
Jiyong Park9d452992018-10-03 00:38:19 +09002832 }
2833 return false
2834}
2835
Jiyong Parka90ca002019-10-07 15:47:24 +09002836func (c *Module) AvailableFor(what string) bool {
2837 if linker, ok := c.linker.(interface {
2838 availableFor(string) bool
2839 }); ok {
2840 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
2841 } else {
2842 return c.ApexModuleBase.AvailableFor(what)
2843 }
2844}
2845
Jiyong Park62304bb2020-04-13 16:19:48 +09002846func (c *Module) TestFor() []string {
2847 if test, ok := c.linker.(interface {
2848 testFor() []string
2849 }); ok {
2850 return test.testFor()
2851 } else {
2852 return c.ApexModuleBase.TestFor()
2853 }
2854}
2855
Colin Crossaede88c2020-08-11 12:17:01 -07002856func (c *Module) UniqueApexVariations() bool {
2857 if u, ok := c.compiler.(interface {
2858 uniqueApexVariations() bool
2859 }); ok {
2860 return u.uniqueApexVariations()
2861 } else {
2862 return false
2863 }
2864}
2865
Paul Duffin0cb37b92020-03-04 14:52:46 +00002866// Return true if the module is ever installable.
2867func (c *Module) EverInstallable() bool {
2868 return c.installer != nil &&
2869 // Check to see whether the module is actually ever installable.
2870 c.installer.everInstallable()
2871}
2872
Colin Cross56a83212020-09-15 18:30:11 -07002873func (c *Module) installable(apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00002874 ret := c.EverInstallable() &&
2875 // Check to see whether the module has been configured to not be installed.
2876 proptools.BoolDefault(c.Properties.Installable, true) &&
2877 !c.Properties.PreventInstall && c.outputFile.Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002878
2879 // The platform variant doesn't need further condition. Apex variants however might not
2880 // be installable because it will likely to be included in the APEX and won't appear
2881 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07002882 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002883 return ret
2884 }
2885
2886 // Special case for modules that are configured to be installed to /data, which includes
2887 // test modules. For these modules, both APEX and non-APEX variants are considered as
2888 // installable. This is because even the APEX variants won't be included in the APEX, but
2889 // will anyway be installed to /data/*.
2890 // See b/146995717
2891 if c.InstallInData() {
2892 return ret
2893 }
2894
2895 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09002896}
2897
Logan Chien41eabe62019-04-10 13:33:58 +08002898func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
2899 if c.linker != nil {
2900 if library, ok := c.linker.(*libraryDecorator); ok {
2901 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
2902 }
2903 }
2904}
2905
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002906func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07002907 depTag := ctx.OtherModuleDependencyTag(dep)
2908 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
2909
2910 if cc, ok := dep.(*Module); ok {
2911 if cc.HasStubsVariants() {
2912 if isLibDepTag && libDepTag.shared() {
2913 // dynamic dep to a stubs lib crosses APEX boundary
2914 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09002915 }
Colin Cross6e511a92020-07-27 21:26:48 -07002916 if IsRuntimeDepTag(depTag) {
2917 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09002918 return false
2919 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002920 }
Colin Crossaac32222020-07-29 12:51:56 -07002921 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07002922 // shared_lib dependency from a static lib is considered as crossing
2923 // the APEX boundary because the dependency doesn't actually is
2924 // linked; the dependency is used only during the compilation phase.
2925 return false
2926 }
2927 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002928 if depTag == stubImplDepTag || depTag == llndkImplDep {
2929 // We don't track beyond LLNDK or from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09002930 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002931 }
2932 return true
2933}
2934
Dan Albertc8060532020-07-22 22:32:17 -07002935func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
2936 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09002937 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
2938 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
2939 return nil
2940 }
2941 // b/154569636: set min_sdk_version correctly for toolchain_libraries
2942 if c.ToolchainLibrary() {
2943 return nil
2944 }
2945 // We don't check for prebuilt modules
2946 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
2947 return nil
2948 }
2949 minSdkVersion := c.MinSdkVersion()
2950 if minSdkVersion == "apex_inherit" {
2951 return nil
2952 }
2953 if minSdkVersion == "" {
2954 // JNI libs within APK-in-APEX fall into here
2955 // Those are okay to set sdk_version instead
2956 // We don't have to check if this is a SDK variant because
2957 // non-SDK variant resets sdk_version, which works too.
2958 minSdkVersion = c.SdkVersion()
2959 }
Dan Albertc8060532020-07-22 22:32:17 -07002960 if minSdkVersion == "" {
2961 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
2962 }
2963 // Not using nativeApiLevelFromUser because the context here is not
2964 // necessarily a native context.
2965 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09002966 if err != nil {
2967 return err
2968 }
Dan Albertc8060532020-07-22 22:32:17 -07002969
2970 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09002971 return fmt.Errorf("newer SDK(%v)", ver)
2972 }
2973 return nil
2974}
2975
Colin Cross2ba19d92015-05-07 15:44:20 -07002976//
Colin Crosscfad1192015-11-02 16:43:11 -08002977// Defaults
2978//
Colin Crossca860ac2016-01-04 14:34:37 -08002979type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07002980 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07002981 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09002982 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08002983}
2984
Patrice Arrudac249c712019-03-19 17:00:29 -07002985// cc_defaults provides a set of properties that can be inherited by other cc
2986// modules. A module can use the properties from a cc_defaults using
2987// `defaults: ["<:default_module_name>"]`. Properties of both modules are
2988// merged (when possible) by prepending the default module's values to the
2989// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07002990func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07002991 return DefaultsFactory()
2992}
2993
Colin Cross36242852017-06-23 15:06:31 -07002994func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08002995 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08002996
Colin Cross36242852017-06-23 15:06:31 -07002997 module.AddProperties(props...)
2998 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08002999 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003000 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003001 &BaseCompilerProperties{},
3002 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003003 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003004 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003005 &StaticProperties{},
3006 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003007 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003008 &BinaryLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003009 &TestProperties{},
3010 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003011 &BenchmarkProperties{},
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -07003012 &FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003013 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003014 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003015 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003016 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003017 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003018 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003019 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003020 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003021 &LTOProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003022 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003023 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003024 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3025 &RustBindgenClangProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003026 )
Colin Crosscfad1192015-11-02 16:43:11 -08003027
Jooyung Hancc372c52019-09-25 15:18:44 +09003028 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003029
3030 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003031}
3032
Jiyong Park6a43f042017-10-12 23:05:00 +09003033func squashVendorSrcs(m *Module) {
3034 if lib, ok := m.compiler.(*libraryDecorator); ok {
3035 lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
3036 lib.baseCompiler.Properties.Target.Vendor.Srcs...)
3037
3038 lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
3039 lib.baseCompiler.Properties.Target.Vendor.Exclude_srcs...)
Jooyung Hanac07f882020-07-05 03:54:35 +09003040
3041 lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
3042 lib.baseCompiler.Properties.Target.Vendor.Exclude_generated_sources...)
Jiyong Park6a43f042017-10-12 23:05:00 +09003043 }
3044}
3045
Jiyong Parkf9332f12018-02-01 00:54:12 +09003046func squashRecoverySrcs(m *Module) {
3047 if lib, ok := m.compiler.(*libraryDecorator); ok {
3048 lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
3049 lib.baseCompiler.Properties.Target.Recovery.Srcs...)
3050
3051 lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
3052 lib.baseCompiler.Properties.Target.Recovery.Exclude_srcs...)
Jooyung Hanac07f882020-07-05 03:54:35 +09003053
3054 lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
3055 lib.baseCompiler.Properties.Target.Recovery.Exclude_generated_sources...)
Jiyong Parkf9332f12018-02-01 00:54:12 +09003056 }
3057}
3058
Jiyong Park2286afd2020-06-16 21:58:53 +09003059func (c *Module) IsSdkVariant() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07003060 return c.Properties.IsSdkVariant || c.AlwaysSdk()
Jiyong Park2286afd2020-06-16 21:58:53 +09003061}
3062
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003063func kytheExtractAllFactory() android.Singleton {
3064 return &kytheExtractAllSingleton{}
3065}
3066
3067type kytheExtractAllSingleton struct {
3068}
3069
3070func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3071 var xrefTargets android.Paths
3072 ctx.VisitAllModules(func(module android.Module) {
3073 if ccModule, ok := module.(xref); ok {
3074 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3075 }
3076 })
3077 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3078 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003079 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003080 }
3081}
3082
Colin Cross06a931b2015-10-28 17:23:31 -07003083var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003084var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003085var BoolPtr = proptools.BoolPtr
3086var String = proptools.String
3087var StringPtr = proptools.StringPtr