blob: dbe6346b7b7e3f6b1a63adbaba14d79acacd284c [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
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001043func (c *Module) bootstrap() bool {
1044 return Bool(c.Properties.Bootstrap)
1045}
1046
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001047func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001048 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1049 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1050 return false
1051 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001052 return c.linker != nil && c.linker.nativeCoverage()
1053}
1054
Inseob Kim8471cda2019-11-15 09:59:12 +09001055func (c *Module) isSnapshotPrebuilt() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09001056 if p, ok := c.linker.(interface{ isSnapshotPrebuilt() bool }); ok {
1057 return p.isSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001058 }
1059 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001060}
1061
Bill Peckham945441c2020-08-31 16:07:58 -07001062func (c *Module) ExcludeFromVendorSnapshot() bool {
1063 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1064}
1065
Jiyong Parkf1194352019-02-25 11:05:47 +09001066func isBionic(name string) bool {
1067 switch name {
Martin Stjernholm203489b2019-11-11 15:33:27 +00001068 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001069 return true
1070 }
1071 return false
1072}
1073
Martin Stjernholm279de572019-09-10 23:18:20 +01001074func InstallToBootstrap(name string, config android.Config) bool {
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001075 if name == "libclang_rt.hwasan-aarch64-android" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001076 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001077 }
1078 return isBionic(name)
1079}
1080
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001081func (c *Module) XrefCcFiles() android.Paths {
1082 return c.kytheFiles
1083}
1084
Colin Crossca860ac2016-01-04 14:34:37 -08001085type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001086 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001087 moduleContextImpl
1088}
1089
Colin Cross37047f12016-12-13 17:06:13 -08001090type depsContext struct {
1091 android.BottomUpMutatorContext
1092 moduleContextImpl
1093}
1094
Colin Crossca860ac2016-01-04 14:34:37 -08001095type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001096 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001097 moduleContextImpl
1098}
1099
1100type moduleContextImpl struct {
1101 mod *Module
1102 ctx BaseModuleContext
1103}
1104
Colin Crossb98c8b02016-07-29 13:44:28 -07001105func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001106 return ctx.mod.toolchain(ctx.ctx)
1107}
1108
1109func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001110 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001111}
1112
1113func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001114 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001115}
1116
Jiyong Park1d1119f2019-07-29 21:27:18 +09001117func (ctx *moduleContextImpl) header() bool {
1118 return ctx.mod.header()
1119}
1120
Inseob Kim7f283f42020-06-01 21:53:49 +09001121func (ctx *moduleContextImpl) binary() bool {
1122 return ctx.mod.binary()
1123}
1124
Inseob Kim1042d292020-06-01 23:23:05 +09001125func (ctx *moduleContextImpl) object() bool {
1126 return ctx.mod.object()
1127}
1128
Jooyung Hanccce2f22020-03-07 03:45:53 +09001129func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001130 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001131}
1132
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001133func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001134 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001135}
1136
1137func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001138 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001139 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001140 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001141 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001142 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001143 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001144 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001145 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001146 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001147 }
1148 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001149}
1150
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001151func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001152 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001153}
Justin Yun8effde42017-06-23 19:24:43 +09001154
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001155func (ctx *moduleContextImpl) isNdk() bool {
Peter Collingbournead84f972019-12-17 16:46:18 -08001156 return ctx.mod.IsNdk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001157}
1158
Inseob Kim9516ee92019-05-09 10:56:13 +09001159func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {
1160 return ctx.mod.isLlndk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001161}
1162
Inseob Kim9516ee92019-05-09 10:56:13 +09001163func (ctx *moduleContextImpl) isLlndkPublic(config android.Config) bool {
1164 return ctx.mod.isLlndkPublic(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001165}
1166
Inseob Kim9516ee92019-05-09 10:56:13 +09001167func (ctx *moduleContextImpl) isVndkPrivate(config android.Config) bool {
1168 return ctx.mod.isVndkPrivate(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001169}
1170
Logan Chienf3511742017-10-31 18:04:35 +08001171func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001172 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001173}
1174
Yi Kong7e53c572018-02-14 18:16:12 +08001175func (ctx *moduleContextImpl) isPgoCompile() bool {
1176 return ctx.mod.isPgoCompile()
1177}
1178
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001179func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1180 return ctx.mod.isNDKStubLibrary()
1181}
1182
Justin Yun8effde42017-06-23 19:24:43 +09001183func (ctx *moduleContextImpl) isVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001184 return ctx.mod.isVndkSp()
1185}
1186
1187func (ctx *moduleContextImpl) isVndkExt() bool {
1188 return ctx.mod.isVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001189}
1190
Vic Yangefd249e2018-11-12 20:19:56 -08001191func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001192 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001193}
1194
Logan Chien2f2b8902018-07-10 15:01:19 +08001195// Check whether ABI dumps should be created for this module.
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +08001196func (ctx *moduleContextImpl) shouldCreateSourceAbiDump() bool {
Logan Chien2f2b8902018-07-10 15:01:19 +08001197 if ctx.ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
1198 return false
Jayant Chowdharyea0a2e12018-03-01 19:12:16 -08001199 }
Doug Hornc32c6b02019-01-17 14:44:05 -08001200
Hsin-Yi Chenf81bb652020-04-07 21:42:19 +08001201 // Coverage builds have extra symbols.
1202 if ctx.mod.isCoverageVariant() {
1203 return false
1204 }
1205
Doug Hornc32c6b02019-01-17 14:44:05 -08001206 if ctx.ctx.Fuchsia() {
1207 return false
1208 }
1209
Logan Chien2f2b8902018-07-10 15:01:19 +08001210 if sanitize := ctx.mod.sanitize; sanitize != nil {
1211 if !sanitize.isVariantOnProductionDevice() {
1212 return false
1213 }
1214 }
1215 if !ctx.ctx.Device() {
1216 // Host modules do not need ABI dumps.
1217 return false
1218 }
Hsin-Yi Chend2451682020-01-10 16:47:50 +08001219 if ctx.isStubs() || ctx.isNDKStubLibrary() {
Hsin-Yi Chenf6a95462019-06-25 14:46:52 +08001220 // Stubs do not need ABI dumps.
1221 return false
1222 }
Hsin-Yi Chenaf17d742019-07-29 17:46:59 +08001223 return true
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001224}
1225
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001226func (ctx *moduleContextImpl) selectedStl() string {
1227 if stl := ctx.mod.stl; stl != nil {
1228 return stl.Properties.SelectedStl
1229 }
1230 return ""
1231}
1232
Ivan Lozanobd721262018-11-27 14:33:03 -08001233func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1234 return ctx.mod.linker.useClangLld(actx)
1235}
1236
Colin Crossce75d2c2016-10-06 16:12:58 -07001237func (ctx *moduleContextImpl) baseModuleName() string {
1238 return ctx.mod.ModuleBase.BaseModuleName()
1239}
1240
Logan Chienf3511742017-10-31 18:04:35 +08001241func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1242 return ctx.mod.getVndkExtendsModuleName()
1243}
1244
Logan Chiene274fc92019-12-03 11:18:32 -08001245func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001246 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001247}
1248
Colin Crosse07f2312020-08-13 11:24:56 -07001249func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001250 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001251}
1252
Dan Albertc8060532020-07-22 22:32:17 -07001253func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001254 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001255}
1256
Jiyong Parkb0788572018-12-20 22:10:17 +09001257func (ctx *moduleContextImpl) hasStubsVariants() bool {
1258 return ctx.mod.HasStubsVariants()
1259}
1260
1261func (ctx *moduleContextImpl) isStubs() bool {
1262 return ctx.mod.IsStubs()
1263}
1264
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001265func (ctx *moduleContextImpl) bootstrap() bool {
1266 return ctx.mod.bootstrap()
1267}
1268
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001269func (ctx *moduleContextImpl) nativeCoverage() bool {
1270 return ctx.mod.nativeCoverage()
1271}
1272
Colin Cross56a83212020-09-15 18:30:11 -07001273func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1274 return ctx.mod.DirectlyInAnyApex()
1275}
1276
Colin Cross635c3b02016-05-18 15:37:25 -07001277func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001278 return &Module{
1279 hod: hod,
1280 multilib: multilib,
1281 }
1282}
1283
Colin Cross635c3b02016-05-18 15:37:25 -07001284func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001285 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001286 module.features = []feature{
1287 &tidyFeature{},
1288 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001289 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001290 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001291 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001292 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001293 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001294 module.lto = &lto{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001295 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001296 return module
1297}
1298
Colin Crossce75d2c2016-10-06 16:12:58 -07001299func (c *Module) Prebuilt() *android.Prebuilt {
1300 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1301 return p.prebuilt()
1302 }
1303 return nil
1304}
1305
1306func (c *Module) Name() string {
1307 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001308 if p, ok := c.linker.(interface {
1309 Name(string) string
1310 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001311 name = p.Name(name)
1312 }
1313 return name
1314}
1315
Alex Light3d673592019-01-18 14:37:31 -08001316func (c *Module) Symlinks() []string {
1317 if p, ok := c.installer.(interface {
1318 symlinkList() []string
1319 }); ok {
1320 return p.symlinkList()
1321 }
1322 return nil
1323}
1324
Roland Levillainf89cd092019-07-29 16:22:59 +01001325func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1326 test, ok := c.linker.(testPerSrc)
1327 return ok && test.isAllTestsVariation()
1328}
1329
Chris Parsons216e10a2020-07-09 17:12:52 -04001330func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001331 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001332 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001333 }); ok {
1334 return p.dataPaths()
1335 }
1336 return nil
1337}
1338
Justin Yun5f7f7e82019-11-18 19:52:14 +09001339func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
1340 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1341 // "current", it will append the VNDK version to the name suffix.
1342 var vndkVersion string
1343 var nameSuffix string
1344 if c.inProduct() {
1345 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
1346 nameSuffix = productSuffix
1347 } else {
1348 vndkVersion = ctx.DeviceConfig().VndkVersion()
1349 nameSuffix = vendorSuffix
1350 }
1351 if vndkVersion == "current" {
1352 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1353 }
1354 if c.Properties.VndkVersion != vndkVersion {
1355 // add version suffix only if the module is using different vndk version than the
1356 // version in product or vendor partition.
1357 nameSuffix += "." + c.Properties.VndkVersion
1358 }
1359 return nameSuffix
1360}
1361
Colin Cross635c3b02016-05-18 15:37:25 -07001362func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Roland Levillainf2fad972019-06-28 15:41:19 +01001363 // Handle the case of a test module split by `test_per_src` mutator.
Roland Levillainf89cd092019-07-29 16:22:59 +01001364 //
1365 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1366 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1367 // module and return early, as this module does not produce an output file per se.
1368 if c.IsTestPerSrcAllTestsVariation() {
1369 c.outputFile = android.OptionalPath{}
1370 return
Roland Levillainf2fad972019-06-28 15:41:19 +01001371 }
1372
Colin Cross56a83212020-09-15 18:30:11 -07001373 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1374 if !apexInfo.IsForPlatform() {
1375 c.hideApexVariantFromMake = true
1376 }
1377
Jooyung Han38002912019-05-16 04:01:54 +09001378 c.makeLinkType = c.getMakeLinkType(actx)
Inseob Kim9516ee92019-05-09 10:56:13 +09001379
Inseob Kim64c43952019-08-26 16:52:35 +09001380 c.Properties.SubName = ""
1381
1382 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1383 c.Properties.SubName += nativeBridgeSuffix
1384 }
1385
Justin Yun5f7f7e82019-11-18 19:52:14 +09001386 _, llndk := c.linker.(*llndkStubDecorator)
1387 _, llndkHeader := c.linker.(*llndkHeadersDecorator)
1388 if llndk || llndkHeader || (c.UseVndk() && c.HasVendorVariant()) {
1389 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1390 // added for product variant only when we have vendor and product variants with core
1391 // variant. The suffix is not added for vendor-only or product-only module.
1392 c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
1393 } else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
Inseob Kim64c43952019-08-26 16:52:35 +09001394 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1395 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
1396 c.Properties.SubName += vendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001397 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
1398 c.Properties.SubName += ramdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001399 } else if c.InRecovery() && !c.OnlyInRecovery() {
Inseob Kim64c43952019-08-26 16:52:35 +09001400 c.Properties.SubName += recoverySuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001401 } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
Colin Crossc511bc52020-04-07 16:50:32 +00001402 c.Properties.SubName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001403 if c.SplitPerApiLevel() {
1404 c.Properties.SubName += "." + c.SdkVersion()
1405 }
Inseob Kim64c43952019-08-26 16:52:35 +09001406 }
1407
Colin Crossca860ac2016-01-04 14:34:37 -08001408 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001409 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001410 moduleContextImpl: moduleContextImpl{
1411 mod: c,
1412 },
1413 }
1414 ctx.ctx = ctx
1415
Colin Crossf18e1102017-11-16 14:33:08 -08001416 deps := c.depsToPaths(ctx)
1417 if ctx.Failed() {
1418 return
1419 }
1420
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001421 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1422 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1423 }
1424
Colin Crossca860ac2016-01-04 14:34:37 -08001425 flags := Flags{
1426 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001427 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001428 }
Colin Crossca860ac2016-01-04 14:34:37 -08001429 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001430 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001431 }
1432 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001433 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001434 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001435 if c.stl != nil {
1436 flags = c.stl.flags(ctx, flags)
1437 }
Colin Cross16b23492016-01-06 14:41:07 -08001438 if c.sanitize != nil {
1439 flags = c.sanitize.flags(ctx, flags)
1440 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001441 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001442 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001443 }
Stephen Craneba090d12017-05-09 15:44:35 -07001444 if c.lto != nil {
1445 flags = c.lto.flags(ctx, flags)
1446 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001447 if c.pgo != nil {
1448 flags = c.pgo.flags(ctx, flags)
1449 }
Colin Crossca860ac2016-01-04 14:34:37 -08001450 for _, feature := range c.features {
1451 flags = feature.flags(ctx, flags)
1452 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001453 if ctx.Failed() {
1454 return
1455 }
1456
Colin Cross4af21ed2019-11-04 09:37:55 -08001457 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1458 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1459 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001460
Colin Cross4af21ed2019-11-04 09:37:55 -08001461 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001462
1463 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001464 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001465 }
1466 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001467 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001468 }
1469
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001470 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001471 // We need access to all the flags seen by a source file.
1472 if c.sabi != nil {
1473 flags = c.sabi.flags(ctx, flags)
1474 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001475
Colin Cross4af21ed2019-11-04 09:37:55 -08001476 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001477
Colin Crossca860ac2016-01-04 14:34:37 -08001478 // Optimization to reduce size of build.ninja
1479 // Replace the long list of flags for each file with a module-local variable
Colin Cross4af21ed2019-11-04 09:37:55 -08001480 ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
1481 ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
1482 ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
1483 flags.Local.CFlags = []string{"$cflags"}
1484 flags.Local.CppFlags = []string{"$cppflags"}
1485 flags.Local.AsFlags = []string{"$asflags"}
Colin Crossca860ac2016-01-04 14:34:37 -08001486
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001487 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001488 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001489 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001490 if ctx.Failed() {
1491 return
1492 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001493 c.kytheFiles = objs.kytheFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001494 }
1495
Colin Crossca860ac2016-01-04 14:34:37 -08001496 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001497 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001498 if ctx.Failed() {
1499 return
1500 }
Colin Cross635c3b02016-05-18 15:37:25 -07001501 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001502
1503 // If a lib is directly included in any of the APEXes, unhide the stubs
1504 // variant having the latest version gets visible to make. In addition,
1505 // the non-stubs variant is renamed to <libname>.bootstrap. This is to
1506 // force anything in the make world to link against the stubs library.
1507 // (unless it is explicitly referenced via .bootstrap suffix or the
1508 // module is marked with 'bootstrap: true').
Colin Cross56a83212020-09-15 18:30:11 -07001509 if c.HasStubsVariants() && c.AnyVariantDirectlyInAnyApex() && !c.InRamdisk() &&
Ivan Lozano52767be2019-10-18 14:49:46 -07001510 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001511 c.IsStubs() {
Jiyong Parkb0788572018-12-20 22:10:17 +09001512 c.Properties.HideFromMake = false // unhide
1513 // Note: this is still non-installable
1514 }
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001515
1516 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current.
1517 if i, ok := c.linker.(snapshotLibraryInterface); ok && ctx.DeviceConfig().VndkVersion() == "current" {
Colin Cross56a83212020-09-15 18:30:11 -07001518 if isSnapshotAware(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001519 i.collectHeadersForSnapshot(ctx)
1520 }
1521 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001522 }
Colin Cross5049f022015-03-18 13:28:46 -07001523
Colin Cross56a83212020-09-15 18:30:11 -07001524 if c.installable(apexInfo) {
Colin Crossce75d2c2016-10-06 16:12:58 -07001525 c.installer.install(ctx, c.outputFile.Path())
1526 if ctx.Failed() {
1527 return
Colin Crossca860ac2016-01-04 14:34:37 -08001528 }
Paul Duffin0cb37b92020-03-04 14:52:46 +00001529 } else if !proptools.BoolDefault(c.Properties.Installable, true) {
1530 // If the module has been specifically configure to not be installed then
1531 // skip the installation as otherwise it will break when running inside make
1532 // as the output path to install will not be specified. Not all uninstallable
1533 // modules can skip installation as some are needed for resolving make side
1534 // dependencies.
1535 c.SkipInstall()
Dan Albertc403f7c2015-03-18 14:01:18 -07001536 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001537}
1538
Colin Cross0ea8ba82019-06-06 14:33:29 -07001539func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001540 if c.cachedToolchain == nil {
Colin Crossb98c8b02016-07-29 13:44:28 -07001541 c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
Colin Cross3f40fa42015-01-30 17:27:36 -08001542 }
Colin Crossca860ac2016-01-04 14:34:37 -08001543 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08001544}
1545
Colin Crossca860ac2016-01-04 14:34:37 -08001546func (c *Module) begin(ctx BaseModuleContext) {
1547 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001548 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07001549 }
Colin Crossca860ac2016-01-04 14:34:37 -08001550 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001551 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001552 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001553 if c.stl != nil {
1554 c.stl.begin(ctx)
1555 }
Colin Cross16b23492016-01-06 14:41:07 -08001556 if c.sanitize != nil {
1557 c.sanitize.begin(ctx)
1558 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001559 if c.coverage != nil {
1560 c.coverage.begin(ctx)
1561 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001562 if c.sabi != nil {
1563 c.sabi.begin(ctx)
1564 }
Justin Yun8effde42017-06-23 19:24:43 +09001565 if c.vndkdep != nil {
1566 c.vndkdep.begin(ctx)
1567 }
Stephen Craneba090d12017-05-09 15:44:35 -07001568 if c.lto != nil {
1569 c.lto.begin(ctx)
1570 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001571 if c.pgo != nil {
1572 c.pgo.begin(ctx)
1573 }
Colin Crossca860ac2016-01-04 14:34:37 -08001574 for _, feature := range c.features {
1575 feature.begin(ctx)
1576 }
Dan Albert92fe7402020-07-15 13:33:30 -07001577 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07001578 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001579 if err != nil {
1580 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07001581 c.Properties.Sdk_version = nil
1582 } else {
1583 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001584 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001585 }
Colin Crossca860ac2016-01-04 14:34:37 -08001586}
1587
Colin Cross37047f12016-12-13 17:06:13 -08001588func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07001589 deps := Deps{}
1590
1591 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001592 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001593 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001594 // Add the PGO dependency (the clang_rt.profile runtime library), which
1595 // sometimes depends on symbols from libgcc, before libgcc gets added
1596 // in linkerDeps().
Pirama Arumuga Nainar49b53d52017-10-04 16:47:29 -07001597 if c.pgo != nil {
1598 deps = c.pgo.deps(ctx, deps)
1599 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001600 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001601 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001602 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001603 if c.stl != nil {
1604 deps = c.stl.deps(ctx, deps)
1605 }
Colin Cross16b23492016-01-06 14:41:07 -08001606 if c.sanitize != nil {
1607 deps = c.sanitize.deps(ctx, deps)
1608 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001609 if c.coverage != nil {
1610 deps = c.coverage.deps(ctx, deps)
1611 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001612 if c.sabi != nil {
1613 deps = c.sabi.deps(ctx, deps)
1614 }
Justin Yun8effde42017-06-23 19:24:43 +09001615 if c.vndkdep != nil {
1616 deps = c.vndkdep.deps(ctx, deps)
1617 }
Stephen Craneba090d12017-05-09 15:44:35 -07001618 if c.lto != nil {
1619 deps = c.lto.deps(ctx, deps)
1620 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001621 for _, feature := range c.features {
1622 deps = feature.deps(ctx, deps)
1623 }
1624
Colin Crossb6715442017-10-24 11:13:31 -07001625 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1626 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1627 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
1628 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1629 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
1630 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08001631 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07001632
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001633 for _, lib := range deps.ReexportSharedLibHeaders {
1634 if !inList(lib, deps.SharedLibs) {
1635 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
1636 }
1637 }
1638
1639 for _, lib := range deps.ReexportStaticLibHeaders {
1640 if !inList(lib, deps.StaticLibs) {
1641 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib)
1642 }
1643 }
1644
Colin Cross5950f382016-12-13 12:50:57 -08001645 for _, lib := range deps.ReexportHeaderLibHeaders {
1646 if !inList(lib, deps.HeaderLibs) {
1647 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
1648 }
1649 }
1650
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001651 for _, gen := range deps.ReexportGeneratedHeaders {
1652 if !inList(gen, deps.GeneratedHeaders) {
1653 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
1654 }
1655 }
1656
Colin Crossc99deeb2016-04-11 15:06:20 -07001657 return deps
1658}
1659
Dan Albert7e9d2952016-08-04 13:02:36 -07001660func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08001661 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001662 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001663 moduleContextImpl: moduleContextImpl{
1664 mod: c,
1665 },
1666 }
1667 ctx.ctx = ctx
1668
Colin Crossca860ac2016-01-04 14:34:37 -08001669 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07001670}
1671
Jiyong Park7ed9de32018-10-15 22:25:07 +09001672// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09001673func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001674 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
1675 version := name[sharp+1:]
1676 libname := name[:sharp]
1677 return libname, version
1678 }
1679 return name, ""
1680}
1681
Dan Albert92fe7402020-07-15 13:33:30 -07001682func GetCrtVariations(ctx android.BottomUpMutatorContext,
1683 m LinkableInterface) []blueprint.Variation {
1684 if ctx.Os() != android.Android {
1685 return nil
1686 }
1687 if m.UseSdk() {
1688 return []blueprint.Variation{
1689 {Mutator: "sdk", Variation: "sdk"},
Colin Crossbbc941b2020-09-30 12:27:01 -07001690 {Mutator: "version", Variation: m.SdkVersion()},
Dan Albert92fe7402020-07-15 13:33:30 -07001691 }
1692 }
1693 return []blueprint.Variation{
1694 {Mutator: "sdk", Variation: ""},
1695 }
1696}
1697
Colin Crosse7257d22020-09-24 09:56:18 -07001698func (c *Module) addSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext,
1699 variations []blueprint.Variation, depTag libraryDependencyTag, name, version string, far bool) {
1700
1701 variations = append([]blueprint.Variation(nil), variations...)
1702
Colin Cross3146c5c2020-09-30 15:34:40 -07001703 if version != "" && CanBeOrLinkAgainstVersionVariants(c) {
Colin Crosse7257d22020-09-24 09:56:18 -07001704 // Version is explicitly specified. i.e. libFoo#30
1705 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
1706 depTag.explicitlyVersioned = true
1707 }
Colin Crosse7257d22020-09-24 09:56:18 -07001708
Colin Cross0de8a1e2020-09-18 14:15:30 -07001709 if far {
1710 ctx.AddFarVariationDependencies(variations, depTag, name)
1711 } else {
1712 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07001713 }
1714}
1715
Colin Cross1e676be2016-10-12 14:38:15 -07001716func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09001717 if !c.Enabled() {
1718 return
1719 }
1720
Colin Cross37047f12016-12-13 17:06:13 -08001721 ctx := &depsContext{
1722 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07001723 moduleContextImpl: moduleContextImpl{
1724 mod: c,
1725 },
1726 }
1727 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08001728
Colin Crossc99deeb2016-04-11 15:06:20 -07001729 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001730
Yo Chiang219968c2020-09-22 18:45:04 +08001731 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
1732
Dan Albert914449f2016-06-17 16:45:24 -07001733 variantNdkLibs := []string{}
1734 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07001735 if ctx.Os() == android.Android {
Inseob Kimeec88e12020-01-22 11:11:29 +09001736 // rewriteLibs takes a list of names of shared libraries and scans it for three types
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001737 // of names:
Dan Albert914449f2016-06-17 16:45:24 -07001738 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001739 // 1. Name of an NDK library that refers to a prebuilt module.
1740 // For each of these, it adds the name of the prebuilt module (which will be in
1741 // prebuilts/ndk) to the list of nonvariant libs.
1742 // 2. Name of an NDK library that refers to an ndk_library module.
1743 // For each of these, it adds the name of the ndk_library module to the list of
1744 // variant libs.
1745 // 3. Anything else (so anything that isn't an NDK library).
1746 // It adds these to the nonvariantLibs list.
Dan Albert914449f2016-06-17 16:45:24 -07001747 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001748 // The caller can then know to add the variantLibs dependencies differently from the
1749 // nonvariantLibs
Inseob Kim9516ee92019-05-09 10:56:13 +09001750
Inseob Kim9516ee92019-05-09 10:56:13 +09001751 vendorPublicLibraries := vendorPublicLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001752 vendorSnapshotSharedLibs := vendorSnapshotSharedLibs(actx.Config())
1753
1754 rewriteVendorLibs := func(lib string) string {
1755 if isLlndkLibrary(lib, ctx.Config()) {
1756 return lib + llndkLibrarySuffix
1757 }
1758
1759 // only modules with BOARD_VNDK_VERSION uses snapshot.
1760 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1761 return lib
1762 }
1763
1764 if snapshot, ok := vendorSnapshotSharedLibs.get(lib, actx.Arch().ArchType); ok {
1765 return snapshot
1766 }
1767
1768 return lib
1769 }
1770
1771 rewriteLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001772 variantLibs = []string{}
1773 nonvariantLibs = []string{}
Dan Albert914449f2016-06-17 16:45:24 -07001774 for _, entry := range list {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001775 // strip #version suffix out
Jiyong Park73c54ee2019-10-22 20:31:18 +09001776 name, _ := StubsLibNameAndVersion(entry)
Dan Albertde5aade2020-06-30 12:32:51 -07001777 if ctx.useSdk() && inList(name, ndkKnownLibs) {
1778 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Inseob Kimeec88e12020-01-22 11:11:29 +09001779 } else if ctx.useVndk() {
1780 nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
Inseob Kim9516ee92019-05-09 10:56:13 +09001781 } else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, *vendorPublicLibraries) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001782 vendorPublicLib := name + vendorPublicLibrarySuffix
Jiyong Park374510b2018-03-19 18:23:01 +09001783 if actx.OtherModuleExists(vendorPublicLib) {
1784 nonvariantLibs = append(nonvariantLibs, vendorPublicLib)
1785 } else {
1786 // This can happen if vendor_public_library module is defined in a
1787 // namespace that isn't visible to the current module. In that case,
1788 // link to the original library.
Jiyong Park7ed9de32018-10-15 22:25:07 +09001789 nonvariantLibs = append(nonvariantLibs, name)
Jiyong Park374510b2018-03-19 18:23:01 +09001790 }
Dan Albert914449f2016-06-17 16:45:24 -07001791 } else {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001792 // put name#version back
Dan Willemsen7cbf5f82017-03-28 00:08:30 -07001793 nonvariantLibs = append(nonvariantLibs, entry)
Dan Willemsen72d39932016-07-08 23:23:48 -07001794 }
1795 }
Dan Albert914449f2016-06-17 16:45:24 -07001796 return nonvariantLibs, variantLibs
Dan Willemsen72d39932016-07-08 23:23:48 -07001797 }
1798
Inseob Kimeec88e12020-01-22 11:11:29 +09001799 deps.SharedLibs, variantNdkLibs = rewriteLibs(deps.SharedLibs)
1800 deps.LateSharedLibs, variantLateNdkLibs = rewriteLibs(deps.LateSharedLibs)
1801 deps.ReexportSharedLibHeaders, _ = rewriteLibs(deps.ReexportSharedLibHeaders)
1802 if ctx.useVndk() {
1803 for idx, lib := range deps.RuntimeLibs {
1804 deps.RuntimeLibs[idx] = rewriteVendorLibs(lib)
1805 }
1806 }
Dan Willemsen72d39932016-07-08 23:23:48 -07001807 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001808
Jiyong Park7e636d02019-01-28 16:16:54 +09001809 buildStubs := false
Colin Crossc88c2722020-09-28 17:32:47 -07001810 if versioned, ok := c.linker.(versionedInterface); ok {
1811 if versioned.buildStubs() {
1812 buildStubs = true
Colin Crossd48fe732020-09-23 20:37:24 -07001813 }
Jiyong Park7ed9de32018-10-15 22:25:07 +09001814 }
1815
Inseob Kimeec88e12020-01-22 11:11:29 +09001816 rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string {
1817 // only modules with BOARD_VNDK_VERSION uses snapshot.
1818 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1819 return lib
1820 }
1821
1822 if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
1823 return snapshot
1824 }
1825
1826 return lib
1827 }
1828
1829 vendorSnapshotHeaderLibs := vendorSnapshotHeaderLibs(actx.Config())
Colin Cross32ec36c2016-12-15 07:39:51 -08001830 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001831 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08001832 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001833 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08001834 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001835
1836 lib = rewriteSnapshotLibs(lib, vendorSnapshotHeaderLibs)
1837
Jiyong Park7e636d02019-01-28 16:16:54 +09001838 if buildStubs {
Colin Cross7228ecd2019-11-18 16:00:16 -08001839 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07001840 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09001841 } else {
1842 actx.AddVariationDependencies(nil, depTag, lib)
1843 }
1844 }
1845
1846 if buildStubs {
1847 // Stubs lib does not have dependency to other static/shared libraries.
1848 // Don't proceed.
1849 return
Colin Cross32ec36c2016-12-15 07:39:51 -08001850 }
Colin Cross5950f382016-12-13 12:50:57 -08001851
Inseob Kimc0907f12019-02-08 21:00:45 +09001852 syspropImplLibraries := syspropImplLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001853 vendorSnapshotStaticLibs := vendorSnapshotStaticLibs(actx.Config())
Inseob Kimc0907f12019-02-08 21:00:45 +09001854
Jiyong Park5d1598f2019-02-25 22:14:17 +09001855 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001856 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09001857 if impl, ok := syspropImplLibraries[lib]; ok {
1858 lib = impl
1859 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001860
1861 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1862
Jiyong Park5d1598f2019-02-25 22:14:17 +09001863 actx.AddVariationDependencies([]blueprint.Variation{
1864 {Mutator: "link", Variation: "static"},
1865 }, depTag, lib)
1866 }
1867
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001868 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001869 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001870 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001871 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001872 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001873
1874 if impl, ok := syspropImplLibraries[lib]; ok {
1875 lib = impl
1876 }
1877
Inseob Kimeec88e12020-01-22 11:11:29 +09001878 lib = rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs)
1879
Dan Willemsen59339a22018-07-22 21:18:45 -07001880 actx.AddVariationDependencies([]blueprint.Variation{
1881 {Mutator: "link", Variation: "static"},
1882 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001883 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001884
Jooyung Han75568392020-03-20 04:29:24 +09001885 // staticUnwinderDep is treated as staticDep for Q apexes
1886 // so that native libraries/binaries are linked with static unwinder
1887 // because Q libc doesn't have unwinder APIs
1888 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07001889 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001890 actx.AddVariationDependencies([]blueprint.Variation{
1891 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001892 }, depTag, rewriteSnapshotLibs(staticUnwinder(actx), vendorSnapshotStaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08001893 }
1894
Inseob Kimeec88e12020-01-22 11:11:29 +09001895 for _, lib := range deps.LateStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001896 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Inseob Kimeec88e12020-01-22 11:11:29 +09001897 actx.AddVariationDependencies([]blueprint.Variation{
1898 {Mutator: "link", Variation: "static"},
Colin Cross6e511a92020-07-27 21:26:48 -07001899 }, depTag, rewriteSnapshotLibs(lib, vendorSnapshotStaticLibs))
Inseob Kimeec88e12020-01-22 11:11:29 +09001900 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001901
Jiyong Park7ed9de32018-10-15 22:25:07 +09001902 // shared lib names without the #version suffix
1903 var sharedLibNames []string
1904
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001905 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001906 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001907 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001908 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001909 }
Inseob Kimc0907f12019-02-08 21:00:45 +09001910
1911 if impl, ok := syspropImplLibraries[lib]; ok {
1912 lib = impl
1913 }
1914
Jiyong Park73c54ee2019-10-22 20:31:18 +09001915 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09001916 sharedLibNames = append(sharedLibNames, name)
1917
Colin Crosse7257d22020-09-24 09:56:18 -07001918 variations := []blueprint.Variation{
1919 {Mutator: "link", Variation: "shared"},
1920 }
1921 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001922 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001923
Jiyong Park7ed9de32018-10-15 22:25:07 +09001924 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09001925 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001926 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
1927 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
1928 // linking against both the stubs lib and the non-stubs lib at the same time.
1929 continue
1930 }
Colin Cross6e511a92020-07-27 21:26:48 -07001931 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07001932 variations := []blueprint.Variation{
1933 {Mutator: "link", Variation: "shared"},
1934 }
1935 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09001936 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001937
Dan Willemsen59339a22018-07-22 21:18:45 -07001938 actx.AddVariationDependencies([]blueprint.Variation{
1939 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04001940 }, dataLibDepTag, deps.DataLibs...)
1941
1942 actx.AddVariationDependencies([]blueprint.Variation{
1943 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07001944 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08001945
Colin Cross68861832016-07-08 10:41:41 -07001946 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001947
1948 for _, gen := range deps.GeneratedHeaders {
1949 depTag := genHeaderDepTag
1950 if inList(gen, deps.ReexportGeneratedHeaders) {
1951 depTag = genHeaderExportDepTag
1952 }
1953 actx.AddDependency(c, depTag, gen)
1954 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07001955
Inseob Kim1042d292020-06-01 23:23:05 +09001956 vendorSnapshotObjects := vendorSnapshotObjects(actx.Config())
1957
Dan Albert92fe7402020-07-15 13:33:30 -07001958 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07001959 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc99deeb2016-04-11 15:06:20 -07001960 if deps.CrtBegin != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07001961 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
1962 rewriteSnapshotLibs(deps.CrtBegin, vendorSnapshotObjects))
Colin Crossca860ac2016-01-04 14:34:37 -08001963 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001964 if deps.CrtEnd != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07001965 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
1966 rewriteSnapshotLibs(deps.CrtEnd, vendorSnapshotObjects))
Colin Cross21b9a242015-03-24 14:15:58 -07001967 }
Dan Willemsena0790e32018-10-12 00:24:23 -07001968 if deps.LinkerFlagsFile != "" {
1969 actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
1970 }
1971 if deps.DynamicLinker != "" {
1972 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07001973 }
Dan Albert914449f2016-06-17 16:45:24 -07001974
1975 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07001976
1977 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07001978 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07001979 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07001980 {Mutator: "link", Variation: "shared"},
1981 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07001982
1983 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07001984 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07001985 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07001986 {Mutator: "link", Variation: "shared"},
1987 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08001988
1989 if vndkdep := c.vndkdep; vndkdep != nil {
1990 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08001991 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08001992 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07001993 {Mutator: "link", Variation: "shared"},
1994 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08001995 }
1996 }
Colin Cross6362e272015-10-29 15:25:03 -07001997}
Colin Cross21b9a242015-03-24 14:15:58 -07001998
Colin Crosse40b4ea2018-10-02 22:25:58 -07001999func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002000 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2001 c.beginMutator(ctx)
2002 }
2003}
2004
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002005// Whether a module can link to another module, taking into
2006// account NDK linking.
Colin Cross6e511a92020-07-27 21:26:48 -07002007func checkLinkType(ctx android.ModuleContext, from LinkableInterface, to LinkableInterface,
2008 tag blueprint.DependencyTag) {
2009
2010 switch t := tag.(type) {
2011 case dependencyTag:
2012 if t != vndkExtDepTag {
2013 return
2014 }
2015 case libraryDependencyTag:
2016 default:
2017 return
2018 }
2019
Ivan Lozano52767be2019-10-18 14:49:46 -07002020 if from.Module().Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002021 // Host code is not restricted
2022 return
2023 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002024
2025 // VNDK is cc.Module supported only for now.
2026 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002027 // Though vendor code is limited by the vendor mutator,
2028 // each vendor-available module needs to check
2029 // link-type for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002030 if ccTo, ok := to.(*Module); ok {
2031 if ccFrom.vndkdep != nil {
2032 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2033 }
2034 } else {
2035 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002036 }
2037 return
2038 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002039 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002040 // Platform code can link to anything
2041 return
2042 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002043 if from.InRamdisk() {
2044 // Ramdisk code is not NDK
2045 return
2046 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002047 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002048 // Recovery code is not NDK
2049 return
2050 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002051 if to.ToolchainLibrary() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002052 // These are always allowed
2053 return
2054 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002055 if to.NdkPrebuiltStl() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002056 // These are allowed, but they don't set sdk_version
2057 return
2058 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002059 if to.StubDecorator() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002060 // These aren't real libraries, but are the stub shared libraries that are included in
2061 // the NDK.
2062 return
2063 }
Logan Chien834b9a62019-01-14 15:39:03 +08002064
Ivan Lozano52767be2019-10-18 14:49:46 -07002065 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002066 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2067 // to link to libc++ (non-NDK and without sdk_version).
2068 return
2069 }
2070
Ivan Lozano52767be2019-10-18 14:49:46 -07002071 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002072 // NDK code linking to platform code is never okay.
2073 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002074 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002075 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002076 }
2077
2078 // At this point we know we have two NDK libraries, but we need to
2079 // check that we're not linking against anything built against a higher
2080 // API level, as it is only valid to link against older or equivalent
2081 // APIs.
2082
Inseob Kim01a28722018-04-11 09:48:45 +09002083 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002084 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002085 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002086 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002087 // Current can't be linked against by anything else.
2088 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002089 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002090 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002091 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002092 if err != nil {
2093 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002094 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002095 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002096 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002097 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002098 if err != nil {
2099 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002100 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002101 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002102 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002103
Inseob Kim01a28722018-04-11 09:48:45 +09002104 if toApi > fromApi {
2105 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002106 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002107 }
2108 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002109 }
Dan Albert202fe492017-12-15 13:56:59 -08002110
2111 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002112 fromStl := from.SelectedStl()
2113 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002114 if fromStl == "" || toStl == "" {
2115 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002116 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002117 // We can be permissive with the system "STL" since it is only the C++
2118 // ABI layer, but in the future we should make sure that everyone is
2119 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002120 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002121 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002122 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2123 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002124 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002125}
2126
Jiyong Park5fb8c102018-04-09 12:03:06 +09002127// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002128// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2129// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002130// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002131func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2132 check := func(child, parent android.Module) bool {
2133 to, ok := child.(*Module)
2134 if !ok {
2135 // follow thru cc.Defaults, etc.
2136 return true
2137 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002138
Jooyung Hana70f0672019-01-18 15:20:43 +09002139 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2140 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002141 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002142
2143 // if target lib has no vendor variant, keep checking dependency graph
Ivan Lozano52767be2019-10-18 14:49:46 -07002144 if !to.HasVendorVariant() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002145 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002146 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002147
Jooyung Han0302a842019-10-30 18:43:49 +09002148 if to.isVndkSp() || to.isLlndk(ctx.Config()) || Bool(to.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002149 return false
2150 }
2151
2152 var stringPath []string
2153 for _, m := range ctx.GetWalkPath() {
2154 stringPath = append(stringPath, m.Name())
2155 }
2156 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2157 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
2158 "(dependency: %s)", ctx.OtherModuleName(to), strings.Join(stringPath, " -> "))
2159 return false
2160 }
2161 if module, ok := ctx.Module().(*Module); ok {
2162 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jooyung Han0302a842019-10-30 18:43:49 +09002163 if module.isLlndk(ctx.Config()) || Bool(module.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002164 ctx.WalkDeps(check)
2165 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002166 }
2167 }
2168}
2169
Colin Cross0de8a1e2020-09-18 14:15:30 -07002170// Returns the highest version which is <= maxSdkVersion.
2171// For example, with maxSdkVersion is 10 and versionList is [9,11]
2172// it returns 9 as string. The list of stubs must be in order from
2173// oldest to newest.
2174func (c *Module) chooseSdkVersion(ctx android.PathContext, stubsInfo []SharedLibraryStubsInfo,
2175 maxSdkVersion android.ApiLevel) (SharedLibraryStubsInfo, error) {
2176
2177 for i := range stubsInfo {
2178 stubInfo := stubsInfo[len(stubsInfo)-i-1]
2179 var ver android.ApiLevel
2180 if stubInfo.Version == "" {
2181 ver = android.FutureApiLevel
2182 } else {
2183 var err error
2184 ver, err = android.ApiLevelFromUser(ctx, stubInfo.Version)
2185 if err != nil {
2186 return SharedLibraryStubsInfo{}, err
2187 }
2188 }
2189 if ver.LessThanOrEqualTo(maxSdkVersion) {
2190 return stubInfo, nil
2191 }
2192 }
2193 var versionList []string
2194 for _, stubInfo := range stubsInfo {
2195 versionList = append(versionList, stubInfo.Version)
2196 }
2197 return SharedLibraryStubsInfo{}, fmt.Errorf("not found a version(<=%s) in versionList: %v", maxSdkVersion.String(), versionList)
2198}
2199
Colin Crossc99deeb2016-04-11 15:06:20 -07002200// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002201func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002202 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002203
Colin Cross0de8a1e2020-09-18 14:15:30 -07002204 var directStaticDeps []StaticLibraryInfo
2205 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002206
Colin Cross0de8a1e2020-09-18 14:15:30 -07002207 reexportExporter := func(exporter FlagExporterInfo) {
2208 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2209 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2210 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2211 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2212 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002213 }
2214
Jooyung Hande34d232020-07-23 13:04:15 +09002215 // For the dependency from platform to apex, use the latest stubs
2216 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002217 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2218 if !apexInfo.IsForPlatform() {
2219 c.apexSdkVersion = apexInfo.MinSdkVersion(ctx)
Jooyung Hande34d232020-07-23 13:04:15 +09002220 }
2221
2222 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2223 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2224 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2225 // (b/144430859)
2226 c.apexSdkVersion = android.FutureApiLevel
2227 }
2228
Colin Crossd11fcda2017-10-23 17:59:01 -07002229 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002230 depName := ctx.OtherModuleName(dep)
2231 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002232
Ivan Lozano52767be2019-10-18 14:49:46 -07002233 ccDep, ok := dep.(LinkableInterface)
2234 if !ok {
2235
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002236 // handling for a few module types that aren't cc Module but that are also supported
2237 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002238 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002239 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002240 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2241 genRule.GeneratedSourceFiles()...)
2242 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002243 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002244 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002245 // Support exported headers from a generated_sources dependency
2246 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002247 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002248 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002249 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002250 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002251 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002252 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002253 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002254 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002255 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2256 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002257 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002258 // 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 +09002259 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002260
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002261 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002262 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002263 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002264 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002265 case linkerFlagsDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002266 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002267 files := genRule.GeneratedSourceFiles()
2268 if len(files) == 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002269 depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002270 } else if len(files) > 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002271 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 -07002272 }
2273 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002274 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002275 }
Colin Crossca860ac2016-01-04 14:34:37 -08002276 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002277 return
2278 }
2279
Colin Crossfe17f6f2019-03-28 19:30:56 -07002280 if depTag == android.ProtoPluginDepTag {
2281 return
2282 }
Jooyung Han61b66e92020-03-21 14:21:46 +00002283 if depTag == llndkImplDep {
2284 return
2285 }
Colin Crossfe17f6f2019-03-28 19:30:56 -07002286
Colin Crossd11fcda2017-10-23 17:59:01 -07002287 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002288 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2289 return
2290 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002291 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002292 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2293 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002294 return
2295 }
2296
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002297 if depTag == reuseObjTag {
Ivan Lozano52767be2019-10-18 14:49:46 -07002298 // reusing objects only make sense for cc.Modules.
Colin Cross0de8a1e2020-09-18 14:15:30 -07002299 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2300 objs := staticAnalogue.ReuseObjects
2301 depPaths.Objs = depPaths.Objs.Append(objs)
2302 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2303 reexportExporter(depExporterInfo)
2304 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002305 }
2306
Colin Cross6e511a92020-07-27 21:26:48 -07002307 checkLinkType(ctx, c, ccDep, depTag)
2308
2309 linkFile := ccDep.OutputFile()
2310
2311 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2312 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002313 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002314 return
2315 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002316
Colin Cross0de8a1e2020-09-18 14:15:30 -07002317 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002318
Colin Cross6e511a92020-07-27 21:26:48 -07002319 var ptr *android.Paths
2320 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002321
Colin Cross6e511a92020-07-27 21:26:48 -07002322 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002323
Colin Cross6e511a92020-07-27 21:26:48 -07002324 switch {
2325 case libDepTag.header():
2326 // nothing
2327 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002328 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2329 if !ctx.Config().AllowMissingDependencies() {
2330 ctx.ModuleErrorf("module %q is not a shared library", depName)
2331 } else {
2332 ctx.AddMissingDependencies([]string{depName})
2333 }
2334 return
2335 }
2336 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
2337 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryImplementationStubsInfoProvider).(SharedLibraryImplementationStubsInfo)
2338
2339 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedLibraryStubsInfos) > 0 {
2340 useStubs := false
2341 if m, ok := ccDep.(*Module); ok && m.IsStubs() && c.UseVndk() { // LLNDK
2342 if !apexInfo.IsForPlatform() {
2343 // For platform libraries, use current version of LLNDK
2344 // If this is for use_vendor apex we will apply the same rules
2345 // of apex sdk enforcement below to choose right version.
2346 useStubs = true
2347 }
2348 } else if apexInfo.IsForPlatform() {
2349 // If not building for APEX, use stubs only when it is from
2350 // an APEX (and not from platform)
2351 // However, for host, ramdisk, recovery or bootstrap modules,
2352 // always link to non-stub variant
2353 useStubs = dep.(android.ApexModule).AnyVariantDirectlyInAnyApex() && !c.bootstrap()
2354 // Another exception: if this module is bundled with an APEX, then
2355 // it is linked with the non-stub variant of a module in the APEX
2356 // as if this is part of the APEX.
2357 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
2358 for _, apexContents := range testFor.ApexContents {
2359 if apexContents.DirectlyInApex(depName) {
2360 useStubs = false
2361 break
2362 }
2363 }
2364 } else {
2365 // If building for APEX, use stubs when the parent is in any APEX that
2366 // the child is not in.
2367 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
2368 }
2369
2370 // when to use (unspecified) stubs, check min_sdk_version and choose the right one
2371 if useStubs {
2372 sharedLibraryStubsInfo, err :=
2373 c.chooseSdkVersion(ctx, sharedLibraryStubsInfo.SharedLibraryStubsInfos, c.apexSdkVersion)
2374 if err != nil {
2375 ctx.OtherModuleErrorf(dep, err.Error())
2376 return
2377 }
2378 sharedLibraryInfo = sharedLibraryStubsInfo.SharedLibraryInfo
2379 depExporterInfo = sharedLibraryStubsInfo.FlagExporterInfo
2380 }
2381 }
2382
2383 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2384 depFile = sharedLibraryInfo.TableOfContents
2385
Colin Cross6e511a92020-07-27 21:26:48 -07002386 ptr = &depPaths.SharedLibs
2387 switch libDepTag.Order {
2388 case earlyLibraryDependency:
2389 ptr = &depPaths.EarlySharedLibs
2390 depPtr = &depPaths.EarlySharedLibsDeps
2391 case normalLibraryDependency:
2392 ptr = &depPaths.SharedLibs
2393 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002394 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002395 case lateLibraryDependency:
2396 ptr = &depPaths.LateSharedLibs
2397 depPtr = &depPaths.LateSharedLibsDeps
2398 default:
2399 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002400 }
Colin Cross6e511a92020-07-27 21:26:48 -07002401 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002402 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2403 if !ctx.Config().AllowMissingDependencies() {
2404 ctx.ModuleErrorf("module %q is not a static library", depName)
2405 } else {
2406 ctx.AddMissingDependencies([]string{depName})
2407 }
2408 return
2409 }
2410 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2411 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002412 if libDepTag.wholeStatic {
2413 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002414 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2415 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002416 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002417 // This case normally catches prebuilt static
2418 // libraries, but it can also occur when
2419 // AllowMissingDependencies is on and the
2420 // dependencies has no sources of its own
2421 // but has a whole_static_libs dependency
2422 // on a missing library. We want to depend
2423 // on the .a file so that there is something
2424 // in the dependency tree that contains the
2425 // error rule for the missing transitive
2426 // dependency.
2427 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002428 }
Colin Cross6e511a92020-07-27 21:26:48 -07002429 } else {
2430 switch libDepTag.Order {
2431 case earlyLibraryDependency:
2432 panic(fmt.Errorf("early static libs not suppported"))
2433 case normalLibraryDependency:
2434 // static dependencies will be handled separately so they can be ordered
2435 // using transitive dependencies.
2436 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002437 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002438 case lateLibraryDependency:
2439 ptr = &depPaths.LateStaticLibs
2440 default:
2441 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002442 }
2443 }
2444 }
2445
Colin Cross6e511a92020-07-27 21:26:48 -07002446 if libDepTag.static() && !libDepTag.wholeStatic {
2447 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2448 ctx.ModuleErrorf("module %q not a static library", depName)
2449 return
2450 }
Logan Chien43d34c32017-12-20 01:17:32 +08002451
Colin Cross6e511a92020-07-27 21:26:48 -07002452 // When combining coverage files for shared libraries and executables, coverage files
2453 // in static libraries act as if they were whole static libraries. The same goes for
2454 // source based Abi dump files.
2455 if c, ok := ccDep.(*Module); ok {
2456 staticLib := c.linker.(libraryInterface)
2457 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2458 staticLib.objs().coverageFiles...)
2459 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2460 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002461 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002462 // Handle non-CC modules here
2463 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002464 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002465 }
2466 }
2467
Colin Cross6e511a92020-07-27 21:26:48 -07002468 if ptr != nil {
2469 if !linkFile.Valid() {
2470 if !ctx.Config().AllowMissingDependencies() {
2471 ctx.ModuleErrorf("module %q missing output file", depName)
2472 } else {
2473 ctx.AddMissingDependencies([]string{depName})
2474 }
2475 return
2476 }
2477 *ptr = append(*ptr, linkFile.Path())
2478 }
2479
2480 if depPtr != nil {
2481 dep := depFile
2482 if !dep.Valid() {
2483 dep = linkFile
2484 }
2485 *depPtr = append(*depPtr, dep.Path())
2486 }
2487
Colin Cross0de8a1e2020-09-18 14:15:30 -07002488 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2489 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2490 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2491 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2492
2493 if libDepTag.reexportFlags {
2494 reexportExporter(depExporterInfo)
2495 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2496 // Re-exported shared library headers must be included as well since they can help us with type information
2497 // about template instantiations (instantiated from their headers).
2498 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2499 // scripts.
2500 c.sabi.Properties.ReexportedIncludes = append(
2501 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2502 }
2503
Colin Cross6e511a92020-07-27 21:26:48 -07002504 makeLibName := c.makeLibName(ctx, ccDep, depName) + libDepTag.makeSuffix
2505 switch {
2506 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002507 c.Properties.AndroidMkHeaderLibs = append(
2508 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002509 case libDepTag.shared():
2510 if ccDep.CcLibrary() {
Colin Cross56a83212020-09-15 18:30:11 -07002511 if ccDep.BuildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002512 // Add the dependency to the APEX(es) providing the library so that
2513 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002514 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
2515 for _, an := range depApexInfo.InApexes {
Colin Cross6e511a92020-07-27 21:26:48 -07002516 c.Properties.ApexesProvidingSharedLibs = append(
2517 c.Properties.ApexesProvidingSharedLibs, an)
2518 }
2519 }
2520 }
2521
2522 // Note: the order of libs in this list is not important because
2523 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002524 c.Properties.AndroidMkSharedLibs = append(
2525 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002526 // Record baseLibName for snapshots.
2527 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, baseLibName(depName))
2528 case libDepTag.static():
2529 if libDepTag.wholeStatic {
2530 c.Properties.AndroidMkWholeStaticLibs = append(
2531 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2532 } else {
2533 c.Properties.AndroidMkStaticLibs = append(
2534 c.Properties.AndroidMkStaticLibs, makeLibName)
2535 }
2536 }
2537 } else {
2538 switch depTag {
2539 case runtimeDepTag:
2540 c.Properties.AndroidMkRuntimeLibs = append(
2541 c.Properties.AndroidMkRuntimeLibs, c.makeLibName(ctx, ccDep, depName)+libDepTag.makeSuffix)
2542 // Record baseLibName for snapshots.
2543 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, baseLibName(depName))
2544 case objDepTag:
2545 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2546 case CrtBeginDepTag:
2547 depPaths.CrtBegin = linkFile
2548 case CrtEndDepTag:
2549 depPaths.CrtEnd = linkFile
2550 case dynamicLinkerDepTag:
2551 depPaths.DynamicLinker = linkFile
2552 }
Jiyong Park27b188b2017-07-18 13:23:39 +09002553 }
Colin Crossca860ac2016-01-04 14:34:37 -08002554 })
2555
Jeff Gaston294356f2017-09-27 17:05:30 -07002556 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07002557 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
2558 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
2559 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07002560
Colin Crossdd84e052017-05-17 13:44:16 -07002561 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07002562 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09002563 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
2564 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09002565 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09002566 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
2567 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07002568 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09002569 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09002570 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002571
2572 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09002573 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002574 }
Colin Crossdd84e052017-05-17 13:44:16 -07002575
Colin Crossca860ac2016-01-04 14:34:37 -08002576 return depPaths
2577}
2578
Colin Cross0de8a1e2020-09-18 14:15:30 -07002579// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
2580// to match the topological order of the dependency tree, including any static analogues of
2581// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
2582// of the transitive dependencies.
2583func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
2584 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
2585 var staticPaths android.Paths
2586 for _, staticDep := range staticDeps {
2587 staticPaths = append(staticPaths, staticDep.StaticLibrary)
2588 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
2589 }
2590 for _, sharedDep := range sharedDeps {
2591 if sharedDep.StaticAnalogue != nil {
2592 transitiveStaticLibsBuilder.Transitive(sharedDep.StaticAnalogue.TransitiveStaticLibrariesForOrdering)
2593 }
2594 }
2595 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
2596
2597 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
2598
2599 // reorder the dependencies based on transitive dependencies
2600 staticPaths = android.FirstUniquePaths(staticPaths)
2601 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
2602
2603 if len(orderedStaticPaths) != len(staticPaths) {
2604 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
2605 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
2606 }
2607
2608 return orderedStaticPaths, transitiveStaticLibs
2609}
2610
Colin Cross6e511a92020-07-27 21:26:48 -07002611// baseLibName trims known prefixes and suffixes
2612func baseLibName(depName string) string {
2613 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
2614 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
2615 libName = strings.TrimPrefix(libName, "prebuilt_")
2616 return libName
2617}
2618
2619func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, depName string) string {
2620 vendorSuffixModules := vendorSuffixModules(ctx.Config())
2621 vendorPublicLibraries := vendorPublicLibraries(ctx.Config())
2622
2623 libName := baseLibName(depName)
2624 isLLndk := isLlndkLibrary(libName, ctx.Config())
2625 isVendorPublicLib := inList(libName, *vendorPublicLibraries)
2626 bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk
2627
2628 if c, ok := ccDep.(*Module); ok {
2629 // Use base module name for snapshots when exporting to Makefile.
2630 if c.isSnapshotPrebuilt() {
2631 baseName := c.BaseModuleName()
2632
2633 if c.IsVndk() {
2634 return baseName + ".vendor"
2635 }
2636
2637 if vendorSuffixModules[baseName] {
2638 return baseName + ".vendor"
2639 } else {
2640 return baseName
2641 }
2642 }
2643 }
2644
2645 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() && !c.InRamdisk() && !c.InRecovery() {
2646 // The vendor module is a no-vendor-variant VNDK library. Depend on the
2647 // core module instead.
2648 return libName
2649 } else if c.UseVndk() && bothVendorAndCoreVariantsExist {
2650 // The vendor module in Make will have been renamed to not conflict with the core
2651 // module, so update the dependency name here accordingly.
2652 return libName + c.getNameSuffixWithVndkVersion(ctx)
2653 } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
2654 return libName + vendorPublicLibrarySuffix
2655 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
2656 return libName + ramdiskSuffix
2657 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
2658 return libName + recoverySuffix
2659 } else if ccDep.Module().Target().NativeBridge == android.NativeBridgeEnabled {
2660 return libName + nativeBridgeSuffix
2661 } else {
2662 return libName
2663 }
2664}
2665
Colin Crossca860ac2016-01-04 14:34:37 -08002666func (c *Module) InstallInData() bool {
2667 if c.installer == nil {
2668 return false
2669 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002670 return c.installer.inData()
2671}
2672
2673func (c *Module) InstallInSanitizerDir() bool {
2674 if c.installer == nil {
2675 return false
2676 }
2677 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07002678 return true
2679 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002680 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08002681}
2682
Yifan Hong1b3348d2020-01-21 15:53:22 -08002683func (c *Module) InstallInRamdisk() bool {
2684 return c.InRamdisk()
2685}
2686
Jiyong Parkf9332f12018-02-01 00:54:12 +09002687func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07002688 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002689}
2690
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002691func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002692 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002693 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002694 return
2695 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002696 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002697}
2698
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07002699func (c *Module) HostToolPath() android.OptionalPath {
2700 if c.installer == nil {
2701 return android.OptionalPath{}
2702 }
2703 return c.installer.hostToolPath()
2704}
2705
Nan Zhangd4e641b2017-07-12 12:55:28 -07002706func (c *Module) IntermPathForModuleOut() android.OptionalPath {
2707 return c.outputFile
2708}
2709
Colin Cross41955e82019-05-29 14:40:35 -07002710func (c *Module) OutputFiles(tag string) (android.Paths, error) {
2711 switch tag {
2712 case "":
2713 if c.outputFile.Valid() {
2714 return android.Paths{c.outputFile.Path()}, nil
2715 }
2716 return android.Paths{}, nil
2717 default:
2718 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002719 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002720}
2721
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00002722func (c *Module) static() bool {
2723 if static, ok := c.linker.(interface {
2724 static() bool
2725 }); ok {
2726 return static.static()
2727 }
2728 return false
2729}
2730
Jiyong Park379de2f2018-12-19 02:47:14 +09002731func (c *Module) staticBinary() bool {
2732 if static, ok := c.linker.(interface {
2733 staticBinary() bool
2734 }); ok {
2735 return static.staticBinary()
2736 }
2737 return false
2738}
2739
Jiyong Park1d1119f2019-07-29 21:27:18 +09002740func (c *Module) header() bool {
2741 if h, ok := c.linker.(interface {
2742 header() bool
2743 }); ok {
2744 return h.header()
2745 }
2746 return false
2747}
2748
Inseob Kim7f283f42020-06-01 21:53:49 +09002749func (c *Module) binary() bool {
2750 if b, ok := c.linker.(interface {
2751 binary() bool
2752 }); ok {
2753 return b.binary()
2754 }
2755 return false
2756}
2757
Inseob Kim1042d292020-06-01 23:23:05 +09002758func (c *Module) object() bool {
2759 if o, ok := c.linker.(interface {
2760 object() bool
2761 }); ok {
2762 return o.object()
2763 }
2764 return false
2765}
2766
Jooyung Han38002912019-05-16 04:01:54 +09002767func (c *Module) getMakeLinkType(actx android.ModuleContext) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07002768 if c.UseVndk() {
Jooyung Han38002912019-05-16 04:01:54 +09002769 if lib, ok := c.linker.(*llndkStubDecorator); ok {
2770 if Bool(lib.Properties.Vendor_available) {
Colin Crossb60190a2018-09-04 16:28:17 -07002771 return "native:vndk"
2772 }
Jooyung Han38002912019-05-16 04:01:54 +09002773 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07002774 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002775 if c.IsVndk() && !c.isVndkExt() {
Jooyung Han38002912019-05-16 04:01:54 +09002776 if Bool(c.VendorProperties.Vendor_available) {
2777 return "native:vndk"
2778 }
2779 return "native:vndk_private"
2780 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09002781 if c.inProduct() {
2782 return "native:product"
2783 }
Jooyung Han38002912019-05-16 04:01:54 +09002784 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08002785 } else if c.InRamdisk() {
2786 return "native:ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07002787 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07002788 return "native:recovery"
2789 } else if c.Target().Os == android.Android && String(c.Properties.Sdk_version) != "" {
2790 return "native:ndk:none:none"
2791 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
2792 //family, link := getNdkStlFamilyAndLinkType(c)
2793 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07002794 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08002795 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07002796 } else {
2797 return "native:platform"
2798 }
2799}
2800
Jiyong Park9d452992018-10-03 00:38:19 +09002801// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01002802// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09002803func (c *Module) IsInstallableToApex() bool {
2804 if shared, ok := c.linker.(interface {
2805 shared() bool
2806 }); ok {
Jiyong Park73c54ee2019-10-22 20:31:18 +09002807 // Stub libs and prebuilt libs in a versioned SDK are not
2808 // installable to APEX even though they are shared libs.
2809 return shared.shared() && !c.IsStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01002810 } else if _, ok := c.linker.(testPerSrc); ok {
2811 return true
Jiyong Park9d452992018-10-03 00:38:19 +09002812 }
2813 return false
2814}
2815
Jiyong Parka90ca002019-10-07 15:47:24 +09002816func (c *Module) AvailableFor(what string) bool {
2817 if linker, ok := c.linker.(interface {
2818 availableFor(string) bool
2819 }); ok {
2820 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
2821 } else {
2822 return c.ApexModuleBase.AvailableFor(what)
2823 }
2824}
2825
Jiyong Park62304bb2020-04-13 16:19:48 +09002826func (c *Module) TestFor() []string {
2827 if test, ok := c.linker.(interface {
2828 testFor() []string
2829 }); ok {
2830 return test.testFor()
2831 } else {
2832 return c.ApexModuleBase.TestFor()
2833 }
2834}
2835
Colin Crossaede88c2020-08-11 12:17:01 -07002836func (c *Module) UniqueApexVariations() bool {
2837 if u, ok := c.compiler.(interface {
2838 uniqueApexVariations() bool
2839 }); ok {
2840 return u.uniqueApexVariations()
2841 } else {
2842 return false
2843 }
2844}
2845
Paul Duffin0cb37b92020-03-04 14:52:46 +00002846// Return true if the module is ever installable.
2847func (c *Module) EverInstallable() bool {
2848 return c.installer != nil &&
2849 // Check to see whether the module is actually ever installable.
2850 c.installer.everInstallable()
2851}
2852
Colin Cross56a83212020-09-15 18:30:11 -07002853func (c *Module) installable(apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00002854 ret := c.EverInstallable() &&
2855 // Check to see whether the module has been configured to not be installed.
2856 proptools.BoolDefault(c.Properties.Installable, true) &&
2857 !c.Properties.PreventInstall && c.outputFile.Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002858
2859 // The platform variant doesn't need further condition. Apex variants however might not
2860 // be installable because it will likely to be included in the APEX and won't appear
2861 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07002862 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09002863 return ret
2864 }
2865
2866 // Special case for modules that are configured to be installed to /data, which includes
2867 // test modules. For these modules, both APEX and non-APEX variants are considered as
2868 // installable. This is because even the APEX variants won't be included in the APEX, but
2869 // will anyway be installed to /data/*.
2870 // See b/146995717
2871 if c.InstallInData() {
2872 return ret
2873 }
2874
2875 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09002876}
2877
Logan Chien41eabe62019-04-10 13:33:58 +08002878func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
2879 if c.linker != nil {
2880 if library, ok := c.linker.(*libraryDecorator); ok {
2881 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
2882 }
2883 }
2884}
2885
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002886func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07002887 depTag := ctx.OtherModuleDependencyTag(dep)
2888 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
2889
2890 if cc, ok := dep.(*Module); ok {
2891 if cc.HasStubsVariants() {
2892 if isLibDepTag && libDepTag.shared() {
2893 // dynamic dep to a stubs lib crosses APEX boundary
2894 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09002895 }
Colin Cross6e511a92020-07-27 21:26:48 -07002896 if IsRuntimeDepTag(depTag) {
2897 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09002898 return false
2899 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002900 }
Colin Crossaac32222020-07-29 12:51:56 -07002901 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07002902 // shared_lib dependency from a static lib is considered as crossing
2903 // the APEX boundary because the dependency doesn't actually is
2904 // linked; the dependency is used only during the compilation phase.
2905 return false
2906 }
2907 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002908 if depTag == stubImplDepTag || depTag == llndkImplDep {
2909 // We don't track beyond LLNDK or from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09002910 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09002911 }
2912 return true
2913}
2914
Dan Albertc8060532020-07-22 22:32:17 -07002915func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
2916 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09002917 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
2918 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
2919 return nil
2920 }
2921 // b/154569636: set min_sdk_version correctly for toolchain_libraries
2922 if c.ToolchainLibrary() {
2923 return nil
2924 }
2925 // We don't check for prebuilt modules
2926 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
2927 return nil
2928 }
2929 minSdkVersion := c.MinSdkVersion()
2930 if minSdkVersion == "apex_inherit" {
2931 return nil
2932 }
2933 if minSdkVersion == "" {
2934 // JNI libs within APK-in-APEX fall into here
2935 // Those are okay to set sdk_version instead
2936 // We don't have to check if this is a SDK variant because
2937 // non-SDK variant resets sdk_version, which works too.
2938 minSdkVersion = c.SdkVersion()
2939 }
Dan Albertc8060532020-07-22 22:32:17 -07002940 if minSdkVersion == "" {
2941 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
2942 }
2943 // Not using nativeApiLevelFromUser because the context here is not
2944 // necessarily a native context.
2945 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09002946 if err != nil {
2947 return err
2948 }
Dan Albertc8060532020-07-22 22:32:17 -07002949
2950 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09002951 return fmt.Errorf("newer SDK(%v)", ver)
2952 }
2953 return nil
2954}
2955
Colin Cross2ba19d92015-05-07 15:44:20 -07002956//
Colin Crosscfad1192015-11-02 16:43:11 -08002957// Defaults
2958//
Colin Crossca860ac2016-01-04 14:34:37 -08002959type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07002960 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07002961 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09002962 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08002963}
2964
Patrice Arrudac249c712019-03-19 17:00:29 -07002965// cc_defaults provides a set of properties that can be inherited by other cc
2966// modules. A module can use the properties from a cc_defaults using
2967// `defaults: ["<:default_module_name>"]`. Properties of both modules are
2968// merged (when possible) by prepending the default module's values to the
2969// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07002970func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07002971 return DefaultsFactory()
2972}
2973
Colin Cross36242852017-06-23 15:06:31 -07002974func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08002975 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08002976
Colin Cross36242852017-06-23 15:06:31 -07002977 module.AddProperties(props...)
2978 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08002979 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002980 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08002981 &BaseCompilerProperties{},
2982 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01002983 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07002984 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07002985 &StaticProperties{},
2986 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07002987 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08002988 &BinaryLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07002989 &TestProperties{},
2990 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07002991 &BenchmarkProperties{},
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -07002992 &FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08002993 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08002994 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07002995 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07002996 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07002997 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08002998 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08002999 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003000 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003001 &LTOProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003002 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003003 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003004 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3005 &RustBindgenClangProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003006 )
Colin Crosscfad1192015-11-02 16:43:11 -08003007
Jooyung Hancc372c52019-09-25 15:18:44 +09003008 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003009
3010 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003011}
3012
Jiyong Park6a43f042017-10-12 23:05:00 +09003013func squashVendorSrcs(m *Module) {
3014 if lib, ok := m.compiler.(*libraryDecorator); ok {
3015 lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
3016 lib.baseCompiler.Properties.Target.Vendor.Srcs...)
3017
3018 lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
3019 lib.baseCompiler.Properties.Target.Vendor.Exclude_srcs...)
Jooyung Hanac07f882020-07-05 03:54:35 +09003020
3021 lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
3022 lib.baseCompiler.Properties.Target.Vendor.Exclude_generated_sources...)
Jiyong Park6a43f042017-10-12 23:05:00 +09003023 }
3024}
3025
Jiyong Parkf9332f12018-02-01 00:54:12 +09003026func squashRecoverySrcs(m *Module) {
3027 if lib, ok := m.compiler.(*libraryDecorator); ok {
3028 lib.baseCompiler.Properties.Srcs = append(lib.baseCompiler.Properties.Srcs,
3029 lib.baseCompiler.Properties.Target.Recovery.Srcs...)
3030
3031 lib.baseCompiler.Properties.Exclude_srcs = append(lib.baseCompiler.Properties.Exclude_srcs,
3032 lib.baseCompiler.Properties.Target.Recovery.Exclude_srcs...)
Jooyung Hanac07f882020-07-05 03:54:35 +09003033
3034 lib.baseCompiler.Properties.Exclude_generated_sources = append(lib.baseCompiler.Properties.Exclude_generated_sources,
3035 lib.baseCompiler.Properties.Target.Recovery.Exclude_generated_sources...)
Jiyong Parkf9332f12018-02-01 00:54:12 +09003036 }
3037}
3038
Jiyong Park2286afd2020-06-16 21:58:53 +09003039func (c *Module) IsSdkVariant() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07003040 return c.Properties.IsSdkVariant || c.AlwaysSdk()
Jiyong Park2286afd2020-06-16 21:58:53 +09003041}
3042
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003043func kytheExtractAllFactory() android.Singleton {
3044 return &kytheExtractAllSingleton{}
3045}
3046
3047type kytheExtractAllSingleton struct {
3048}
3049
3050func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3051 var xrefTargets android.Paths
3052 ctx.VisitAllModules(func(module android.Module) {
3053 if ccModule, ok := module.(xref); ok {
3054 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3055 }
3056 })
3057 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3058 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003059 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003060 }
3061}
3062
Colin Cross06a931b2015-10-28 17:23:31 -07003063var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003064var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003065var BoolPtr = proptools.BoolPtr
3066var String = proptools.String
3067var StringPtr = proptools.StringPtr