blob: be1ab8cb122a6425b38f19cc599efe0c83901b30 [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
Jiyong Parkf9332f12018-02-01 00:54:12 +0900260 // Make this module available when building for recovery
261 Recovery_available *bool
262
Colin Crossae6c5202019-11-20 13:35:50 -0800263 // Set by imageMutator
Colin Cross7228ecd2019-11-18 16:00:16 -0800264 CoreVariantNeeded bool `blueprint:"mutated"`
Yifan Hong1b3348d2020-01-21 15:53:22 -0800265 RamdiskVariantNeeded bool `blueprint:"mutated"`
Colin Cross7228ecd2019-11-18 16:00:16 -0800266 RecoveryVariantNeeded bool `blueprint:"mutated"`
Justin Yun5f7f7e82019-11-18 19:52:14 +0900267 ExtraVariants []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900268
269 // Allows this module to use non-APEX version of libraries. Useful
270 // for building binaries that are started before APEXes are activated.
271 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900272
273 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
274 // see soong/cc/config/vndk.go
275 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900276
277 // Used by vendor snapshot to record dependencies from snapshot modules.
278 SnapshotSharedLibs []string `blueprint:"mutated"`
279 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000280
281 Installable *bool
Colin Crossc511bc52020-04-07 16:50:32 +0000282
283 // Set by factories of module types that can only be referenced from variants compiled against
284 // the SDK.
285 AlwaysSdk bool `blueprint:"mutated"`
286
287 // Variant is an SDK variant created by sdkMutator
288 IsSdkVariant bool `blueprint:"mutated"`
289 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
290 // variant to have a ".sdk" suffix.
291 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700292
293 // Normally Soong uses the directory structure to decide which modules
294 // should be included (framework) or excluded (non-framework) from the
295 // vendor snapshot, but this property allows a partner to exclude a
296 // module normally thought of as a framework module from the vendor
297 // snapshot.
298 Exclude_from_vendor_snapshot *bool
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700299}
300
301type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900302 // whether this module should be allowed to be directly depended by other
303 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun5f7f7e82019-11-18 19:52:14 +0900304 // In addition, this module should be allowed to be directly depended by
305 // product modules with `product_specific: true`.
306 // If set to true, three variants will be built separately, one like
307 // normal, another limited to the set of libraries and headers
308 // that are exposed to /vendor modules, and the other to /product modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700309 //
Justin Yun5f7f7e82019-11-18 19:52:14 +0900310 // The vendor and product variants may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700311 // so it shouldn't have any unversioned runtime dependencies, or
312 // make assumptions about the system that may not be true in the
313 // future.
314 //
Justin Yun5f7f7e82019-11-18 19:52:14 +0900315 // If set to false, this module becomes inaccessible from /vendor or /product
316 // modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900317 //
318 // Default value is true when vndk: {enabled: true} or vendor: true.
319 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700320 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
Justin Yun5f7f7e82019-11-18 19:52:14 +0900321 // If PRODUCT_PRODUCT_VNDK_VERSION isn't set, product variant will not be used.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700322 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900323
324 // whether this module is capable of being loaded with other instance
325 // (possibly an older version) of the same module in the same process.
326 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
327 // can be double loaded in a vendor process if the library is also a
328 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
329 // explicitly marked as `double_loadable: true` by the owner, or the dependency
330 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
331 Double_loadable *bool
Colin Crossca860ac2016-01-04 14:34:37 -0800332}
333
Colin Crossca860ac2016-01-04 14:34:37 -0800334type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800335 static() bool
336 staticBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900337 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900338 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900339 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700340 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900341 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700342 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800343 sdkVersion() string
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700344 useVndk() bool
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800345 isNdk() bool
Inseob Kim9516ee92019-05-09 10:56:13 +0900346 isLlndk(config android.Config) bool
347 isLlndkPublic(config android.Config) bool
348 isVndkPrivate(config android.Config) bool
Justin Yun8effde42017-06-23 19:24:43 +0900349 isVndk() bool
350 isVndkSp() bool
Logan Chienf3511742017-10-31 18:04:35 +0800351 isVndkExt() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900352 inProduct() bool
353 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800354 inRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900355 inRecovery() bool
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +0800356 shouldCreateSourceAbiDump() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700357 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700358 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800359 getVndkExtendsModuleName() string
Yi Kong7e53c572018-02-14 18:16:12 +0800360 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800361 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800362 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800363 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700364 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700365 apexSdkVersion() android.ApiLevel
Jiyong Parkb0788572018-12-20 22:10:17 +0900366 hasStubsVariants() bool
367 isStubs() bool
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900368 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800369 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700370 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700371 directlyInAnyApex() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800372}
373
374type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700375 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800376 ModuleContextIntf
377}
378
379type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700380 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800381 ModuleContextIntf
382}
383
Colin Cross37047f12016-12-13 17:06:13 -0800384type DepsContext interface {
385 android.BottomUpMutatorContext
386 ModuleContextIntf
387}
388
Colin Crossca860ac2016-01-04 14:34:37 -0800389type feature interface {
390 begin(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800391 deps(ctx DepsContext, deps Deps) Deps
Colin Crossca860ac2016-01-04 14:34:37 -0800392 flags(ctx ModuleContext, flags Flags) Flags
393 props() []interface{}
394}
395
396type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700397 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800398 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800399 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700400 compilerProps() []interface{}
401
Colin Cross76fada02016-07-27 10:31:13 -0700402 appendCflags([]string)
403 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700404 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800405}
406
407type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700408 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800409 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700410 linkerFlags(ctx ModuleContext, flags Flags) Flags
411 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800412 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700413
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700414 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700415 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900416 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700417
418 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900419 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000420
421 // Get the deps that have been explicitly specified in the properties.
422 // Only updates the
423 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
424}
425
426type specifiedDeps struct {
427 sharedLibs []string
Martin Stjernholm10566a02020-03-24 01:19:52 +0000428 systemSharedLibs []string // Note nil and [] are semantically distinct.
Colin Crossca860ac2016-01-04 14:34:37 -0800429}
430
431type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700432 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700433 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000434 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800435 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700436 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700437 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900438 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100439 makeUninstallable(mod *Module)
Colin Crossca860ac2016-01-04 14:34:37 -0800440}
441
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800442type xref interface {
443 XrefCcFiles() android.Paths
444}
445
Colin Cross6e511a92020-07-27 21:26:48 -0700446type libraryDependencyKind int
447
448const (
449 headerLibraryDependency = iota
450 sharedLibraryDependency
451 staticLibraryDependency
452)
453
454func (k libraryDependencyKind) String() string {
455 switch k {
456 case headerLibraryDependency:
457 return "headerLibraryDependency"
458 case sharedLibraryDependency:
459 return "sharedLibraryDependency"
460 case staticLibraryDependency:
461 return "staticLibraryDependency"
462 default:
463 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
464 }
465}
466
467type libraryDependencyOrder int
468
469const (
470 earlyLibraryDependency = -1
471 normalLibraryDependency = 0
472 lateLibraryDependency = 1
473)
474
475func (o libraryDependencyOrder) String() string {
476 switch o {
477 case earlyLibraryDependency:
478 return "earlyLibraryDependency"
479 case normalLibraryDependency:
480 return "normalLibraryDependency"
481 case lateLibraryDependency:
482 return "lateLibraryDependency"
483 default:
484 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
485 }
486}
487
488// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
489// tags that have a set of predefined tag objects that are reused for each dependency, a
490// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
491// That means that comparing a libraryDependencyTag for equality will only be equal if all
492// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
493// then check individual metadata fields instead.
494type libraryDependencyTag struct {
495 blueprint.BaseDependencyTag
496
497 // These are exported so that fmt.Printf("%#v") can call their String methods.
498 Kind libraryDependencyKind
499 Order libraryDependencyOrder
500
501 wholeStatic bool
502
503 reexportFlags bool
504 explicitlyVersioned bool
505 dataLib bool
506 ndk bool
507
508 staticUnwinder bool
509
510 makeSuffix string
511}
512
513// header returns true if the libraryDependencyTag is tagging a header lib dependency.
514func (d libraryDependencyTag) header() bool {
515 return d.Kind == headerLibraryDependency
516}
517
518// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
519func (d libraryDependencyTag) shared() bool {
520 return d.Kind == sharedLibraryDependency
521}
522
523// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
524func (d libraryDependencyTag) static() bool {
525 return d.Kind == staticLibraryDependency
526}
527
528// dependencyTag is used for tagging miscellanous dependency types that don't fit into
529// libraryDependencyTag. Each tag object is created globally and reused for multiple
530// dependencies (although since the object contains no references, assigning a tag to a
531// variable and modifying it will not modify the original). Users can compare the tag
532// returned by ctx.OtherModuleDependencyTag against the global original
533type dependencyTag struct {
534 blueprint.BaseDependencyTag
535 name string
536}
537
Colin Crossc99deeb2016-04-11 15:06:20 -0700538var (
Colin Cross6e511a92020-07-27 21:26:48 -0700539 genSourceDepTag = dependencyTag{name: "gen source"}
540 genHeaderDepTag = dependencyTag{name: "gen header"}
541 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
542 objDepTag = dependencyTag{name: "obj"}
543 linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
544 dynamicLinkerDepTag = dependencyTag{name: "dynamic linker"}
545 reuseObjTag = dependencyTag{name: "reuse objects"}
546 staticVariantTag = dependencyTag{name: "static variant"}
547 vndkExtDepTag = dependencyTag{name: "vndk extends"}
548 dataLibDepTag = dependencyTag{name: "data lib"}
549 runtimeDepTag = dependencyTag{name: "runtime lib"}
550 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700551 stubImplDepTag = dependencyTag{name: "stub_impl"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700552)
553
Colin Cross56a83212020-09-15 18:30:11 -0700554type copyDirectlyInAnyApexDependencyTag dependencyTag
555
556func (copyDirectlyInAnyApexDependencyTag) CopyDirectlyInAnyApex() {}
557
558var _ android.CopyDirectlyInAnyApexTag = copyDirectlyInAnyApexDependencyTag{}
559
Roland Levillainf89cd092019-07-29 16:22:59 +0100560func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700561 ccLibDepTag, ok := depTag.(libraryDependencyTag)
562 return ok && ccLibDepTag.shared()
563}
564
565func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
566 ccLibDepTag, ok := depTag.(libraryDependencyTag)
567 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100568}
569
570func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700571 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100572 return ok && ccDepTag == runtimeDepTag
573}
574
575func IsTestPerSrcDepTag(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 == testPerSrcDepTag
578}
579
Colin Crossca860ac2016-01-04 14:34:37 -0800580// Module contains the properties and members used by all C/C++ module types, and implements
581// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
582// to construct the output file. Behavior can be customized with a Customizer interface
583type Module struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700584 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -0700585 android.DefaultableModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +0900586 android.ApexModuleBase
Jiyong Parkd1063c12019-07-17 20:08:41 +0900587 android.SdkBase
Colin Crossc472d572015-03-17 15:06:21 -0700588
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700589 Properties BaseProperties
590 VendorProperties VendorProperties
Colin Crossfa138792015-04-24 17:31:52 -0700591
Colin Crossca860ac2016-01-04 14:34:37 -0800592 // initialize before calling Init
Colin Cross635c3b02016-05-18 15:37:25 -0700593 hod android.HostOrDeviceSupported
594 multilib android.Multilib
Colin Crossc472d572015-03-17 15:06:21 -0700595
Paul Duffina0843f62019-12-13 19:50:38 +0000596 // Allowable SdkMemberTypes of this module type.
597 sdkMemberTypes []android.SdkMemberType
598
Colin Crossca860ac2016-01-04 14:34:37 -0800599 // delegates, initialize before calling Init
Colin Crossb4ce0ec2016-09-13 13:41:39 -0700600 features []feature
601 compiler compiler
602 linker linker
603 installer installer
604 stl *stl
605 sanitize *sanitize
Dan Willemsen581341d2017-02-09 16:16:31 -0800606 coverage *coverage
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800607 sabi *sabi
Justin Yun8effde42017-06-23 19:24:43 +0900608 vndkdep *vndkdep
Stephen Craneba090d12017-05-09 15:44:35 -0700609 lto *lto
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700610 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800611
Colin Cross635c3b02016-05-18 15:37:25 -0700612 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800613
Colin Crossb98c8b02016-07-29 13:44:28 -0700614 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700615
616 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800617
618 // Flags used to compile this module
619 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700620
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800621 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700622 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900623
624 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800625 // Kythe (source file indexer) paths for this compilation module
626 kytheFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900627
628 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700629 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700630
631 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700632}
633
Ivan Lozano52767be2019-10-18 14:49:46 -0700634func (c *Module) Toc() android.OptionalPath {
635 if c.linker != nil {
636 if library, ok := c.linker.(libraryInterface); ok {
637 return library.toc()
638 }
639 }
640 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
641}
642
643func (c *Module) ApiLevel() string {
644 if c.linker != nil {
645 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700646 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700647 }
648 }
649 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
650}
651
652func (c *Module) Static() bool {
653 if c.linker != nil {
654 if library, ok := c.linker.(libraryInterface); ok {
655 return library.static()
656 }
657 }
658 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
659}
660
661func (c *Module) Shared() bool {
662 if c.linker != nil {
663 if library, ok := c.linker.(libraryInterface); ok {
664 return library.shared()
665 }
666 }
667 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
668}
669
670func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +0000671 if c.stl != nil {
672 return c.stl.Properties.SelectedStl
673 }
674 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -0700675}
676
677func (c *Module) ToolchainLibrary() bool {
678 if _, ok := c.linker.(*toolchainLibraryDecorator); ok {
679 return true
680 }
681 return false
682}
683
684func (c *Module) NdkPrebuiltStl() bool {
685 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
686 return true
687 }
688 return false
689}
690
691func (c *Module) StubDecorator() bool {
692 if _, ok := c.linker.(*stubDecorator); ok {
693 return true
694 }
695 return false
696}
697
698func (c *Module) SdkVersion() string {
699 return String(c.Properties.Sdk_version)
700}
701
Artur Satayev480e25b2020-04-27 18:53:18 +0100702func (c *Module) MinSdkVersion() string {
703 return String(c.Properties.Min_sdk_version)
704}
705
Dan Albert92fe7402020-07-15 13:33:30 -0700706func (c *Module) SplitPerApiLevel() bool {
Colin Cross1348ce32020-10-01 13:37:16 -0700707 if !c.canUseSdk() {
708 return false
709 }
Dan Albert92fe7402020-07-15 13:33:30 -0700710 if linker, ok := c.linker.(*objectLinker); ok {
711 return linker.isCrt()
712 }
713 return false
714}
715
Colin Crossc511bc52020-04-07 16:50:32 +0000716func (c *Module) AlwaysSdk() bool {
717 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
718}
719
Colin Cross3572cf72020-10-01 15:58:11 -0700720func (c *Module) StubsVersions(ctx android.BaseMutatorContext) []string {
Colin Crossc88c2722020-09-28 17:32:47 -0700721 if versioned, ok := c.linker.(versionedInterface); ok {
Colin Cross3572cf72020-10-01 15:58:11 -0700722 return versioned.stubsVersions(ctx)
Ivan Lozano183a3212019-10-18 14:18:45 -0700723 }
724 panic(fmt.Errorf("StubsVersions called on non-library module: %q", c.BaseModuleName()))
725}
726
727func (c *Module) CcLibrary() bool {
728 if c.linker != nil {
729 if _, ok := c.linker.(*libraryDecorator); ok {
730 return true
731 }
Colin Crossd48fe732020-09-23 20:37:24 -0700732 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
733 return true
734 }
Ivan Lozano183a3212019-10-18 14:18:45 -0700735 }
736 return false
737}
738
739func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -0700740 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700741 return true
742 }
743 return false
744}
745
Ivan Lozano2b262972019-11-21 12:30:50 -0800746func (c *Module) NonCcVariants() bool {
747 return false
748}
749
Ivan Lozano183a3212019-10-18 14:18:45 -0700750func (c *Module) SetBuildStubs() {
Colin Crossc88c2722020-09-28 17:32:47 -0700751 if versioned, ok := c.linker.(versionedInterface); ok {
752 versioned.setBuildStubs()
753 c.Properties.HideFromMake = true
754 c.sanitize = nil
755 c.stl = nil
756 c.Properties.PreventInstall = true
757 return
Ivan Lozano183a3212019-10-18 14:18:45 -0700758 }
759 panic(fmt.Errorf("SetBuildStubs called on non-library module: %q", c.BaseModuleName()))
760}
761
Ivan Lozano52767be2019-10-18 14:49:46 -0700762func (c *Module) BuildStubs() bool {
Colin Crossc88c2722020-09-28 17:32:47 -0700763 if versioned, ok := c.linker.(versionedInterface); ok {
764 return versioned.buildStubs()
Ivan Lozano52767be2019-10-18 14:49:46 -0700765 }
766 panic(fmt.Errorf("BuildStubs called on non-library module: %q", c.BaseModuleName()))
767}
768
Colin Crossd1f898e2020-08-18 18:35:15 -0700769func (c *Module) SetAllStubsVersions(versions []string) {
Colin Crossc88c2722020-09-28 17:32:47 -0700770 if versioned, ok := c.linker.(versionedInterface); ok {
771 versioned.setAllStubsVersions(versions)
Colin Crossd1f898e2020-08-18 18:35:15 -0700772 }
773}
774
775func (c *Module) AllStubsVersions() []string {
Colin Crossc88c2722020-09-28 17:32:47 -0700776 if versioned, ok := c.linker.(versionedInterface); ok {
777 return versioned.allStubsVersions()
Colin Crossd1f898e2020-08-18 18:35:15 -0700778 }
779 return nil
780}
781
782func (c *Module) SetStubsVersion(version string) {
Colin Crossc88c2722020-09-28 17:32:47 -0700783 if versioned, ok := c.linker.(versionedInterface); ok {
784 versioned.setStubsVersion(version)
785 return
Ivan Lozano183a3212019-10-18 14:18:45 -0700786 }
Colin Crossd1f898e2020-08-18 18:35:15 -0700787 panic(fmt.Errorf("SetStubsVersion called on non-library module: %q", c.BaseModuleName()))
Ivan Lozano183a3212019-10-18 14:18:45 -0700788}
789
Jooyung Han03b51852020-02-26 22:45:42 +0900790func (c *Module) StubsVersion() string {
Colin Crossc88c2722020-09-28 17:32:47 -0700791 if versioned, ok := c.linker.(versionedInterface); ok {
792 return versioned.stubsVersion()
Jooyung Han03b51852020-02-26 22:45:42 +0900793 }
794 panic(fmt.Errorf("StubsVersion called on non-library module: %q", c.BaseModuleName()))
795}
796
Ivan Lozano183a3212019-10-18 14:18:45 -0700797func (c *Module) SetStatic() {
798 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700799 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700800 library.setStatic()
801 return
802 }
803 }
804 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
805}
806
807func (c *Module) SetShared() {
808 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700809 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700810 library.setShared()
811 return
812 }
813 }
814 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
815}
816
817func (c *Module) BuildStaticVariant() bool {
818 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700819 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700820 return library.buildStatic()
821 }
822 }
823 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
824}
825
826func (c *Module) BuildSharedVariant() bool {
827 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700828 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700829 return library.buildShared()
830 }
831 }
832 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
833}
834
835func (c *Module) Module() android.Module {
836 return c
837}
838
Jiyong Parkc20eee32018-09-05 22:36:17 +0900839func (c *Module) OutputFile() android.OptionalPath {
840 return c.outputFile
841}
842
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400843func (c *Module) CoverageFiles() android.Paths {
844 if c.linker != nil {
845 if library, ok := c.linker.(libraryInterface); ok {
846 return library.objs().coverageFiles
847 }
848 }
849 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
850}
851
Ivan Lozano183a3212019-10-18 14:18:45 -0700852var _ LinkableInterface = (*Module)(nil)
853
Jiyong Park719b4462019-01-13 00:39:51 +0900854func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900855 if c.linker != nil {
856 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +0900857 }
858 return nil
859}
860
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900861func (c *Module) CoverageOutputFile() android.OptionalPath {
862 if c.linker != nil {
863 return c.linker.coverageOutputFilePath()
864 }
865 return android.OptionalPath{}
866}
867
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900868func (c *Module) RelativeInstallPath() string {
869 if c.installer != nil {
870 return c.installer.relativeInstallPath()
871 }
872 return ""
873}
874
Jooyung Han344d5432019-08-23 11:17:39 +0900875func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900876 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +0900877}
878
Colin Cross36242852017-06-23 15:06:31 -0700879func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -0700880 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -0800881 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -0700882 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800883 }
884 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -0700885 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800886 }
887 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -0700888 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800889 }
Colin Crossa8e07cc2016-04-04 15:07:06 -0700890 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -0700891 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -0700892 }
Colin Cross16b23492016-01-06 14:41:07 -0800893 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -0700894 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -0800895 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800896 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -0700897 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -0800898 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800899 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -0700900 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800901 }
Justin Yun8effde42017-06-23 19:24:43 +0900902 if c.vndkdep != nil {
903 c.AddProperties(c.vndkdep.props()...)
904 }
Stephen Craneba090d12017-05-09 15:44:35 -0700905 if c.lto != nil {
906 c.AddProperties(c.lto.props()...)
907 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700908 if c.pgo != nil {
909 c.AddProperties(c.pgo.props()...)
910 }
Colin Crossca860ac2016-01-04 14:34:37 -0800911 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -0700912 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800913 }
Colin Crossc472d572015-03-17 15:06:21 -0700914
Jiyong Park1613e552020-09-14 19:43:17 +0900915 c.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, os android.OsType) bool {
Elliott Hughes79ae3412020-04-17 15:49:49 -0700916 // Windows builds always prefer 32-bit
Jiyong Park1613e552020-09-14 19:43:17 +0900917 return os == android.Windows
Colin Crossa9d8bee2018-10-02 13:59:46 -0700918 })
Colin Cross36242852017-06-23 15:06:31 -0700919 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +0900920 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +0900921 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +0900922 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +0900923
Colin Cross36242852017-06-23 15:06:31 -0700924 return c
Colin Crossc472d572015-03-17 15:06:21 -0700925}
926
Colin Crossb916a382016-07-29 17:28:03 -0700927// Returns true for dependency roots (binaries)
928// TODO(ccross): also handle dlopenable libraries
929func (c *Module) isDependencyRoot() bool {
930 if root, ok := c.linker.(interface {
931 isDependencyRoot() bool
932 }); ok {
933 return root.isDependencyRoot()
934 }
935 return false
936}
937
Justin Yun5f7f7e82019-11-18 19:52:14 +0900938// Returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64.
939// "product" and "vendor" variant modules return true for this function.
940// When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true",
941// "soc_specific: true" and more vendor installed modules are included here.
942// When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "vendor_available: true" or
943// "product_specific: true" modules are included here.
Ivan Lozano52767be2019-10-18 14:49:46 -0700944func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +0900945 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700946}
947
Colin Crossc511bc52020-04-07 16:50:32 +0000948func (c *Module) canUseSdk() bool {
949 return c.Os() == android.Android && !c.UseVndk() && !c.InRamdisk() && !c.InRecovery()
950}
951
952func (c *Module) UseSdk() bool {
953 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -0700954 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +0000955 }
956 return false
957}
958
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800959func (c *Module) isCoverageVariant() bool {
960 return c.coverage.Properties.IsCoverageVariant
961}
962
Peter Collingbournead84f972019-12-17 16:46:18 -0800963func (c *Module) IsNdk() bool {
Colin Crossf0913fb2020-07-29 12:59:39 -0700964 return inList(c.BaseModuleName(), ndkKnownLibs)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800965}
966
Inseob Kim9516ee92019-05-09 10:56:13 +0900967func (c *Module) isLlndk(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800968 // Returns true for both LLNDK (public) and LLNDK-private libs.
Jooyung Han0302a842019-10-30 18:43:49 +0900969 return isLlndkLibrary(c.BaseModuleName(), config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800970}
971
Inseob Kim9516ee92019-05-09 10:56:13 +0900972func (c *Module) isLlndkPublic(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800973 // Returns true only for LLNDK (public) libs.
Jooyung Han0302a842019-10-30 18:43:49 +0900974 name := c.BaseModuleName()
975 return isLlndkLibrary(name, config) && !isVndkPrivateLibrary(name, config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800976}
977
Inseob Kim9516ee92019-05-09 10:56:13 +0900978func (c *Module) isVndkPrivate(config android.Config) bool {
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800979 // Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Jooyung Han0302a842019-10-30 18:43:49 +0900980 return isVndkPrivateLibrary(c.BaseModuleName(), config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +0800981}
982
Ivan Lozano52767be2019-10-18 14:49:46 -0700983func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +0800984 if vndkdep := c.vndkdep; vndkdep != nil {
985 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +0900986 }
987 return false
988}
989
Yi Kong7e53c572018-02-14 18:16:12 +0800990func (c *Module) isPgoCompile() bool {
991 if pgo := c.pgo; pgo != nil {
992 return pgo.Properties.PgoCompile
993 }
994 return false
995}
996
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800997func (c *Module) isNDKStubLibrary() bool {
998 if _, ok := c.compiler.(*stubDecorator); ok {
999 return true
1000 }
1001 return false
1002}
1003
Logan Chienf3511742017-10-31 18:04:35 +08001004func (c *Module) isVndkSp() bool {
1005 if vndkdep := c.vndkdep; vndkdep != nil {
1006 return vndkdep.isVndkSp()
1007 }
1008 return false
1009}
1010
1011func (c *Module) isVndkExt() bool {
1012 if vndkdep := c.vndkdep; vndkdep != nil {
1013 return vndkdep.isVndkExt()
1014 }
1015 return false
1016}
1017
Ivan Lozano52767be2019-10-18 14:49:46 -07001018func (c *Module) MustUseVendorVariant() bool {
Jooyung Han097087b2019-10-22 19:32:18 +09001019 return c.isVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001020}
1021
Logan Chienf3511742017-10-31 18:04:35 +08001022func (c *Module) getVndkExtendsModuleName() string {
1023 if vndkdep := c.vndkdep; vndkdep != nil {
1024 return vndkdep.getVndkExtendsModuleName()
1025 }
1026 return ""
1027}
1028
Jiyong Park25fc6a92018-11-18 18:02:45 +09001029func (c *Module) IsStubs() bool {
Colin Crossc88c2722020-09-28 17:32:47 -07001030 if versioned, ok := c.linker.(versionedInterface); ok {
1031 return versioned.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001032 }
1033 return false
1034}
1035
1036func (c *Module) HasStubsVariants() bool {
Colin Crossc88c2722020-09-28 17:32:47 -07001037 if versioned, ok := c.linker.(versionedInterface); ok {
1038 return versioned.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001039 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001040 return false
1041}
1042
Colin Cross0477b422020-10-13 18:43:54 -07001043// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1044// the implementation. If it is an implementation library it returns its own name.
1045func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1046 name := ctx.OtherModuleName(c)
1047 if versioned, ok := c.linker.(versionedInterface); ok {
1048 name = versioned.implementationModuleName(name)
1049 }
1050 return name
1051}
1052
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001053func (c *Module) bootstrap() bool {
1054 return Bool(c.Properties.Bootstrap)
1055}
1056
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001057func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001058 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1059 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1060 return false
1061 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001062 return c.linker != nil && c.linker.nativeCoverage()
1063}
1064
Inseob Kim8471cda2019-11-15 09:59:12 +09001065func (c *Module) isSnapshotPrebuilt() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09001066 if p, ok := c.linker.(interface{ isSnapshotPrebuilt() bool }); ok {
1067 return p.isSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001068 }
1069 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001070}
1071
Bill Peckham945441c2020-08-31 16:07:58 -07001072func (c *Module) ExcludeFromVendorSnapshot() bool {
1073 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1074}
1075
Jiyong Parkf1194352019-02-25 11:05:47 +09001076func isBionic(name string) bool {
1077 switch name {
Martin Stjernholm203489b2019-11-11 15:33:27 +00001078 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001079 return true
1080 }
1081 return false
1082}
1083
Martin Stjernholm279de572019-09-10 23:18:20 +01001084func InstallToBootstrap(name string, config android.Config) bool {
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001085 if name == "libclang_rt.hwasan-aarch64-android" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001086 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001087 }
1088 return isBionic(name)
1089}
1090
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001091func (c *Module) XrefCcFiles() android.Paths {
1092 return c.kytheFiles
1093}
1094
Colin Crossca860ac2016-01-04 14:34:37 -08001095type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001096 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001097 moduleContextImpl
1098}
1099
Colin Cross37047f12016-12-13 17:06:13 -08001100type depsContext struct {
1101 android.BottomUpMutatorContext
1102 moduleContextImpl
1103}
1104
Colin Crossca860ac2016-01-04 14:34:37 -08001105type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001106 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001107 moduleContextImpl
1108}
1109
1110type moduleContextImpl struct {
1111 mod *Module
1112 ctx BaseModuleContext
1113}
1114
Colin Crossb98c8b02016-07-29 13:44:28 -07001115func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001116 return ctx.mod.toolchain(ctx.ctx)
1117}
1118
1119func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001120 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001121}
1122
1123func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001124 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001125}
1126
Jiyong Park1d1119f2019-07-29 21:27:18 +09001127func (ctx *moduleContextImpl) header() bool {
1128 return ctx.mod.header()
1129}
1130
Inseob Kim7f283f42020-06-01 21:53:49 +09001131func (ctx *moduleContextImpl) binary() bool {
1132 return ctx.mod.binary()
1133}
1134
Inseob Kim1042d292020-06-01 23:23:05 +09001135func (ctx *moduleContextImpl) object() bool {
1136 return ctx.mod.object()
1137}
1138
Jooyung Hanccce2f22020-03-07 03:45:53 +09001139func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001140 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001141}
1142
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001143func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001144 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001145}
1146
1147func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001148 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001149 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001150 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001151 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001152 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001153 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001154 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001155 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001156 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001157 }
1158 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001159}
1160
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001161func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001162 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001163}
Justin Yun8effde42017-06-23 19:24:43 +09001164
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001165func (ctx *moduleContextImpl) isNdk() bool {
Peter Collingbournead84f972019-12-17 16:46:18 -08001166 return ctx.mod.IsNdk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001167}
1168
Inseob Kim9516ee92019-05-09 10:56:13 +09001169func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {
1170 return ctx.mod.isLlndk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001171}
1172
Inseob Kim9516ee92019-05-09 10:56:13 +09001173func (ctx *moduleContextImpl) isLlndkPublic(config android.Config) bool {
1174 return ctx.mod.isLlndkPublic(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001175}
1176
Inseob Kim9516ee92019-05-09 10:56:13 +09001177func (ctx *moduleContextImpl) isVndkPrivate(config android.Config) bool {
1178 return ctx.mod.isVndkPrivate(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001179}
1180
Logan Chienf3511742017-10-31 18:04:35 +08001181func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001182 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001183}
1184
Yi Kong7e53c572018-02-14 18:16:12 +08001185func (ctx *moduleContextImpl) isPgoCompile() bool {
1186 return ctx.mod.isPgoCompile()
1187}
1188
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001189func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1190 return ctx.mod.isNDKStubLibrary()
1191}
1192
Justin Yun8effde42017-06-23 19:24:43 +09001193func (ctx *moduleContextImpl) isVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001194 return ctx.mod.isVndkSp()
1195}
1196
1197func (ctx *moduleContextImpl) isVndkExt() bool {
1198 return ctx.mod.isVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001199}
1200
Vic Yangefd249e2018-11-12 20:19:56 -08001201func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001202 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001203}
1204
Logan Chien2f2b8902018-07-10 15:01:19 +08001205// Check whether ABI dumps should be created for this module.
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +08001206func (ctx *moduleContextImpl) shouldCreateSourceAbiDump() bool {
Logan Chien2f2b8902018-07-10 15:01:19 +08001207 if ctx.ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
1208 return false
Jayant Chowdharyea0a2e12018-03-01 19:12:16 -08001209 }
Doug Hornc32c6b02019-01-17 14:44:05 -08001210
Hsin-Yi Chenf81bb652020-04-07 21:42:19 +08001211 // Coverage builds have extra symbols.
1212 if ctx.mod.isCoverageVariant() {
1213 return false
1214 }
1215
Doug Hornc32c6b02019-01-17 14:44:05 -08001216 if ctx.ctx.Fuchsia() {
1217 return false
1218 }
1219
Logan Chien2f2b8902018-07-10 15:01:19 +08001220 if sanitize := ctx.mod.sanitize; sanitize != nil {
1221 if !sanitize.isVariantOnProductionDevice() {
1222 return false
1223 }
1224 }
1225 if !ctx.ctx.Device() {
1226 // Host modules do not need ABI dumps.
1227 return false
1228 }
Hsin-Yi Chend2451682020-01-10 16:47:50 +08001229 if ctx.isStubs() || ctx.isNDKStubLibrary() {
Hsin-Yi Chenf6a95462019-06-25 14:46:52 +08001230 // Stubs do not need ABI dumps.
1231 return false
1232 }
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +08001233 return true
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001234}
1235
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001236func (ctx *moduleContextImpl) selectedStl() string {
1237 if stl := ctx.mod.stl; stl != nil {
1238 return stl.Properties.SelectedStl
1239 }
1240 return ""
1241}
1242
Ivan Lozanobd721262018-11-27 14:33:03 -08001243func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1244 return ctx.mod.linker.useClangLld(actx)
1245}
1246
Colin Crossce75d2c2016-10-06 16:12:58 -07001247func (ctx *moduleContextImpl) baseModuleName() string {
1248 return ctx.mod.ModuleBase.BaseModuleName()
1249}
1250
Logan Chienf3511742017-10-31 18:04:35 +08001251func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1252 return ctx.mod.getVndkExtendsModuleName()
1253}
1254
Logan Chiene274fc92019-12-03 11:18:32 -08001255func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001256 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001257}
1258
Colin Crosse07f2312020-08-13 11:24:56 -07001259func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001260 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001261}
1262
Dan Albertc8060532020-07-22 22:32:17 -07001263func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001264 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001265}
1266
Jiyong Parkb0788572018-12-20 22:10:17 +09001267func (ctx *moduleContextImpl) hasStubsVariants() bool {
1268 return ctx.mod.HasStubsVariants()
1269}
1270
1271func (ctx *moduleContextImpl) isStubs() bool {
1272 return ctx.mod.IsStubs()
1273}
1274
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001275func (ctx *moduleContextImpl) bootstrap() bool {
1276 return ctx.mod.bootstrap()
1277}
1278
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001279func (ctx *moduleContextImpl) nativeCoverage() bool {
1280 return ctx.mod.nativeCoverage()
1281}
1282
Colin Cross56a83212020-09-15 18:30:11 -07001283func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1284 return ctx.mod.DirectlyInAnyApex()
1285}
1286
Colin Cross635c3b02016-05-18 15:37:25 -07001287func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001288 return &Module{
1289 hod: hod,
1290 multilib: multilib,
1291 }
1292}
1293
Colin Cross635c3b02016-05-18 15:37:25 -07001294func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001295 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001296 module.features = []feature{
1297 &tidyFeature{},
1298 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001299 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001300 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001301 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001302 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001303 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001304 module.lto = &lto{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001305 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001306 return module
1307}
1308
Colin Crossce75d2c2016-10-06 16:12:58 -07001309func (c *Module) Prebuilt() *android.Prebuilt {
1310 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1311 return p.prebuilt()
1312 }
1313 return nil
1314}
1315
1316func (c *Module) Name() string {
1317 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001318 if p, ok := c.linker.(interface {
1319 Name(string) string
1320 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001321 name = p.Name(name)
1322 }
1323 return name
1324}
1325
Alex Light3d673592019-01-18 14:37:31 -08001326func (c *Module) Symlinks() []string {
1327 if p, ok := c.installer.(interface {
1328 symlinkList() []string
1329 }); ok {
1330 return p.symlinkList()
1331 }
1332 return nil
1333}
1334
Roland Levillainf89cd092019-07-29 16:22:59 +01001335func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1336 test, ok := c.linker.(testPerSrc)
1337 return ok && test.isAllTestsVariation()
1338}
1339
Chris Parsons216e10a2020-07-09 17:12:52 -04001340func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001341 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001342 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001343 }); ok {
1344 return p.dataPaths()
1345 }
1346 return nil
1347}
1348
Justin Yun5f7f7e82019-11-18 19:52:14 +09001349func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
1350 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1351 // "current", it will append the VNDK version to the name suffix.
1352 var vndkVersion string
1353 var nameSuffix string
1354 if c.inProduct() {
1355 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
1356 nameSuffix = productSuffix
1357 } else {
1358 vndkVersion = ctx.DeviceConfig().VndkVersion()
1359 nameSuffix = vendorSuffix
1360 }
1361 if vndkVersion == "current" {
1362 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1363 }
1364 if c.Properties.VndkVersion != vndkVersion {
1365 // add version suffix only if the module is using different vndk version than the
1366 // version in product or vendor partition.
1367 nameSuffix += "." + c.Properties.VndkVersion
1368 }
1369 return nameSuffix
1370}
1371
Colin Cross635c3b02016-05-18 15:37:25 -07001372func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Roland Levillainf2fad972019-06-28 15:41:19 +01001373 // Handle the case of a test module split by `test_per_src` mutator.
Roland Levillainf89cd092019-07-29 16:22:59 +01001374 //
1375 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1376 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1377 // module and return early, as this module does not produce an output file per se.
1378 if c.IsTestPerSrcAllTestsVariation() {
1379 c.outputFile = android.OptionalPath{}
1380 return
Roland Levillainf2fad972019-06-28 15:41:19 +01001381 }
1382
Colin Cross56a83212020-09-15 18:30:11 -07001383 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1384 if !apexInfo.IsForPlatform() {
1385 c.hideApexVariantFromMake = true
1386 }
1387
Jooyung Han38002912019-05-16 04:01:54 +09001388 c.makeLinkType = c.getMakeLinkType(actx)
Inseob Kim9516ee92019-05-09 10:56:13 +09001389
Inseob Kim64c43952019-08-26 16:52:35 +09001390 c.Properties.SubName = ""
1391
1392 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1393 c.Properties.SubName += nativeBridgeSuffix
1394 }
1395
Justin Yun5f7f7e82019-11-18 19:52:14 +09001396 _, llndk := c.linker.(*llndkStubDecorator)
1397 _, llndkHeader := c.linker.(*llndkHeadersDecorator)
1398 if llndk || llndkHeader || (c.UseVndk() && c.HasVendorVariant()) {
1399 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1400 // added for product variant only when we have vendor and product variants with core
1401 // variant. The suffix is not added for vendor-only or product-only module.
1402 c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
1403 } else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
Inseob Kim64c43952019-08-26 16:52:35 +09001404 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1405 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
1406 c.Properties.SubName += vendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001407 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
1408 c.Properties.SubName += ramdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001409 } else if c.InRecovery() && !c.OnlyInRecovery() {
Inseob Kim64c43952019-08-26 16:52:35 +09001410 c.Properties.SubName += recoverySuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001411 } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
Colin Crossc511bc52020-04-07 16:50:32 +00001412 c.Properties.SubName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001413 if c.SplitPerApiLevel() {
1414 c.Properties.SubName += "." + c.SdkVersion()
1415 }
Inseob Kim64c43952019-08-26 16:52:35 +09001416 }
1417
Colin Crossca860ac2016-01-04 14:34:37 -08001418 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001419 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001420 moduleContextImpl: moduleContextImpl{
1421 mod: c,
1422 },
1423 }
1424 ctx.ctx = ctx
1425
Colin Crossf18e1102017-11-16 14:33:08 -08001426 deps := c.depsToPaths(ctx)
1427 if ctx.Failed() {
1428 return
1429 }
1430
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001431 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1432 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1433 }
1434
Colin Crossca860ac2016-01-04 14:34:37 -08001435 flags := Flags{
1436 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001437 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001438 }
Colin Crossca860ac2016-01-04 14:34:37 -08001439 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001440 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001441 }
1442 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001443 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001444 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001445 if c.stl != nil {
1446 flags = c.stl.flags(ctx, flags)
1447 }
Colin Cross16b23492016-01-06 14:41:07 -08001448 if c.sanitize != nil {
1449 flags = c.sanitize.flags(ctx, flags)
1450 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001451 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001452 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001453 }
Stephen Craneba090d12017-05-09 15:44:35 -07001454 if c.lto != nil {
1455 flags = c.lto.flags(ctx, flags)
1456 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001457 if c.pgo != nil {
1458 flags = c.pgo.flags(ctx, flags)
1459 }
Colin Crossca860ac2016-01-04 14:34:37 -08001460 for _, feature := range c.features {
1461 flags = feature.flags(ctx, flags)
1462 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001463 if ctx.Failed() {
1464 return
1465 }
1466
Colin Cross4af21ed2019-11-04 09:37:55 -08001467 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1468 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1469 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001470
Colin Cross4af21ed2019-11-04 09:37:55 -08001471 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001472
1473 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001474 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001475 }
1476 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001477 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001478 }
1479
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001480 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001481 // We need access to all the flags seen by a source file.
1482 if c.sabi != nil {
1483 flags = c.sabi.flags(ctx, flags)
1484 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001485
Colin Cross4af21ed2019-11-04 09:37:55 -08001486 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001487
Colin Crossca860ac2016-01-04 14:34:37 -08001488 // Optimization to reduce size of build.ninja
1489 // Replace the long list of flags for each file with a module-local variable
Colin Cross4af21ed2019-11-04 09:37:55 -08001490 ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
1491 ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
1492 ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
1493 flags.Local.CFlags = []string{"$cflags"}
1494 flags.Local.CppFlags = []string{"$cppflags"}
1495 flags.Local.AsFlags = []string{"$asflags"}
Colin Crossca860ac2016-01-04 14:34:37 -08001496
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001497 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001498 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001499 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001500 if ctx.Failed() {
1501 return
1502 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001503 c.kytheFiles = objs.kytheFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001504 }
1505
Colin Crossca860ac2016-01-04 14:34:37 -08001506 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001507 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001508 if ctx.Failed() {
1509 return
1510 }
Colin Cross635c3b02016-05-18 15:37:25 -07001511 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001512
1513 // If a lib is directly included in any of the APEXes, unhide the stubs
1514 // variant having the latest version gets visible to make. In addition,
1515 // the non-stubs variant is renamed to <libname>.bootstrap. This is to
1516 // force anything in the make world to link against the stubs library.
1517 // (unless it is explicitly referenced via .bootstrap suffix or the
1518 // module is marked with 'bootstrap: true').
Colin Cross56a83212020-09-15 18:30:11 -07001519 if c.HasStubsVariants() && c.AnyVariantDirectlyInAnyApex() && !c.InRamdisk() &&
Ivan Lozano52767be2019-10-18 14:49:46 -07001520 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001521 c.IsStubs() {
Jiyong Parkb0788572018-12-20 22:10:17 +09001522 c.Properties.HideFromMake = false // unhide
1523 // Note: this is still non-installable
1524 }
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001525
1526 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current.
1527 if i, ok := c.linker.(snapshotLibraryInterface); ok && ctx.DeviceConfig().VndkVersion() == "current" {
Colin Cross56a83212020-09-15 18:30:11 -07001528 if isSnapshotAware(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001529 i.collectHeadersForSnapshot(ctx)
1530 }
1531 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001532 }
Colin Cross5049f022015-03-18 13:28:46 -07001533
Colin Cross56a83212020-09-15 18:30:11 -07001534 if c.installable(apexInfo) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001535 c.installer.install(ctx, c.outputFile.Path())
1536 if ctx.Failed() {
1537 return
Colin Crossca860ac2016-01-04 14:34:37 -08001538 }
Paul Duffin0cb37b92020-03-04 14:52:46 +00001539 } else if !proptools.BoolDefault(c.Properties.Installable, true) {
1540 // If the module has been specifically configure to not be installed then
1541 // skip the installation as otherwise it will break when running inside make
1542 // as the output path to install will not be specified. Not all uninstallable
1543 // modules can skip installation as some are needed for resolving make side
1544 // dependencies.
1545 c.SkipInstall()
Dan Albertc403f7c2015-03-18 14:01:18 -07001546 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001547}
1548
Colin Cross0ea8ba82019-06-06 14:33:29 -07001549func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001550 if c.cachedToolchain == nil {
Colin Crossb98c8b02016-07-29 13:44:28 -07001551 c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
Colin Cross3f40fa42015-01-30 17:27:36 -08001552 }
Colin Crossca860ac2016-01-04 14:34:37 -08001553 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08001554}
1555
Colin Crossca860ac2016-01-04 14:34:37 -08001556func (c *Module) begin(ctx BaseModuleContext) {
1557 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001558 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07001559 }
Colin Crossca860ac2016-01-04 14:34:37 -08001560 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001561 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001562 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001563 if c.stl != nil {
1564 c.stl.begin(ctx)
1565 }
Colin Cross16b23492016-01-06 14:41:07 -08001566 if c.sanitize != nil {
1567 c.sanitize.begin(ctx)
1568 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001569 if c.coverage != nil {
1570 c.coverage.begin(ctx)
1571 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001572 if c.sabi != nil {
1573 c.sabi.begin(ctx)
1574 }
Justin Yun8effde42017-06-23 19:24:43 +09001575 if c.vndkdep != nil {
1576 c.vndkdep.begin(ctx)
1577 }
Stephen Craneba090d12017-05-09 15:44:35 -07001578 if c.lto != nil {
1579 c.lto.begin(ctx)
1580 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001581 if c.pgo != nil {
1582 c.pgo.begin(ctx)
1583 }
Colin Crossca860ac2016-01-04 14:34:37 -08001584 for _, feature := range c.features {
1585 feature.begin(ctx)
1586 }
Dan Albert92fe7402020-07-15 13:33:30 -07001587 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07001588 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001589 if err != nil {
1590 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07001591 c.Properties.Sdk_version = nil
1592 } else {
1593 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001594 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001595 }
Colin Crossca860ac2016-01-04 14:34:37 -08001596}
1597
Colin Cross37047f12016-12-13 17:06:13 -08001598func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07001599 deps := Deps{}
1600
1601 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001602 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001603 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001604 // Add the PGO dependency (the clang_rt.profile runtime library), which
1605 // sometimes depends on symbols from libgcc, before libgcc gets added
1606 // in linkerDeps().
Pirama Arumuga Nainar49b53d52017-10-04 16:47:29 -07001607 if c.pgo != nil {
1608 deps = c.pgo.deps(ctx, deps)
1609 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001610 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001611 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001612 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001613 if c.stl != nil {
1614 deps = c.stl.deps(ctx, deps)
1615 }
Colin Cross16b23492016-01-06 14:41:07 -08001616 if c.sanitize != nil {
1617 deps = c.sanitize.deps(ctx, deps)
1618 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001619 if c.coverage != nil {
1620 deps = c.coverage.deps(ctx, deps)
1621 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001622 if c.sabi != nil {
1623 deps = c.sabi.deps(ctx, deps)
1624 }
Justin Yun8effde42017-06-23 19:24:43 +09001625 if c.vndkdep != nil {
1626 deps = c.vndkdep.deps(ctx, deps)
1627 }
Stephen Craneba090d12017-05-09 15:44:35 -07001628 if c.lto != nil {
1629 deps = c.lto.deps(ctx, deps)
1630 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001631 for _, feature := range c.features {
1632 deps = feature.deps(ctx, deps)
1633 }
1634
Colin Crossb6715442017-10-24 11:13:31 -07001635 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1636 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1637 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
1638 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1639 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
1640 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08001641 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07001642
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001643 for _, lib := range deps.ReexportSharedLibHeaders {
1644 if !inList(lib, deps.SharedLibs) {
1645 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
1646 }
1647 }
1648
1649 for _, lib := range deps.ReexportStaticLibHeaders {
1650 if !inList(lib, deps.StaticLibs) {
1651 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib)
1652 }
1653 }
1654
Colin Cross5950f382016-12-13 12:50:57 -08001655 for _, lib := range deps.ReexportHeaderLibHeaders {
1656 if !inList(lib, deps.HeaderLibs) {
1657 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
1658 }
1659 }
1660
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001661 for _, gen := range deps.ReexportGeneratedHeaders {
1662 if !inList(gen, deps.GeneratedHeaders) {
1663 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
1664 }
1665 }
1666
Colin Crossc99deeb2016-04-11 15:06:20 -07001667 return deps
1668}
1669
Dan Albert7e9d2952016-08-04 13:02:36 -07001670func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08001671 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001672 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001673 moduleContextImpl: moduleContextImpl{
1674 mod: c,
1675 },
1676 }
1677 ctx.ctx = ctx
1678
Colin Crossca860ac2016-01-04 14:34:37 -08001679 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07001680}
1681
Jiyong Park7ed9de32018-10-15 22:25:07 +09001682// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09001683func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001684 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
1685 version := name[sharp+1:]
1686 libname := name[:sharp]
1687 return libname, version
1688 }
1689 return name, ""
1690}
1691
Dan Albert92fe7402020-07-15 13:33:30 -07001692func GetCrtVariations(ctx android.BottomUpMutatorContext,
1693 m LinkableInterface) []blueprint.Variation {
1694 if ctx.Os() != android.Android {
1695 return nil
1696 }
1697 if m.UseSdk() {
1698 return []blueprint.Variation{
1699 {Mutator: "sdk", Variation: "sdk"},
Colin Crossbbc941b2020-09-30 12:27:01 -07001700 {Mutator: "version", Variation: m.SdkVersion()},
Dan Albert92fe7402020-07-15 13:33:30 -07001701 }
1702 }
1703 return []blueprint.Variation{
1704 {Mutator: "sdk", Variation: ""},
1705 }
1706}
1707
Colin Crosse7257d22020-09-24 09:56:18 -07001708func (c *Module) addSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext,
1709 variations []blueprint.Variation, depTag libraryDependencyTag, name, version string, far bool) {
1710
1711 variations = append([]blueprint.Variation(nil), variations...)
1712
Colin Cross3146c5c2020-09-30 15:34:40 -07001713 if version != "" && CanBeOrLinkAgainstVersionVariants(c) {
Colin Crosse7257d22020-09-24 09:56:18 -07001714 // Version is explicitly specified. i.e. libFoo#30
1715 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
1716 depTag.explicitlyVersioned = true
1717 }
Colin Crosse7257d22020-09-24 09:56:18 -07001718
Colin Cross0de8a1e2020-09-18 14:15:30 -07001719 if far {
1720 ctx.AddFarVariationDependencies(variations, depTag, name)
1721 } else {
1722 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07001723 }
1724}
1725
Colin Cross1e676be2016-10-12 14:38:15 -07001726func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09001727 if !c.Enabled() {
1728 return
1729 }
1730
Colin Cross37047f12016-12-13 17:06:13 -08001731 ctx := &depsContext{
1732 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07001733 moduleContextImpl: moduleContextImpl{
1734 mod: c,
1735 },
1736 }
1737 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08001738
Colin Crossc99deeb2016-04-11 15:06:20 -07001739 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001740
Yo Chiang219968c2020-09-22 18:45:04 +08001741 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
1742
Dan Albert914449f2016-06-17 16:45:24 -07001743 variantNdkLibs := []string{}
1744 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07001745 if ctx.Os() == android.Android {
Inseob Kimeec88e12020-01-22 11:11:29 +09001746 // rewriteLibs takes a list of names of shared libraries and scans it for three types
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001747 // of names:
Dan Albert914449f2016-06-17 16:45:24 -07001748 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001749 // 1. Name of an NDK library that refers to a prebuilt module.
1750 // For each of these, it adds the name of the prebuilt module (which will be in
1751 // prebuilts/ndk) to the list of nonvariant libs.
1752 // 2. Name of an NDK library that refers to an ndk_library module.
1753 // For each of these, it adds the name of the ndk_library module to the list of
1754 // variant libs.
1755 // 3. Anything else (so anything that isn't an NDK library).
1756 // It adds these to the nonvariantLibs list.
Dan Albert914449f2016-06-17 16:45:24 -07001757 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001758 // The caller can then know to add the variantLibs dependencies differently from the
1759 // nonvariantLibs
Inseob Kim9516ee92019-05-09 10:56:13 +09001760
Inseob Kim9516ee92019-05-09 10:56:13 +09001761 vendorPublicLibraries := vendorPublicLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001762 vendorSnapshotSharedLibs := vendorSnapshotSharedLibs(actx.Config())
1763
1764 rewriteVendorLibs := func(lib string) string {
1765 if isLlndkLibrary(lib, ctx.Config()) {
1766 return lib + llndkLibrarySuffix
1767 }
1768
1769 // only modules with BOARD_VNDK_VERSION uses snapshot.
1770 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1771 return lib
1772 }
1773
1774 if snapshot, ok := vendorSnapshotSharedLibs.get(lib, actx.Arch().ArchType); ok {
1775 return snapshot
1776 }
1777
1778 return lib
1779 }
1780
1781 rewriteLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001782 variantLibs = []string{}
1783 nonvariantLibs = []string{}
Dan Albert914449f2016-06-17 16:45:24 -07001784 for _, entry := range list {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001785 // strip #version suffix out
Jiyong Park73c54ee2019-10-22 20:31:18 +09001786 name, _ := StubsLibNameAndVersion(entry)
Dan Albertde5aade2020-06-30 12:32:51 -07001787 if ctx.useSdk() && inList(name, ndkKnownLibs) {
1788 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Inseob Kimeec88e12020-01-22 11:11:29 +09001789 } else if ctx.useVndk() {
1790 nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
Inseob Kim9516ee92019-05-09 10:56:13 +09001791 } else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, *vendorPublicLibraries) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001792 vendorPublicLib := name + vendorPublicLibrarySuffix
Jiyong Park374510b2018-03-19 18:23:01 +09001793 if actx.OtherModuleExists(vendorPublicLib) {
1794 nonvariantLibs = append(nonvariantLibs, vendorPublicLib)
1795 } else {
1796 // This can happen if vendor_public_library module is defined in a
1797 // namespace that isn't visible to the current module. In that case,
1798 // link to the original library.
Jiyong Park7ed9de32018-10-15 22:25:07 +09001799 nonvariantLibs = append(nonvariantLibs, name)
Jiyong Park374510b2018-03-19 18:23:01 +09001800 }
Dan Albert914449f2016-06-17 16:45:24 -07001801 } else {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001802 // put name#version back
Dan Willemsen7cbf5f82017-03-28 00:08:30 -07001803 nonvariantLibs = append(nonvariantLibs, entry)
Dan Willemsen72d39932016-07-08 23:23:48 -07001804 }
1805 }
Dan Albert914449f2016-06-17 16:45:24 -07001806 return nonvariantLibs, variantLibs
Dan Willemsen72d39932016-07-08 23:23:48 -07001807 }
1808
Inseob Kimeec88e12020-01-22 11:11:29 +09001809 deps.SharedLibs, variantNdkLibs = rewriteLibs(deps.SharedLibs)
1810 deps.LateSharedLibs, variantLateNdkLibs = rewriteLibs(deps.LateSharedLibs)
1811 deps.ReexportSharedLibHeaders, _ = rewriteLibs(deps.ReexportSharedLibHeaders)
1812 if ctx.useVndk() {
1813 for idx, lib := range deps.RuntimeLibs {
1814 deps.RuntimeLibs[idx] = rewriteVendorLibs(lib)
1815 }
1816 }
Dan Willemsen72d39932016-07-08 23:23:48 -07001817 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001818
Jiyong Park7e636d02019-01-28 16:16:54 +09001819 buildStubs := false
Colin Crossc88c2722020-09-28 17:32:47 -07001820 if versioned, ok := c.linker.(versionedInterface); ok {
1821 if versioned.buildStubs() {
1822 buildStubs = true
Colin Crossd48fe732020-09-23 20:37:24 -07001823 }
Jiyong Park7ed9de32018-10-15 22:25:07 +09001824 }
1825
Inseob Kimeec88e12020-01-22 11:11:29 +09001826 rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string {
1827 // only modules with BOARD_VNDK_VERSION uses snapshot.
1828 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1829 return lib
1830 }
1831
1832 if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
1833 return snapshot
1834 }
1835
1836 return lib
1837 }
1838
1839 vendorSnapshotHeaderLibs := vendorSnapshotHeaderLibs(actx.Config())
Colin Cross32ec36c2016-12-15 07:39:51 -08001840 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001841 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08001842 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001843 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08001844 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001845
1846 lib = rewriteSnapshotLibs(lib, vendorSnapshotHeaderLibs)
1847
Jiyong Park7e636d02019-01-28 16:16:54 +09001848 if buildStubs {
Colin Cross7228ecd2019-11-18 16:00:16 -08001849 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07001850 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09001851 } else {
1852 actx.AddVariationDependencies(nil, depTag, lib)
1853 }
1854 }
1855
1856 if buildStubs {
1857 // Stubs lib does not have dependency to other static/shared libraries.
1858 // Don't proceed.
1859 return
Colin Cross32ec36c2016-12-15 07:39:51 -08001860 }
Colin Cross5950f382016-12-13 12:50:57 -08001861
Inseob Kimc0907f12019-02-08 21:00:45 +09001862 syspropImplLibraries := syspropImplLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001863 vendorSnapshotStaticLibs := vendorSnapshotStaticLibs(actx.Config())
Inseob Kimc0907f12019-02-08 21:00:45 +09001864
Jiyong Park5d1598f2019-02-25 22:14:17 +09001865 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001866 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09001867 if impl, ok := syspropImplLibraries[lib]; ok {
1868 lib = impl
1869 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001870
1871 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1872
Jiyong Park5d1598f2019-02-25 22:14:17 +09001873 actx.AddVariationDependencies([]blueprint.Variation{
1874 {Mutator: "link", Variation: "static"},
1875 }, depTag, lib)
1876 }
1877
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001878 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001879 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001880 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001881 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001882 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001883
1884 if impl, ok := syspropImplLibraries[lib]; ok {
1885 lib = impl
1886 }
1887
Inseob Kimeec88e12020-01-22 11:11:29 +09001888 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1889
Dan Willemsen59339a22018-07-22 21:18:45 -07001890 actx.AddVariationDependencies([]blueprint.Variation{
1891 {Mutator: "link", Variation: "static"},
1892 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001893 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001894
Jooyung Han75568392020-03-20 04:29:24 +09001895 // staticUnwinderDep is treated as staticDep for Q apexes
1896 // so that native libraries/binaries are linked with static unwinder
1897 // because Q libc doesn't have unwinder APIs
1898 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07001899 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001900 actx.AddVariationDependencies([]blueprint.Variation{
1901 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001902 }, depTag, rewriteSnapshotLibs(staticUnwinder(actx), vendorSnapshotStaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001903 }
1904
Inseob Kimeec88e12020-01-22 11:11:29 +09001905 for _, lib := range deps.LateStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001906 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Inseob Kimeec88e12020-01-22 11:11:29 +09001907 actx.AddVariationDependencies([]blueprint.Variation{
1908 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001909 }, depTag, rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs))
Inseob Kimeec88e12020-01-22 11:11:29 +09001910 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001911
Jiyong Park7ed9de32018-10-15 22:25:07 +09001912 // shared lib names without the #version suffix
1913 var sharedLibNames []string
1914
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001915 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001916 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001917 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001918 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001919 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001920
1921 if impl, ok := syspropImplLibraries[lib]; ok {
1922 lib = impl
1923 }
1924
Jiyong Park73c54ee2019-10-22 20:31:18 +09001925 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09001926 sharedLibNames = append(sharedLibNames, name)
1927
Colin Crosse7257d22020-09-24 09:56:18 -07001928 variations := []blueprint.Variation{
1929 {Mutator: "link", Variation: "shared"},
1930 }
1931 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001932 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001933
Jiyong Park7ed9de32018-10-15 22:25:07 +09001934 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09001935 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001936 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
1937 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
1938 // linking against both the stubs lib and the non-stubs lib at the same time.
1939 continue
1940 }
Colin Cross6e511a92020-07-27 21:26:48 -07001941 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07001942 variations := []blueprint.Variation{
1943 {Mutator: "link", Variation: "shared"},
1944 }
1945 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09001946 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001947
Dan Willemsen59339a22018-07-22 21:18:45 -07001948 actx.AddVariationDependencies([]blueprint.Variation{
1949 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04001950 }, dataLibDepTag, deps.DataLibs...)
1951
1952 actx.AddVariationDependencies([]blueprint.Variation{
1953 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07001954 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08001955
Colin Cross68861832016-07-08 10:41:41 -07001956 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001957
1958 for _, gen := range deps.GeneratedHeaders {
1959 depTag := genHeaderDepTag
1960 if inList(gen, deps.ReexportGeneratedHeaders) {
1961 depTag = genHeaderExportDepTag
1962 }
1963 actx.AddDependency(c, depTag, gen)
1964 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07001965
Inseob Kim1042d292020-06-01 23:23:05 +09001966 vendorSnapshotObjects := vendorSnapshotObjects(actx.Config())
1967
Dan Albert92fe7402020-07-15 13:33:30 -07001968 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07001969 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc99deeb2016-04-11 15:06:20 -07001970 if deps.CrtBegin != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07001971 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
1972 rewriteSnapshotLibs(deps.CrtBegin, vendorSnapshotObjects))
Colin Crossca860ac2016-01-04 14:34:37 -08001973 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001974 if deps.CrtEnd != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07001975 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
1976 rewriteSnapshotLibs(deps.CrtEnd, vendorSnapshotObjects))
Colin Cross21b9a242015-03-24 14:15:58 -07001977 }
Dan Willemsena0790e32018-10-12 00:24:23 -07001978 if deps.LinkerFlagsFile != "" {
1979 actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
1980 }
1981 if deps.DynamicLinker != "" {
1982 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07001983 }
Dan Albert914449f2016-06-17 16:45:24 -07001984
1985 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07001986
1987 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07001988 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07001989 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07001990 {Mutator: "link", Variation: "shared"},
1991 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07001992
1993 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07001994 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07001995 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07001996 {Mutator: "link", Variation: "shared"},
1997 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08001998
1999 if vndkdep := c.vndkdep; vndkdep != nil {
2000 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002001 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002002 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002003 {Mutator: "link", Variation: "shared"},
2004 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002005 }
2006 }
Colin Cross6362e272015-10-29 15:25:03 -07002007}
Colin Cross21b9a242015-03-24 14:15:58 -07002008
Colin Crosse40b4ea2018-10-02 22:25:58 -07002009func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002010 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2011 c.beginMutator(ctx)
2012 }
2013}
2014
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002015// Whether a module can link to another module, taking into
2016// account NDK linking.
Colin Cross6e511a92020-07-27 21:26:48 -07002017func checkLinkType(ctx android.ModuleContext, from LinkableInterface, to LinkableInterface,
2018 tag blueprint.DependencyTag) {
2019
2020 switch t := tag.(type) {
2021 case dependencyTag:
2022 if t != vndkExtDepTag {
2023 return
2024 }
2025 case libraryDependencyTag:
2026 default:
2027 return
2028 }
2029
Ivan Lozano52767be2019-10-18 14:49:46 -07002030 if from.Module().Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002031 // Host code is not restricted
2032 return
2033 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002034
2035 // VNDK is cc.Module supported only for now.
2036 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002037 // Though vendor code is limited by the vendor mutator,
2038 // each vendor-available module needs to check
2039 // link-type for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002040 if ccTo, ok := to.(*Module); ok {
2041 if ccFrom.vndkdep != nil {
2042 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2043 }
2044 } else {
2045 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002046 }
2047 return
2048 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002049 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002050 // Platform code can link to anything
2051 return
2052 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002053 if from.InRamdisk() {
2054 // Ramdisk code is not NDK
2055 return
2056 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002057 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002058 // Recovery code is not NDK
2059 return
2060 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002061 if to.ToolchainLibrary() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002062 // These are always allowed
2063 return
2064 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002065 if to.NdkPrebuiltStl() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002066 // These are allowed, but they don't set sdk_version
2067 return
2068 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002069 if to.StubDecorator() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002070 // These aren't real libraries, but are the stub shared libraries that are included in
2071 // the NDK.
2072 return
2073 }
Logan Chien834b9a62019-01-14 15:39:03 +08002074
Ivan Lozano52767be2019-10-18 14:49:46 -07002075 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002076 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2077 // to link to libc++ (non-NDK and without sdk_version).
2078 return
2079 }
2080
Ivan Lozano52767be2019-10-18 14:49:46 -07002081 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002082 // NDK code linking to platform code is never okay.
2083 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002084 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002085 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002086 }
2087
2088 // At this point we know we have two NDK libraries, but we need to
2089 // check that we're not linking against anything built against a higher
2090 // API level, as it is only valid to link against older or equivalent
2091 // APIs.
2092
Inseob Kim01a28722018-04-11 09:48:45 +09002093 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002094 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002095 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002096 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002097 // Current can't be linked against by anything else.
2098 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002099 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002100 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002101 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002102 if err != nil {
2103 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002104 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002105 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002106 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002107 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002108 if err != nil {
2109 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002110 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002111 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002112 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002113
Inseob Kim01a28722018-04-11 09:48:45 +09002114 if toApi > fromApi {
2115 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002116 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002117 }
2118 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002119 }
Dan Albert202fe492017-12-15 13:56:59 -08002120
2121 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002122 fromStl := from.SelectedStl()
2123 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002124 if fromStl == "" || toStl == "" {
2125 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002126 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002127 // We can be permissive with the system "STL" since it is only the C++
2128 // ABI layer, but in the future we should make sure that everyone is
2129 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002130 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002131 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002132 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2133 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002134 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002135}
2136
Jiyong Park5fb8c102018-04-09 12:03:06 +09002137// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002138// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2139// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002140// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002141func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2142 check := func(child, parent android.Module) bool {
2143 to, ok := child.(*Module)
2144 if !ok {
2145 // follow thru cc.Defaults, etc.
2146 return true
2147 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002148
Jooyung Hana70f0672019-01-18 15:20:43 +09002149 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2150 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002151 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002152
2153 // if target lib has no vendor variant, keep checking dependency graph
Ivan Lozano52767be2019-10-18 14:49:46 -07002154 if !to.HasVendorVariant() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002155 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002156 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002157
Jooyung Han0302a842019-10-30 18:43:49 +09002158 if to.isVndkSp() || to.isLlndk(ctx.Config()) || Bool(to.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002159 return false
2160 }
2161
2162 var stringPath []string
2163 for _, m := range ctx.GetWalkPath() {
2164 stringPath = append(stringPath, m.Name())
2165 }
2166 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2167 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
2168 "(dependency: %s)", ctx.OtherModuleName(to), strings.Join(stringPath, " -> "))
2169 return false
2170 }
2171 if module, ok := ctx.Module().(*Module); ok {
2172 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jooyung Han0302a842019-10-30 18:43:49 +09002173 if module.isLlndk(ctx.Config()) || Bool(module.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002174 ctx.WalkDeps(check)
2175 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002176 }
2177 }
2178}
2179
Colin Cross0de8a1e2020-09-18 14:15:30 -07002180// Returns the highest version which is <= maxSdkVersion.
2181// For example, with maxSdkVersion is 10 and versionList is [9,11]
2182// it returns 9 as string. The list of stubs must be in order from
2183// oldest to newest.
2184func (c *Module) chooseSdkVersion(ctx android.PathContext, stubsInfo []SharedLibraryStubsInfo,
2185 maxSdkVersion android.ApiLevel) (SharedLibraryStubsInfo, error) {
2186
2187 for i := range stubsInfo {
2188 stubInfo := stubsInfo[len(stubsInfo)-i-1]
2189 var ver android.ApiLevel
2190 if stubInfo.Version == "" {
2191 ver = android.FutureApiLevel
2192 } else {
2193 var err error
2194 ver, err = android.ApiLevelFromUser(ctx, stubInfo.Version)
2195 if err != nil {
2196 return SharedLibraryStubsInfo{}, err
2197 }
2198 }
2199 if ver.LessThanOrEqualTo(maxSdkVersion) {
2200 return stubInfo, nil
2201 }
2202 }
2203 var versionList []string
2204 for _, stubInfo := range stubsInfo {
2205 versionList = append(versionList, stubInfo.Version)
2206 }
2207 return SharedLibraryStubsInfo{}, fmt.Errorf("not found a version(<=%s) in versionList: %v", maxSdkVersion.String(), versionList)
2208}
2209
Colin Crossc99deeb2016-04-11 15:06:20 -07002210// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002211func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002212 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002213
Colin Cross0de8a1e2020-09-18 14:15:30 -07002214 var directStaticDeps []StaticLibraryInfo
2215 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002216
Colin Cross0de8a1e2020-09-18 14:15:30 -07002217 reexportExporter := func(exporter FlagExporterInfo) {
2218 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2219 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2220 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2221 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2222 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002223 }
2224
Jooyung Hande34d232020-07-23 13:04:15 +09002225 // For the dependency from platform to apex, use the latest stubs
2226 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002227 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2228 if !apexInfo.IsForPlatform() {
2229 c.apexSdkVersion = apexInfo.MinSdkVersion(ctx)
Jooyung Hande34d232020-07-23 13:04:15 +09002230 }
2231
2232 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2233 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2234 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2235 // (b/144430859)
2236 c.apexSdkVersion = android.FutureApiLevel
2237 }
2238
Colin Crossd11fcda2017-10-23 17:59:01 -07002239 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002240 depName := ctx.OtherModuleName(dep)
2241 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002242
Ivan Lozano52767be2019-10-18 14:49:46 -07002243 ccDep, ok := dep.(LinkableInterface)
2244 if !ok {
2245
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002246 // handling for a few module types that aren't cc Module but that are also supported
2247 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002248 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002249 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002250 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2251 genRule.GeneratedSourceFiles()...)
2252 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002253 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002254 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002255 // Support exported headers from a generated_sources dependency
2256 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002257 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002258 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002259 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002260 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002261 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002262 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002263 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002264 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002265 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2266 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002267 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002268 // 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 +09002269 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002270
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002271 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002272 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002273 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002274 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002275 case linkerFlagsDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002276 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002277 files := genRule.GeneratedSourceFiles()
2278 if len(files) == 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002279 depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002280 } else if len(files) > 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002281 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 -07002282 }
2283 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002284 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002285 }
Colin Crossca860ac2016-01-04 14:34:37 -08002286 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002287 return
2288 }
2289
Colin Crossfe17f6f2019-03-28 19:30:56 -07002290 if depTag == android.ProtoPluginDepTag {
2291 return
2292 }
Jooyung Han61b66e92020-03-21 14:21:46 +00002293 if depTag == llndkImplDep {
2294 return
2295 }
Colin Crossfe17f6f2019-03-28 19:30:56 -07002296
Colin Crossd11fcda2017-10-23 17:59:01 -07002297 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002298 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2299 return
2300 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002301 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002302 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2303 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002304 return
2305 }
2306
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002307 if depTag == reuseObjTag {
Ivan Lozano52767be2019-10-18 14:49:46 -07002308 // reusing objects only make sense for cc.Modules.
Colin Cross0de8a1e2020-09-18 14:15:30 -07002309 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2310 objs := staticAnalogue.ReuseObjects
2311 depPaths.Objs = depPaths.Objs.Append(objs)
2312 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2313 reexportExporter(depExporterInfo)
2314 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002315 }
2316
Colin Cross6e511a92020-07-27 21:26:48 -07002317 checkLinkType(ctx, c, ccDep, depTag)
2318
2319 linkFile := ccDep.OutputFile()
2320
2321 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2322 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002323 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002324 return
2325 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002326
Colin Cross0de8a1e2020-09-18 14:15:30 -07002327 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002328
Colin Cross6e511a92020-07-27 21:26:48 -07002329 var ptr *android.Paths
2330 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002331
Colin Cross6e511a92020-07-27 21:26:48 -07002332 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002333
Colin Cross6e511a92020-07-27 21:26:48 -07002334 switch {
2335 case libDepTag.header():
2336 // nothing
2337 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002338 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2339 if !ctx.Config().AllowMissingDependencies() {
2340 ctx.ModuleErrorf("module %q is not a shared library", depName)
2341 } else {
2342 ctx.AddMissingDependencies([]string{depName})
2343 }
2344 return
2345 }
2346 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
2347 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryImplementationStubsInfoProvider).(SharedLibraryImplementationStubsInfo)
2348
2349 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedLibraryStubsInfos) > 0 {
2350 useStubs := false
2351 if m, ok := ccDep.(*Module); ok && m.IsStubs() && c.UseVndk() { // LLNDK
2352 if !apexInfo.IsForPlatform() {
2353 // For platform libraries, use current version of LLNDK
2354 // If this is for use_vendor apex we will apply the same rules
2355 // of apex sdk enforcement below to choose right version.
2356 useStubs = true
2357 }
2358 } else if apexInfo.IsForPlatform() {
2359 // If not building for APEX, use stubs only when it is from
2360 // an APEX (and not from platform)
2361 // However, for host, ramdisk, recovery or bootstrap modules,
2362 // always link to non-stub variant
2363 useStubs = dep.(android.ApexModule).AnyVariantDirectlyInAnyApex() && !c.bootstrap()
2364 // Another exception: if this module is bundled with an APEX, then
2365 // it is linked with the non-stub variant of a module in the APEX
2366 // as if this is part of the APEX.
2367 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
2368 for _, apexContents := range testFor.ApexContents {
2369 if apexContents.DirectlyInApex(depName) {
2370 useStubs = false
2371 break
2372 }
2373 }
2374 } else {
2375 // If building for APEX, use stubs when the parent is in any APEX that
2376 // the child is not in.
2377 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
2378 }
2379
2380 // when to use (unspecified) stubs, check min_sdk_version and choose the right one
2381 if useStubs {
2382 sharedLibraryStubsInfo, err :=
2383 c.chooseSdkVersion(ctx, sharedLibraryStubsInfo.SharedLibraryStubsInfos, c.apexSdkVersion)
2384 if err != nil {
2385 ctx.OtherModuleErrorf(dep, err.Error())
2386 return
2387 }
2388 sharedLibraryInfo = sharedLibraryStubsInfo.SharedLibraryInfo
2389 depExporterInfo = sharedLibraryStubsInfo.FlagExporterInfo
2390 }
2391 }
2392
2393 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2394 depFile = sharedLibraryInfo.TableOfContents
2395
Colin Cross6e511a92020-07-27 21:26:48 -07002396 ptr = &depPaths.SharedLibs
2397 switch libDepTag.Order {
2398 case earlyLibraryDependency:
2399 ptr = &depPaths.EarlySharedLibs
2400 depPtr = &depPaths.EarlySharedLibsDeps
2401 case normalLibraryDependency:
2402 ptr = &depPaths.SharedLibs
2403 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002404 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002405 case lateLibraryDependency:
2406 ptr = &depPaths.LateSharedLibs
2407 depPtr = &depPaths.LateSharedLibsDeps
2408 default:
2409 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002410 }
Colin Cross6e511a92020-07-27 21:26:48 -07002411 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002412 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2413 if !ctx.Config().AllowMissingDependencies() {
2414 ctx.ModuleErrorf("module %q is not a static library", depName)
2415 } else {
2416 ctx.AddMissingDependencies([]string{depName})
2417 }
2418 return
2419 }
2420 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2421 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002422 if libDepTag.wholeStatic {
2423 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002424 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2425 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002426 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002427 // This case normally catches prebuilt static
2428 // libraries, but it can also occur when
2429 // AllowMissingDependencies is on and the
2430 // dependencies has no sources of its own
2431 // but has a whole_static_libs dependency
2432 // on a missing library. We want to depend
2433 // on the .a file so that there is something
2434 // in the dependency tree that contains the
2435 // error rule for the missing transitive
2436 // dependency.
2437 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002438 }
Colin Cross6e511a92020-07-27 21:26:48 -07002439 } else {
2440 switch libDepTag.Order {
2441 case earlyLibraryDependency:
2442 panic(fmt.Errorf("early static libs not suppported"))
2443 case normalLibraryDependency:
2444 // static dependencies will be handled separately so they can be ordered
2445 // using transitive dependencies.
2446 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002447 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002448 case lateLibraryDependency:
2449 ptr = &depPaths.LateStaticLibs
2450 default:
2451 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002452 }
2453 }
2454 }
2455
Colin Cross6e511a92020-07-27 21:26:48 -07002456 if libDepTag.static() && !libDepTag.wholeStatic {
2457 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2458 ctx.ModuleErrorf("module %q not a static library", depName)
2459 return
2460 }
Logan Chien43d34c32017-12-20 01:17:32 +08002461
Colin Cross6e511a92020-07-27 21:26:48 -07002462 // When combining coverage files for shared libraries and executables, coverage files
2463 // in static libraries act as if they were whole static libraries. The same goes for
2464 // source based Abi dump files.
2465 if c, ok := ccDep.(*Module); ok {
2466 staticLib := c.linker.(libraryInterface)
2467 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2468 staticLib.objs().coverageFiles...)
2469 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2470 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002471 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002472 // Handle non-CC modules here
2473 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002474 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002475 }
2476 }
2477
Colin Cross6e511a92020-07-27 21:26:48 -07002478 if ptr != nil {
2479 if !linkFile.Valid() {
2480 if !ctx.Config().AllowMissingDependencies() {
2481 ctx.ModuleErrorf("module %q missing output file", depName)
2482 } else {
2483 ctx.AddMissingDependencies([]string{depName})
2484 }
2485 return
2486 }
2487 *ptr = append(*ptr, linkFile.Path())
2488 }
2489
2490 if depPtr != nil {
2491 dep := depFile
2492 if !dep.Valid() {
2493 dep = linkFile
2494 }
2495 *depPtr = append(*depPtr, dep.Path())
2496 }
2497
Colin Cross0de8a1e2020-09-18 14:15:30 -07002498 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2499 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2500 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2501 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2502
2503 if libDepTag.reexportFlags {
2504 reexportExporter(depExporterInfo)
2505 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2506 // Re-exported shared library headers must be included as well since they can help us with type information
2507 // about template instantiations (instantiated from their headers).
2508 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2509 // scripts.
2510 c.sabi.Properties.ReexportedIncludes = append(
2511 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2512 }
2513
Colin Cross6e511a92020-07-27 21:26:48 -07002514 makeLibName := c.makeLibName(ctx, ccDep, depName) + libDepTag.makeSuffix
2515 switch {
2516 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002517 c.Properties.AndroidMkHeaderLibs = append(
2518 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002519 case libDepTag.shared():
2520 if ccDep.CcLibrary() {
Colin Cross56a83212020-09-15 18:30:11 -07002521 if ccDep.BuildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002522 // Add the dependency to the APEX(es) providing the library so that
2523 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002524 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
2525 for _, an := range depApexInfo.InApexes {
Colin Cross6e511a92020-07-27 21:26:48 -07002526 c.Properties.ApexesProvidingSharedLibs = append(
2527 c.Properties.ApexesProvidingSharedLibs, an)
2528 }
2529 }
2530 }
2531
2532 // Note: the order of libs in this list is not important because
2533 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002534 c.Properties.AndroidMkSharedLibs = append(
2535 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002536 // Record baseLibName for snapshots.
2537 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, baseLibName(depName))
2538 case libDepTag.static():
2539 if libDepTag.wholeStatic {
2540 c.Properties.AndroidMkWholeStaticLibs = append(
2541 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2542 } else {
2543 c.Properties.AndroidMkStaticLibs = append(
2544 c.Properties.AndroidMkStaticLibs, makeLibName)
2545 }
2546 }
2547 } else {
2548 switch depTag {
2549 case runtimeDepTag:
2550 c.Properties.AndroidMkRuntimeLibs = append(
2551 c.Properties.AndroidMkRuntimeLibs, c.makeLibName(ctx, ccDep, depName)+libDepTag.makeSuffix)
2552 // Record baseLibName for snapshots.
2553 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, baseLibName(depName))
2554 case objDepTag:
2555 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2556 case CrtBeginDepTag:
2557 depPaths.CrtBegin = linkFile
2558 case CrtEndDepTag:
2559 depPaths.CrtEnd = linkFile
2560 case dynamicLinkerDepTag:
2561 depPaths.DynamicLinker = linkFile
2562 }
Jiyong Park27b188b2017-07-18 13:23:39 +09002563 }
Colin Crossca860ac2016-01-04 14:34:37 -08002564 })
2565
Jeff Gaston294356f2017-09-27 17:05:30 -07002566 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07002567 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
2568 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
2569 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07002570
Colin Crossdd84e052017-05-17 13:44:16 -07002571 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07002572 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09002573 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
2574 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09002575 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09002576 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
2577 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07002578 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09002579 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09002580 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002581
2582 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09002583 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002584 }
Colin Crossdd84e052017-05-17 13:44:16 -07002585
Colin Crossca860ac2016-01-04 14:34:37 -08002586 return depPaths
2587}
2588
Colin Cross0de8a1e2020-09-18 14:15:30 -07002589// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
2590// to match the topological order of the dependency tree, including any static analogues of
2591// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
2592// of the transitive dependencies.
2593func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
2594 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
2595 var staticPaths android.Paths
2596 for _, staticDep := range staticDeps {
2597 staticPaths = append(staticPaths, staticDep.StaticLibrary)
2598 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
2599 }
2600 for _, sharedDep := range sharedDeps {
2601 if sharedDep.StaticAnalogue != nil {
2602 transitiveStaticLibsBuilder.Transitive(sharedDep.StaticAnalogue.TransitiveStaticLibrariesForOrdering)
2603 }
2604 }
2605 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
2606
2607 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
2608
2609 // reorder the dependencies based on transitive dependencies
2610 staticPaths = android.FirstUniquePaths(staticPaths)
2611 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
2612
2613 if len(orderedStaticPaths) != len(staticPaths) {
2614 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
2615 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
2616 }
2617
2618 return orderedStaticPaths, transitiveStaticLibs
2619}
2620
Colin Cross6e511a92020-07-27 21:26:48 -07002621// baseLibName trims known prefixes and suffixes
2622func baseLibName(depName string) string {
2623 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
2624 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
2625 libName = strings.TrimPrefix(libName, "prebuilt_")
2626 return libName
2627}
2628
2629func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, depName string) string {
2630 vendorSuffixModules := vendorSuffixModules(ctx.Config())
2631 vendorPublicLibraries := vendorPublicLibraries(ctx.Config())
2632
2633 libName := baseLibName(depName)
2634 isLLndk := isLlndkLibrary(libName, ctx.Config())
2635 isVendorPublicLib := inList(libName, *vendorPublicLibraries)
2636 bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk
2637
2638 if c, ok := ccDep.(*Module); ok {
2639 // Use base module name for snapshots when exporting to Makefile.
2640 if c.isSnapshotPrebuilt() {
2641 baseName := c.BaseModuleName()
2642
2643 if c.IsVndk() {
2644 return baseName + ".vendor"
2645 }
2646
2647 if vendorSuffixModules[baseName] {
2648 return baseName + ".vendor"
2649 } else {
2650 return baseName
2651 }
2652 }
2653 }
2654
2655 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() && !c.InRamdisk() && !c.InRecovery() {
2656 // The vendor module is a no-vendor-variant VNDK library. Depend on the
2657 // core module instead.
2658 return libName
2659 } else if c.UseVndk() && bothVendorAndCoreVariantsExist {
2660 // The vendor module in Make will have been renamed to not conflict with the core
2661 // module, so update the dependency name here accordingly.
2662 return libName + c.getNameSuffixWithVndkVersion(ctx)
2663 } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
2664 return libName + vendorPublicLibrarySuffix
2665 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
2666 return libName + ramdiskSuffix
2667 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
2668 return libName + recoverySuffix
2669 } else if ccDep.Module().Target().NativeBridge == android.NativeBridgeEnabled {
2670 return libName + nativeBridgeSuffix
2671 } else {
2672 return libName
2673 }
2674}
2675
Colin Crossca860ac2016-01-04 14:34:37 -08002676func (c *Module) InstallInData() bool {
2677 if c.installer == nil {
2678 return false
2679 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002680 return c.installer.inData()
2681}
2682
2683func (c *Module) InstallInSanitizerDir() bool {
2684 if c.installer == nil {
2685 return false
2686 }
2687 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07002688 return true
2689 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002690 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08002691}
2692
Yifan Hong1b3348d2020-01-21 15:53:22 -08002693func (c *Module) InstallInRamdisk() bool {
2694 return c.InRamdisk()
2695}
2696
Jiyong Parkf9332f12018-02-01 00:54:12 +09002697func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07002698 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002699}
2700
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002701func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002702 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002703 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002704 return
2705 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002706 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002707}
2708
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07002709func (c *Module) HostToolPath() android.OptionalPath {
2710 if c.installer == nil {
2711 return android.OptionalPath{}
2712 }
2713 return c.installer.hostToolPath()
2714}
2715
Nan Zhangd4e641b2017-07-12 12:55:28 -07002716func (c *Module) IntermPathForModuleOut() android.OptionalPath {
2717 return c.outputFile
2718}
2719
Colin Cross41955e82019-05-29 14:40:35 -07002720func (c *Module) OutputFiles(tag string) (android.Paths, error) {
2721 switch tag {
2722 case "":
2723 if c.outputFile.Valid() {
2724 return android.Paths{c.outputFile.Path()}, nil
2725 }
2726 return android.Paths{}, nil
2727 default:
2728 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002729 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002730}
2731
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00002732func (c *Module) static() bool {
2733 if static, ok := c.linker.(interface {
2734 static() bool
2735 }); ok {
2736 return static.static()
2737 }
2738 return false
2739}
2740
Jiyong Park379de2f2018-12-19 02:47:14 +09002741func (c *Module) staticBinary() bool {
2742 if static, ok := c.linker.(interface {
2743 staticBinary() bool
2744 }); ok {
2745 return static.staticBinary()
2746 }
2747 return false
2748}
2749
Jiyong Park1d1119f2019-07-29 21:27:18 +09002750func (c *Module) header() bool {
2751 if h, ok := c.linker.(interface {
2752 header() bool
2753 }); ok {
2754 return h.header()
2755 }
2756 return false
2757}
2758
Inseob Kim7f283f42020-06-01 21:53:49 +09002759func (c *Module) binary() bool {
2760 if b, ok := c.linker.(interface {
2761 binary() bool
2762 }); ok {
2763 return b.binary()
2764 }
2765 return false
2766}
2767
Inseob Kim1042d292020-06-01 23:23:05 +09002768func (c *Module) object() bool {
2769 if o, ok := c.linker.(interface {
2770 object() bool
2771 }); ok {
2772 return o.object()
2773 }
2774 return false
2775}
2776
Jooyung Han38002912019-05-16 04:01:54 +09002777func (c *Module) getMakeLinkType(actx android.ModuleContext) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07002778 if c.UseVndk() {
Jooyung Han38002912019-05-16 04:01:54 +09002779 if lib, ok := c.linker.(*llndkStubDecorator); ok {
2780 if Bool(lib.Properties.Vendor_available) {
Colin Crossb60190a2018-09-04 16:28:17 -07002781 return "native:vndk"
2782 }
Jooyung Han38002912019-05-16 04:01:54 +09002783 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07002784 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002785 if c.IsVndk() && !c.isVndkExt() {
Jooyung Han38002912019-05-16 04:01:54 +09002786 if Bool(c.VendorProperties.Vendor_available) {
2787 return "native:vndk"
2788 }
2789 return "native:vndk_private"
2790 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09002791 if c.inProduct() {
2792 return "native:product"
2793 }
Jooyung Han38002912019-05-16 04:01:54 +09002794 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08002795 } else if c.InRamdisk() {
2796 return "native:ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07002797 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07002798 return "native:recovery"
2799 } else if c.Target().Os == android.Android && String(c.Properties.Sdk_version) != "" {
2800 return "native:ndk:none:none"
2801 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
2802 //family, link := getNdkStlFamilyAndLinkType(c)
2803 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07002804 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08002805 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07002806 } else {
2807 return "native:platform"
2808 }
2809}
2810
Jiyong Park9d452992018-10-03 00:38:19 +09002811// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01002812// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09002813func (c *Module) IsInstallableToApex() bool {
2814 if shared, ok := c.linker.(interface {
2815 shared() bool
2816 }); ok {
Jiyong Park73c54ee2019-10-22 20:31:18 +09002817 // Stub libs and prebuilt libs in a versioned SDK are not
2818 // installable to APEX even though they are shared libs.
2819 return shared.shared() && !c.IsStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01002820 } else if _, ok := c.linker.(testPerSrc); ok {
2821 return true
Jiyong Park9d452992018-10-03 00:38:19 +09002822 }
2823 return false
2824}
2825
Jiyong Parka90ca002019-10-07 15:47:24 +09002826func (c *Module) AvailableFor(what string) bool {
2827 if linker, ok := c.linker.(interface {
2828 availableFor(string) bool
2829 }); ok {
2830 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
2831 } else {
2832 return c.ApexModuleBase.AvailableFor(what)
2833 }
2834}
2835
Jiyong Park62304bb2020-04-13 16:19:48 +09002836func (c *Module) TestFor() []string {
2837 if test, ok := c.linker.(interface {
2838 testFor() []string
2839 }); ok {
2840 return test.testFor()
2841 } else {
2842 return c.ApexModuleBase.TestFor()
2843 }
2844}
2845
Colin Crossaede88c2020-08-11 12:17:01 -07002846func (c *Module) UniqueApexVariations() bool {
2847 if u, ok := c.compiler.(interface {
2848 uniqueApexVariations() bool
2849 }); ok {
2850 return u.uniqueApexVariations()
2851 } else {
2852 return false
2853 }
2854}
2855
Paul Duffin0cb37b92020-03-04 14:52:46 +00002856// Return true if the module is ever installable.
2857func (c *Module) EverInstallable() bool {
2858 return c.installer != nil &&
2859 // Check to see whether the module is actually ever installable.
2860 c.installer.everInstallable()
2861}
2862
Colin Cross56a83212020-09-15 18:30:11 -07002863func (c *Module) installable(apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00002864 ret := c.EverInstallable() &&
2865 // Check to see whether the module has been configured to not be installed.
2866 proptools.BoolDefault(c.Properties.Installable, true) &&
2867 !c.Properties.PreventInstall && c.outputFile.Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002868
2869 // The platform variant doesn't need further condition. Apex variants however might not
2870 // be installable because it will likely to be included in the APEX and won't appear
2871 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07002872 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002873 return ret
2874 }
2875
2876 // Special case for modules that are configured to be installed to /data, which includes
2877 // test modules. For these modules, both APEX and non-APEX variants are considered as
2878 // installable. This is because even the APEX variants won't be included in the APEX, but
2879 // will anyway be installed to /data/*.
2880 // See b/146995717
2881 if c.InstallInData() {
2882 return ret
2883 }
2884
2885 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09002886}
2887
Logan Chien41eabe62019-04-10 13:33:58 +08002888func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
2889 if c.linker != nil {
2890 if library, ok := c.linker.(*libraryDecorator); ok {
2891 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
2892 }
2893 }
2894}
2895
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002896func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07002897 depTag := ctx.OtherModuleDependencyTag(dep)
2898 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
2899
2900 if cc, ok := dep.(*Module); ok {
2901 if cc.HasStubsVariants() {
2902 if isLibDepTag && libDepTag.shared() {
2903 // dynamic dep to a stubs lib crosses APEX boundary
2904 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09002905 }
Colin Cross6e511a92020-07-27 21:26:48 -07002906 if IsRuntimeDepTag(depTag) {
2907 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09002908 return false
2909 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002910 }
Colin Crossaac32222020-07-29 12:51:56 -07002911 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07002912 // shared_lib dependency from a static lib is considered as crossing
2913 // the APEX boundary because the dependency doesn't actually is
2914 // linked; the dependency is used only during the compilation phase.
2915 return false
2916 }
2917 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002918 if depTag == stubImplDepTag || depTag == llndkImplDep {
2919 // We don't track beyond LLNDK or from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09002920 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002921 }
2922 return true
2923}
2924
Dan Albertc8060532020-07-22 22:32:17 -07002925func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
2926 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09002927 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
2928 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
2929 return nil
2930 }
2931 // b/154569636: set min_sdk_version correctly for toolchain_libraries
2932 if c.ToolchainLibrary() {
2933 return nil
2934 }
2935 // We don't check for prebuilt modules
2936 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
2937 return nil
2938 }
2939 minSdkVersion := c.MinSdkVersion()
2940 if minSdkVersion == "apex_inherit" {
2941 return nil
2942 }
2943 if minSdkVersion == "" {
2944 // JNI libs within APK-in-APEX fall into here
2945 // Those are okay to set sdk_version instead
2946 // We don't have to check if this is a SDK variant because
2947 // non-SDK variant resets sdk_version, which works too.
2948 minSdkVersion = c.SdkVersion()
2949 }
Dan Albertc8060532020-07-22 22:32:17 -07002950 if minSdkVersion == "" {
2951 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
2952 }
2953 // Not using nativeApiLevelFromUser because the context here is not
2954 // necessarily a native context.
2955 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09002956 if err != nil {
2957 return err
2958 }
Dan Albertc8060532020-07-22 22:32:17 -07002959
2960 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09002961 return fmt.Errorf("newer SDK(%v)", ver)
2962 }
2963 return nil
2964}
2965
Colin Cross2ba19d92015-05-07 15:44:20 -07002966//
Colin Crosscfad1192015-11-02 16:43:11 -08002967// Defaults
2968//
Colin Crossca860ac2016-01-04 14:34:37 -08002969type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07002970 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07002971 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09002972 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08002973}
2974
Patrice Arrudac249c712019-03-19 17:00:29 -07002975// cc_defaults provides a set of properties that can be inherited by other cc
2976// modules. A module can use the properties from a cc_defaults using
2977// `defaults: ["<:default_module_name>"]`. Properties of both modules are
2978// merged (when possible) by prepending the default module's values to the
2979// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07002980func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07002981 return DefaultsFactory()
2982}
2983
Colin Cross36242852017-06-23 15:06:31 -07002984func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08002985 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08002986
Colin Cross36242852017-06-23 15:06:31 -07002987 module.AddProperties(props...)
2988 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08002989 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002990 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08002991 &BaseCompilerProperties{},
2992 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01002993 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07002994 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07002995 &StaticProperties{},
2996 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07002997 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08002998 &BinaryLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07002999 &TestProperties{},
3000 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003001 &BenchmarkProperties{},
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -07003002 &FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003003 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003004 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003005 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003006 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003007 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003008 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003009 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003010 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003011 &LTOProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003012 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003013 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003014 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3015 &RustBindgenClangProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003016 )
Colin Crosscfad1192015-11-02 16:43:11 -08003017
Jooyung Hancc372c52019-09-25 15:18:44 +09003018 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003019
3020 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003021}
3022
Jiyong Park6a43f042017-10-12 23:05:00 +09003023func squashVendorSrcs(m *Module) {
3024 if lib, ok := m.compiler.(*libraryDecorator); ok {
3025 lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
3026 lib.baseCompiler.Properties.Target.Vendor.Srcs...)
3027
3028 lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
3029 lib.baseCompiler.Properties.Target.Vendor.Exclude_srcs...)
Jooyung Hanac07f882020-07-05 03:54:35 +09003030
3031 lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
3032 lib.baseCompiler.Properties.Target.Vendor.Exclude_generated_sources...)
Jiyong Park6a43f042017-10-12 23:05:00 +09003033 }
3034}
3035
Jiyong Parkf9332f12018-02-01 00:54:12 +09003036func squashRecoverySrcs(m *Module) {
3037 if lib, ok := m.compiler.(*libraryDecorator); ok {
3038 lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
3039 lib.baseCompiler.Properties.Target.Recovery.Srcs...)
3040
3041 lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
3042 lib.baseCompiler.Properties.Target.Recovery.Exclude_srcs...)
Jooyung Hanac07f882020-07-05 03:54:35 +09003043
3044 lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
3045 lib.baseCompiler.Properties.Target.Recovery.Exclude_generated_sources...)
Jiyong Parkf9332f12018-02-01 00:54:12 +09003046 }
3047}
3048
Jiyong Park2286afd2020-06-16 21:58:53 +09003049func (c *Module) IsSdkVariant() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07003050 return c.Properties.IsSdkVariant || c.AlwaysSdk()
Jiyong Park2286afd2020-06-16 21:58:53 +09003051}
3052
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003053func kytheExtractAllFactory() android.Singleton {
3054 return &kytheExtractAllSingleton{}
3055}
3056
3057type kytheExtractAllSingleton struct {
3058}
3059
3060func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3061 var xrefTargets android.Paths
3062 ctx.VisitAllModules(func(module android.Module) {
3063 if ccModule, ok := module.(xref); ok {
3064 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3065 }
3066 })
3067 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3068 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003069 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003070 }
3071}
3072
Colin Cross06a931b2015-10-28 17:23:31 -07003073var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003074var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003075var BoolPtr = proptools.BoolPtr
3076var String = proptools.String
3077var StringPtr = proptools.StringPtr