blob: 7aefdc18fd228257ef5b11525a7baa56639f6d6c [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()
Jose Galmes6f843bc2020-12-11 13:36:29 -080055 ctx.BottomUp("recovery_snapshot", RecoverySnapshotMutator).Parallel()
56 ctx.BottomUp("recovery_snapshot_source", RecoverySnapshotSourceMutator).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070057 })
Colin Cross16b23492016-01-06 14:41:07 -080058
Paul Duffin036e7002019-12-19 19:16:28 +000059 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Ivan Lozano3968d8f2020-12-14 11:27:52 -050060 ctx.TopDown("asan_deps", sanitizerDepsMutator(Asan))
61 ctx.BottomUp("asan", sanitizerMutator(Asan)).Parallel()
Colin Cross16b23492016-01-06 14:41:07 -080062
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -070063 ctx.TopDown("hwasan_deps", sanitizerDepsMutator(hwasan))
64 ctx.BottomUp("hwasan", sanitizerMutator(hwasan)).Parallel()
65
Ivan Lozano3968d8f2020-12-14 11:27:52 -050066 ctx.TopDown("fuzzer_deps", sanitizerDepsMutator(Fuzzer))
67 ctx.BottomUp("fuzzer", sanitizerMutator(Fuzzer)).Parallel()
Mitch Phillipsbfeade62019-05-01 14:42:05 -070068
Jiyong Park1d1119f2019-07-29 21:27:18 +090069 // cfi mutator shouldn't run before sanitizers that return true for
70 // incompatibleWithCfi()
Vishwath Mohanb743e9c2017-11-01 09:20:21 +000071 ctx.TopDown("cfi_deps", sanitizerDepsMutator(cfi))
72 ctx.BottomUp("cfi", sanitizerMutator(cfi)).Parallel()
73
Peter Collingbourne8c7e6e22018-11-19 16:03:58 -080074 ctx.TopDown("scs_deps", sanitizerDepsMutator(scs))
75 ctx.BottomUp("scs", sanitizerMutator(scs)).Parallel()
76
Colin Cross1e676be2016-10-12 14:38:15 -070077 ctx.TopDown("tsan_deps", sanitizerDepsMutator(tsan))
78 ctx.BottomUp("tsan", sanitizerMutator(tsan)).Parallel()
Dan Willemsen581341d2017-02-09 16:16:31 -080079
Colin Cross0b908332019-06-19 23:00:20 -070080 ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel()
Jiyong Park379de2f2018-12-19 02:47:14 +090081 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
Ivan Lozano30c5db22018-02-21 15:49:20 -080082
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -080083 ctx.BottomUp("coverage", coverageMutator).Parallel()
Stephen Craneba090d12017-05-09 15:44:35 -070084
85 ctx.TopDown("lto_deps", ltoDepsMutator)
86 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090087
Jooyung Han479ca172020-10-19 18:51:07 +090088 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090089 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070090 })
Colin Crossb98c8b02016-07-29 13:44:28 -070091
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080092 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
93 // sabi mutator needs to be run after apex mutator finishes.
94 ctx.TopDown("sabi_deps", sabiDepsMutator)
95 })
96
Colin Cross57898582020-10-29 18:25:19 -070097 ctx.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070098}
99
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500100// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
101// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
102// edges to these modules.
103// This object is constructed in DepsMutator, by calling to various module delegates to set
104// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
105// dependencies.
106// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
107// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800108type Deps struct {
109 SharedLibs, LateSharedLibs []string
110 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800111 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800112 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700113
Chris Parsons79d66a52020-06-05 17:26:16 -0400114 // Used for data dependencies adjacent to tests
115 DataLibs []string
116
Yo Chiang219968c2020-09-22 18:45:04 +0800117 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
118 SystemSharedLibs []string
119
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500120 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800121 StaticUnwinderIfLegacy bool
122
Colin Cross5950f382016-12-13 12:50:57 -0800123 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700124
Colin Cross81413472016-04-11 14:37:39 -0700125 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700126
Dan Willemsenb40aab62016-04-20 14:21:14 -0700127 GeneratedSources []string
128 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900129 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700130
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700131 ReexportGeneratedHeaders []string
132
Colin Cross97ba0732015-03-23 17:50:24 -0700133 CrtBegin, CrtEnd string
Dan Willemsena0790e32018-10-12 00:24:23 -0700134
135 // Used for host bionic
136 LinkerFlagsFile string
137 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900138
139 // List of libs that need to be excluded for APEX variant
140 ExcludeLibsForApex []string
Colin Crossc472d572015-03-17 15:06:21 -0700141}
142
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500143// PathDeps is a struct containing file paths to dependencies of a module.
144// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
145// It's used to construct flags for various build statements (such as for compiling and linking).
146// It is then passed to module decorator functions responsible for registering build statements
147// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800148type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700149 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900150 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700151 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900152 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700153 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700154 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700155
Colin Cross0de8a1e2020-09-18 14:15:30 -0700156 // Transitive static library dependencies of static libraries for use in ordering.
157 TranstiveStaticLibrariesForOrdering *android.DepSet
158
Colin Cross26c34ed2016-09-30 17:10:16 -0700159 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100160 Objs Objects
161 // Paths to .o files in dependencies that provide them. Note that these lists
162 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800163 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700164 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700165
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100166 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
167 // the libs from all whole_static_lib dependencies.
168 WholeStaticLibsFromPrebuilts android.Paths
169
Colin Cross26c34ed2016-09-30 17:10:16 -0700170 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700171 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900172 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700173
Inseob Kimd110f872019-12-06 13:15:38 +0900174 Flags []string
175 IncludeDirs android.Paths
176 SystemIncludeDirs android.Paths
177 ReexportedDirs android.Paths
178 ReexportedSystemDirs android.Paths
179 ReexportedFlags []string
180 ReexportedGeneratedHeaders android.Paths
181 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700182
Colin Cross26c34ed2016-09-30 17:10:16 -0700183 // Paths to crt*.o files
Colin Cross635c3b02016-05-18 15:37:25 -0700184 CrtBegin, CrtEnd android.OptionalPath
Dan Willemsena0790e32018-10-12 00:24:23 -0700185
186 // Path to the file container flags to use with the linker
187 LinkerFlagsFile android.OptionalPath
188
189 // Path to the dynamic linker binary
190 DynamicLinker android.OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700191}
192
Colin Cross4af21ed2019-11-04 09:37:55 -0800193// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
194// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
195// command line so they can be overridden by the local module flags).
196type LocalOrGlobalFlags struct {
197 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700198 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800199 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700200 CFlags []string // Flags that apply to C and C++ source files
201 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
202 ConlyFlags []string // Flags that apply to C source files
203 CppFlags []string // Flags that apply to C++ source files
204 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700205 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800206}
207
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500208// Flags contains various types of command line flags (and settings) for use in building build
209// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800210type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500211 // Local flags (which individual modules are responsible for). These may override global flags.
212 Local LocalOrGlobalFlags
213 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800214 Global LocalOrGlobalFlags
215
216 aidlFlags []string // Flags that apply to aidl source files
217 rsFlags []string // Flags that apply to renderscript source files
218 libFlags []string // Flags to add libraries early to the link order
219 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
220 TidyFlags []string // Flags that apply to clang-tidy
221 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700222
Colin Crossc3199482017-03-30 15:03:04 -0700223 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800224 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700225 SystemIncludeFlags []string
226
Oliver Nguyen04526782020-04-21 12:40:27 -0700227 Toolchain config.Toolchain
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500228 Tidy bool // True if clang-tidy is enabled.
229 GcovCoverage bool // True if coverage files should be generated.
230 SAbiDump bool // True if header abi dumps should be generated.
Oliver Nguyen04526782020-04-21 12:40:27 -0700231 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800232
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500233 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800234 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500235 // The target-device system path to the dynamic linker.
236 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800237
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700238 CFlagsDeps android.Paths // Files depended on by compiler flags
239 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800240
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500241 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700242 AssemblerWithCpp bool
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500243 // True if static libraries should be grouped (using `-Wl,--start-group` and `-Wl,--end-group`).
244 GroupStaticLibs bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800245
Colin Cross19878da2019-03-28 14:45:07 -0700246 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700247 protoC bool // Whether to use C instead of C++
248 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700249
250 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200251 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700252}
253
Colin Crossca860ac2016-01-04 14:34:37 -0800254// Properties used to compile all C or C++ modules
255type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700256 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800257 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700258
Colin Crossc511bc52020-04-07 16:50:32 +0000259 // Minimum sdk version supported when compiling against the ndk. Setting this property causes
260 // two variants to be built, one for the platform and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800261 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700262
Jooyung Han379660c2020-04-21 15:24:00 +0900263 // Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX).
264 Min_sdk_version *string
265
Colin Crossc511bc52020-04-07 16:50:32 +0000266 // If true, always create an sdk variant and don't create a platform variant.
267 Sdk_variant_only *bool
268
Jiyong Parkde866cb2018-12-07 23:08:36 +0900269 AndroidMkSharedLibs []string `blueprint:"mutated"`
270 AndroidMkStaticLibs []string `blueprint:"mutated"`
271 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
272 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700273 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900274 HideFromMake bool `blueprint:"mutated"`
275 PreventInstall bool `blueprint:"mutated"`
276 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700277
Yo Chiang219968c2020-09-22 18:45:04 +0800278 // Set by DepsMutator.
279 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
280
Justin Yun5f7f7e82019-11-18 19:52:14 +0900281 ImageVariationPrefix string `blueprint:"mutated"`
282 VndkVersion string `blueprint:"mutated"`
283 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800284
285 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
286 // file
287 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900288
Yifan Hong39143a92020-10-26 12:43:12 -0700289 // Make this module available when building for ramdisk.
290 // On device without a dedicated recovery partition, the module is only
291 // available after switching root into
292 // /first_stage_ramdisk. To expose the module before switching root, install
293 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800294 Ramdisk_available *bool
295
Yifan Hong39143a92020-10-26 12:43:12 -0700296 // Make this module available when building for vendor ramdisk.
297 // On device without a dedicated recovery partition, the module is only
298 // available after switching root into
299 // /first_stage_ramdisk. To expose the module before switching root, install
300 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700301 Vendor_ramdisk_available *bool
302
Jiyong Parkf9332f12018-02-01 00:54:12 +0900303 // Make this module available when building for recovery
304 Recovery_available *bool
305
Colin Crossae6c5202019-11-20 13:35:50 -0800306 // Set by imageMutator
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700307 CoreVariantNeeded bool `blueprint:"mutated"`
308 RamdiskVariantNeeded bool `blueprint:"mutated"`
309 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
310 RecoveryVariantNeeded bool `blueprint:"mutated"`
311 ExtraVariants []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900312
313 // Allows this module to use non-APEX version of libraries. Useful
314 // for building binaries that are started before APEXes are activated.
315 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900316
317 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
318 // see soong/cc/config/vndk.go
319 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900320
321 // Used by vendor snapshot to record dependencies from snapshot modules.
322 SnapshotSharedLibs []string `blueprint:"mutated"`
323 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000324
325 Installable *bool
Colin Crossc511bc52020-04-07 16:50:32 +0000326
327 // Set by factories of module types that can only be referenced from variants compiled against
328 // the SDK.
329 AlwaysSdk bool `blueprint:"mutated"`
330
331 // Variant is an SDK variant created by sdkMutator
332 IsSdkVariant bool `blueprint:"mutated"`
333 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
334 // variant to have a ".sdk" suffix.
335 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700336
337 // Normally Soong uses the directory structure to decide which modules
338 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800339 // different snapshots (vendor, recovery, etc.), but this property
340 // allows a partner to exclude a module normally thought of as a
341 // framework module from the vendor snapshot.
342 Exclude_from_vendor_snapshot *bool
343
344 // Normally Soong uses the directory structure to decide which modules
345 // should be included (framework) or excluded (non-framework) from the
346 // different snapshots (vendor, recovery, etc.), but this property
347 // allows a partner to exclude a module normally thought of as a
348 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800349 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900350
351 // List of APEXes that this module has private access to for testing purpose. The module
352 // can depend on libraries that are not exported by the APEXes and use private symbols
353 // from the exported libraries.
354 Test_for []string
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700355}
356
357type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900358 // whether this module should be allowed to be directly depended by other
359 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900360 // If set to true, two variants will be built separately, one like
361 // normal, and the other limited to the set of libraries and headers
362 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700363 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900364 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700365 // so it shouldn't have any unversioned runtime dependencies, or
366 // make assumptions about the system that may not be true in the
367 // future.
368 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900369 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900370 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900371 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900372 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900373 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700374 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
375 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900376
Justin Yun63e9ec72020-10-29 16:49:43 +0900377 // whether this module should be allowed to be directly depended by other
378 // modules with `product_specific: true` or `product_available: true`.
379 // If set to true, an additional product variant will be built separately
380 // that is limited to the set of libraries and headers that are exposed to
381 // /product modules.
382 //
383 // The product variant may be used with a different (newer) /system,
384 // so it shouldn't have any unversioned runtime dependencies, or
385 // make assumptions about the system that may not be true in the
386 // future.
387 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900388 // If set to false, this module becomes inaccessible from /product modules.
389 //
390 // Different from the 'vendor_available' property, the modules with
391 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
392 // library without 'product_available' may not be depended on by any other
393 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900394 //
395 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
396 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
397 Product_available *bool
398
Jiyong Park5fb8c102018-04-09 12:03:06 +0900399 // whether this module is capable of being loaded with other instance
400 // (possibly an older version) of the same module in the same process.
401 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
402 // can be double loaded in a vendor process if the library is also a
403 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
404 // explicitly marked as `double_loadable: true` by the owner, or the dependency
405 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
406 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800407
408 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
409 IsLLNDK bool `blueprint:"mutated"`
410
Colin Cross78212242021-01-06 14:51:30 -0800411 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
412 // set and the module is not listed in VndkMustUseVendorVariantList.
413 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
414
415 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
416 IsVNDKCore bool `blueprint:"mutated"`
417
418 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
419 IsVNDKSP bool `blueprint:"mutated"`
420
421 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
422 // module sets the llndk.private property.
423 IsVNDKPrivate bool `blueprint:"mutated"`
424
425 // IsVNDKProduct is set if a VNDK module sets the product_available property.
426 IsVNDKProduct bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800427}
428
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500429// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
430// to understanding details about the type of the current module.
431// For example, one might call these functions to determine whether the current module is a static
432// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800433type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800434 static() bool
435 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700436 testBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900437 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900438 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900439 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700440 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900441 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700442 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800443 sdkVersion() string
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700444 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700445 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800446 IsLlndk() bool
447 IsLlndkPublic() bool
448 isImplementationForLLNDKPublic() bool
449 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900450 isVndk() bool
451 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500452 IsVndkExt() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900453 inProduct() bool
454 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800455 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700456 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900457 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700458 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700459 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800460 getVndkExtendsModuleName() string
Yi Kong7e53c572018-02-14 18:16:12 +0800461 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800462 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800463 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800464 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700465 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700466 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900467 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800468 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700469 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700470 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800471 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800472 isCfiAssemblySupportEnabled() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800473}
474
475type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700476 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800477 ModuleContextIntf
478}
479
480type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700481 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800482 ModuleContextIntf
483}
484
Colin Cross37047f12016-12-13 17:06:13 -0800485type DepsContext interface {
486 android.BottomUpMutatorContext
487 ModuleContextIntf
488}
489
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500490// feature represents additional (optional) steps to building cc-related modules, such as invocation
491// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800492type feature interface {
493 begin(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800494 deps(ctx DepsContext, deps Deps) Deps
Colin Crossca860ac2016-01-04 14:34:37 -0800495 flags(ctx ModuleContext, flags Flags) Flags
496 props() []interface{}
497}
498
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500499// compiler is the interface for a compiler helper object. Different module decorators may implement
500// this helper differently. For example, compiling a `cc_library` may use a different build
501// statement than building a `toolchain_library`.
Colin Crossca860ac2016-01-04 14:34:37 -0800502type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700503 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800504 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800505 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700506 compilerProps() []interface{}
507
Colin Cross76fada02016-07-27 10:31:13 -0700508 appendCflags([]string)
509 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700510 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800511}
512
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500513// linker is the interface for a linker decorator object. Individual module types can provide
514// their own implementation for this decorator, and thus specify custom logic regarding build
515// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800516type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700517 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800518 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700519 linkerFlags(ctx ModuleContext, flags Flags) Flags
520 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800521 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700522
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700523 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700524 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900525 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700526
527 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900528 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000529
530 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000531 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
532}
533
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500534// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000535type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500536 sharedLibs []string
537 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
538 // libc, libm, etc.)
539 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800540}
541
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500542// installer is the interface for an installer helper object. This helper is responsible for
543// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800544type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700545 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700546 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000547 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800548 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700549 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700550 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900551 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100552 makeUninstallable(mod *Module)
Colin Crossca860ac2016-01-04 14:34:37 -0800553}
554
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800555type xref interface {
556 XrefCcFiles() android.Paths
557}
558
Colin Cross6e511a92020-07-27 21:26:48 -0700559type libraryDependencyKind int
560
561const (
562 headerLibraryDependency = iota
563 sharedLibraryDependency
564 staticLibraryDependency
565)
566
567func (k libraryDependencyKind) String() string {
568 switch k {
569 case headerLibraryDependency:
570 return "headerLibraryDependency"
571 case sharedLibraryDependency:
572 return "sharedLibraryDependency"
573 case staticLibraryDependency:
574 return "staticLibraryDependency"
575 default:
576 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
577 }
578}
579
580type libraryDependencyOrder int
581
582const (
583 earlyLibraryDependency = -1
584 normalLibraryDependency = 0
585 lateLibraryDependency = 1
586)
587
588func (o libraryDependencyOrder) String() string {
589 switch o {
590 case earlyLibraryDependency:
591 return "earlyLibraryDependency"
592 case normalLibraryDependency:
593 return "normalLibraryDependency"
594 case lateLibraryDependency:
595 return "lateLibraryDependency"
596 default:
597 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
598 }
599}
600
601// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
602// tags that have a set of predefined tag objects that are reused for each dependency, a
603// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
604// That means that comparing a libraryDependencyTag for equality will only be equal if all
605// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
606// then check individual metadata fields instead.
607type libraryDependencyTag struct {
608 blueprint.BaseDependencyTag
609
610 // These are exported so that fmt.Printf("%#v") can call their String methods.
611 Kind libraryDependencyKind
612 Order libraryDependencyOrder
613
614 wholeStatic bool
615
616 reexportFlags bool
617 explicitlyVersioned bool
618 dataLib bool
619 ndk bool
620
621 staticUnwinder bool
622
623 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900624
Cindy Zhou18417cb2020-12-10 07:12:38 -0800625 // Whether or not this dependency should skip the apex dependency check
626 skipApexAllowedDependenciesCheck bool
627
Jiyong Parke3867542020-12-03 17:28:25 +0900628 // Whether or not this dependency has to be followed for the apex variants
629 excludeInApex bool
Colin Cross6e511a92020-07-27 21:26:48 -0700630}
631
632// header returns true if the libraryDependencyTag is tagging a header lib dependency.
633func (d libraryDependencyTag) header() bool {
634 return d.Kind == headerLibraryDependency
635}
636
637// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
638func (d libraryDependencyTag) shared() bool {
639 return d.Kind == sharedLibraryDependency
640}
641
642// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
643func (d libraryDependencyTag) static() bool {
644 return d.Kind == staticLibraryDependency
645}
646
Colin Crosse9fe2942020-11-10 18:12:15 -0800647// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
648// binaries or other shared libraries are installed as dependencies.
649func (d libraryDependencyTag) InstallDepNeeded() bool {
650 return d.shared()
651}
652
653var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
654
655// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700656// libraryDependencyTag. Each tag object is created globally and reused for multiple
657// dependencies (although since the object contains no references, assigning a tag to a
658// variable and modifying it will not modify the original). Users can compare the tag
659// returned by ctx.OtherModuleDependencyTag against the global original
660type dependencyTag struct {
661 blueprint.BaseDependencyTag
662 name string
663}
664
Colin Crosse9fe2942020-11-10 18:12:15 -0800665// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
666// libraryDependencyTag, but where the dependency needs to be installed when the parent is
667// installed.
668type installDependencyTag struct {
669 blueprint.BaseDependencyTag
670 android.InstallAlwaysNeededDependencyTag
671 name string
672}
673
Colin Crossc99deeb2016-04-11 15:06:20 -0700674var (
Colin Cross6e511a92020-07-27 21:26:48 -0700675 genSourceDepTag = dependencyTag{name: "gen source"}
676 genHeaderDepTag = dependencyTag{name: "gen header"}
677 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
678 objDepTag = dependencyTag{name: "obj"}
679 linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900680 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700681 reuseObjTag = dependencyTag{name: "reuse objects"}
682 staticVariantTag = dependencyTag{name: "static variant"}
683 vndkExtDepTag = dependencyTag{name: "vndk extends"}
684 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800685 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700686 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700687 stubImplDepTag = dependencyTag{name: "stub_impl"}
Colin Cross127bb8b2020-12-16 16:46:01 -0800688 llndkStubDepTag = dependencyTag{name: "llndk stub"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700689)
690
Colin Cross56a83212020-09-15 18:30:11 -0700691type copyDirectlyInAnyApexDependencyTag dependencyTag
692
693func (copyDirectlyInAnyApexDependencyTag) CopyDirectlyInAnyApex() {}
694
695var _ android.CopyDirectlyInAnyApexTag = copyDirectlyInAnyApexDependencyTag{}
696
Roland Levillainf89cd092019-07-29 16:22:59 +0100697func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700698 ccLibDepTag, ok := depTag.(libraryDependencyTag)
699 return ok && ccLibDepTag.shared()
700}
701
702func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
703 ccLibDepTag, ok := depTag.(libraryDependencyTag)
704 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100705}
706
Zach Johnson3df4e632020-11-06 11:56:27 -0800707func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
708 ccLibDepTag, ok := depTag.(libraryDependencyTag)
709 return ok && ccLibDepTag.header()
710}
711
Roland Levillainf89cd092019-07-29 16:22:59 +0100712func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800713 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100714}
715
716func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700717 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100718 return ok && ccDepTag == testPerSrcDepTag
719}
720
Colin Crossca860ac2016-01-04 14:34:37 -0800721// Module contains the properties and members used by all C/C++ module types, and implements
722// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500723// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
724// interface.
725//
726// To define a C/C++ related module, construct a new Module object and point its delegates to
727// type-specific structs. These delegates will be invoked to register module-specific build
728// statements which may be unique to the module type. For example, module.compiler.compile() should
729// be defined so as to register build statements which are responsible for compiling the module.
730//
731// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
732// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
733// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
734// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800735type Module struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700736 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -0700737 android.DefaultableModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +0900738 android.ApexModuleBase
Jiyong Parkd1063c12019-07-17 20:08:41 +0900739 android.SdkBase
Colin Crossc472d572015-03-17 15:06:21 -0700740
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700741 Properties BaseProperties
742 VendorProperties VendorProperties
Colin Crossfa138792015-04-24 17:31:52 -0700743
Colin Crossca860ac2016-01-04 14:34:37 -0800744 // initialize before calling Init
Colin Cross635c3b02016-05-18 15:37:25 -0700745 hod android.HostOrDeviceSupported
746 multilib android.Multilib
Colin Crossc472d572015-03-17 15:06:21 -0700747
Paul Duffina0843f62019-12-13 19:50:38 +0000748 // Allowable SdkMemberTypes of this module type.
749 sdkMemberTypes []android.SdkMemberType
750
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500751 // decorator delegates, initialize before calling Init
752 // these may contain module-specific implementations, and effectively allow for custom
753 // type-specific logic. These members may reference different objects or the same object.
754 // Functions of these decorators will be invoked to initialize and register type-specific
755 // build statements.
Colin Crossb4ce0ec2016-09-13 13:41:39 -0700756 compiler compiler
757 linker linker
758 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500759
760 features []feature
761 stl *stl
762 sanitize *sanitize
763 coverage *coverage
764 sabi *sabi
765 vndkdep *vndkdep
766 lto *lto
767 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800768
Colin Cross31076b32020-10-23 17:22:06 -0700769 library libraryInterface
770
Colin Cross635c3b02016-05-18 15:37:25 -0700771 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800772
Colin Crossb98c8b02016-07-29 13:44:28 -0700773 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700774
775 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800776
777 // Flags used to compile this module
778 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700779
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800780 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700781 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900782
783 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800784 // Kythe (source file indexer) paths for this compilation module
785 kytheFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900786
787 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700788 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700789
790 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700791}
792
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500793func (c *Module) SetPreventInstall() {
794 c.Properties.PreventInstall = true
795}
796
797func (c *Module) SetHideFromMake() {
798 c.Properties.HideFromMake = true
799}
800
Ivan Lozano52767be2019-10-18 14:49:46 -0700801func (c *Module) Toc() android.OptionalPath {
802 if c.linker != nil {
803 if library, ok := c.linker.(libraryInterface); ok {
804 return library.toc()
805 }
806 }
807 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
808}
809
810func (c *Module) ApiLevel() string {
811 if c.linker != nil {
812 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700813 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700814 }
815 }
816 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
817}
818
819func (c *Module) Static() bool {
820 if c.linker != nil {
821 if library, ok := c.linker.(libraryInterface); ok {
822 return library.static()
823 }
824 }
825 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
826}
827
828func (c *Module) Shared() bool {
829 if c.linker != nil {
830 if library, ok := c.linker.(libraryInterface); ok {
831 return library.shared()
832 }
833 }
834 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
835}
836
837func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +0000838 if c.stl != nil {
839 return c.stl.Properties.SelectedStl
840 }
841 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -0700842}
843
844func (c *Module) ToolchainLibrary() bool {
845 if _, ok := c.linker.(*toolchainLibraryDecorator); ok {
846 return true
847 }
848 return false
849}
850
851func (c *Module) NdkPrebuiltStl() bool {
852 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
853 return true
854 }
855 return false
856}
857
858func (c *Module) StubDecorator() bool {
859 if _, ok := c.linker.(*stubDecorator); ok {
860 return true
861 }
862 return false
863}
864
865func (c *Module) SdkVersion() string {
866 return String(c.Properties.Sdk_version)
867}
868
Artur Satayev480e25b2020-04-27 18:53:18 +0100869func (c *Module) MinSdkVersion() string {
870 return String(c.Properties.Min_sdk_version)
871}
872
Dan Albert92fe7402020-07-15 13:33:30 -0700873func (c *Module) SplitPerApiLevel() bool {
Colin Cross1348ce32020-10-01 13:37:16 -0700874 if !c.canUseSdk() {
875 return false
876 }
Dan Albert92fe7402020-07-15 13:33:30 -0700877 if linker, ok := c.linker.(*objectLinker); ok {
878 return linker.isCrt()
879 }
880 return false
881}
882
Colin Crossc511bc52020-04-07 16:50:32 +0000883func (c *Module) AlwaysSdk() bool {
884 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
885}
886
Ivan Lozano183a3212019-10-18 14:18:45 -0700887func (c *Module) CcLibrary() bool {
888 if c.linker != nil {
889 if _, ok := c.linker.(*libraryDecorator); ok {
890 return true
891 }
Colin Crossd48fe732020-09-23 20:37:24 -0700892 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
893 return true
894 }
Ivan Lozano183a3212019-10-18 14:18:45 -0700895 }
896 return false
897}
898
899func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -0700900 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700901 return true
902 }
903 return false
904}
905
Ivan Lozano2b262972019-11-21 12:30:50 -0800906func (c *Module) NonCcVariants() bool {
907 return false
908}
909
Ivan Lozano183a3212019-10-18 14:18:45 -0700910func (c *Module) SetStatic() {
911 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700912 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700913 library.setStatic()
914 return
915 }
916 }
917 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
918}
919
920func (c *Module) SetShared() {
921 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700922 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700923 library.setShared()
924 return
925 }
926 }
927 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
928}
929
930func (c *Module) BuildStaticVariant() bool {
931 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700932 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700933 return library.buildStatic()
934 }
935 }
936 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
937}
938
939func (c *Module) BuildSharedVariant() bool {
940 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700941 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700942 return library.buildShared()
943 }
944 }
945 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
946}
947
948func (c *Module) Module() android.Module {
949 return c
950}
951
Jiyong Parkc20eee32018-09-05 22:36:17 +0900952func (c *Module) OutputFile() android.OptionalPath {
953 return c.outputFile
954}
955
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400956func (c *Module) CoverageFiles() android.Paths {
957 if c.linker != nil {
958 if library, ok := c.linker.(libraryInterface); ok {
959 return library.objs().coverageFiles
960 }
961 }
962 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
963}
964
Ivan Lozano183a3212019-10-18 14:18:45 -0700965var _ LinkableInterface = (*Module)(nil)
966
Jiyong Park719b4462019-01-13 00:39:51 +0900967func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900968 if c.linker != nil {
969 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +0900970 }
971 return nil
972}
973
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900974func (c *Module) CoverageOutputFile() android.OptionalPath {
975 if c.linker != nil {
976 return c.linker.coverageOutputFilePath()
977 }
978 return android.OptionalPath{}
979}
980
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900981func (c *Module) RelativeInstallPath() string {
982 if c.installer != nil {
983 return c.installer.relativeInstallPath()
984 }
985 return ""
986}
987
Jooyung Han344d5432019-08-23 11:17:39 +0900988func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900989 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +0900990}
991
Colin Cross36242852017-06-23 15:06:31 -0700992func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -0700993 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -0800994 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -0700995 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800996 }
997 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -0700998 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800999 }
1000 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001001 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001002 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001003 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001004 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001005 }
Colin Cross16b23492016-01-06 14:41:07 -08001006 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001007 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001008 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001009 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001010 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001011 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001012 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001013 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001014 }
Justin Yun8effde42017-06-23 19:24:43 +09001015 if c.vndkdep != nil {
1016 c.AddProperties(c.vndkdep.props()...)
1017 }
Stephen Craneba090d12017-05-09 15:44:35 -07001018 if c.lto != nil {
1019 c.AddProperties(c.lto.props()...)
1020 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001021 if c.pgo != nil {
1022 c.AddProperties(c.pgo.props()...)
1023 }
Colin Crossca860ac2016-01-04 14:34:37 -08001024 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001025 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001026 }
Colin Crossc472d572015-03-17 15:06:21 -07001027
Jiyong Park1613e552020-09-14 19:43:17 +09001028 c.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, os android.OsType) bool {
Elliott Hughes79ae3412020-04-17 15:49:49 -07001029 // Windows builds always prefer 32-bit
Jiyong Park1613e552020-09-14 19:43:17 +09001030 return os == android.Windows
Colin Crossa9d8bee2018-10-02 13:59:46 -07001031 })
Colin Cross36242852017-06-23 15:06:31 -07001032 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001033 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +09001034 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001035 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001036
Colin Cross36242852017-06-23 15:06:31 -07001037 return c
Colin Crossc472d572015-03-17 15:06:21 -07001038}
1039
Colin Crossb916a382016-07-29 17:28:03 -07001040// Returns true for dependency roots (binaries)
1041// TODO(ccross): also handle dlopenable libraries
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001042func (c *Module) IsDependencyRoot() bool {
Colin Crossb916a382016-07-29 17:28:03 -07001043 if root, ok := c.linker.(interface {
1044 isDependencyRoot() bool
1045 }); ok {
1046 return root.isDependencyRoot()
1047 }
1048 return false
1049}
1050
Justin Yun5f7f7e82019-11-18 19:52:14 +09001051// Returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64.
1052// "product" and "vendor" variant modules return true for this function.
1053// When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true",
1054// "soc_specific: true" and more vendor installed modules are included here.
Justin Yun63e9ec72020-10-29 16:49:43 +09001055// When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "product_available: true" or
Justin Yun5f7f7e82019-11-18 19:52:14 +09001056// "product_specific: true" modules are included here.
Ivan Lozano52767be2019-10-18 14:49:46 -07001057func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001058 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001059}
1060
Colin Crossc511bc52020-04-07 16:50:32 +00001061func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001062 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1063 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001064}
1065
1066func (c *Module) UseSdk() bool {
1067 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001068 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001069 }
1070 return false
1071}
1072
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001073func (c *Module) isCoverageVariant() bool {
1074 return c.coverage.Properties.IsCoverageVariant
1075}
1076
Colin Cross95f1ca02020-10-29 20:47:22 -07001077func (c *Module) IsNdk(config android.Config) bool {
1078 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001079}
1080
Colin Cross127bb8b2020-12-16 16:46:01 -08001081// isLLndk returns true for both LLNDK (public) and LLNDK-private libs.
1082func (c *Module) IsLlndk() bool {
1083 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001084}
1085
Colin Cross127bb8b2020-12-16 16:46:01 -08001086// IsLlndkPublic returns true only for LLNDK (public) libs.
1087func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001088 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001089}
1090
Colin Cross127bb8b2020-12-16 16:46:01 -08001091// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1092// and does not set llndk.vendor_available: false.
1093func (c *Module) isImplementationForLLNDKPublic() bool {
1094 library, _ := c.library.(*libraryDecorator)
1095 return library != nil && library.hasLLNDKStubs() &&
Justin Yunc0d8c492021-01-07 17:45:31 +09001096 (!Bool(library.Properties.Llndk.Private) ||
Colin Cross127bb8b2020-12-16 16:46:01 -08001097 // TODO(b/170784825): until the LLNDK properties are moved into the cc_library,
1098 // the non-Vendor variants of the cc_library don't know if the corresponding
Justin Yunc0d8c492021-01-07 17:45:31 +09001099 // llndk_library set private: true. Since libft2 is the only private LLNDK
1100 // library, hardcode it during the transition.
Colin Cross127bb8b2020-12-16 16:46:01 -08001101 c.BaseModuleName() != "libft2")
1102}
1103
Justin Yunfd9e8042020-12-23 18:23:14 +09001104// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001105func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001106 // Check if VNDK-core-private or VNDK-SP-private
1107 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001108 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001109 }
1110
1111 // Check if LLNDK-private
1112 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001113 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001114 }
1115
1116 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001117}
1118
Ivan Lozano52767be2019-10-18 14:49:46 -07001119func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001120 if vndkdep := c.vndkdep; vndkdep != nil {
1121 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001122 }
1123 return false
1124}
1125
Yi Kong7e53c572018-02-14 18:16:12 +08001126func (c *Module) isPgoCompile() bool {
1127 if pgo := c.pgo; pgo != nil {
1128 return pgo.Properties.PgoCompile
1129 }
1130 return false
1131}
1132
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001133func (c *Module) isNDKStubLibrary() bool {
1134 if _, ok := c.compiler.(*stubDecorator); ok {
1135 return true
1136 }
1137 return false
1138}
1139
Logan Chienf3511742017-10-31 18:04:35 +08001140func (c *Module) isVndkSp() bool {
1141 if vndkdep := c.vndkdep; vndkdep != nil {
1142 return vndkdep.isVndkSp()
1143 }
1144 return false
1145}
1146
Ivan Lozanof9e21722020-12-02 09:00:51 -05001147func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001148 if vndkdep := c.vndkdep; vndkdep != nil {
1149 return vndkdep.isVndkExt()
1150 }
1151 return false
1152}
1153
Ivan Lozano52767be2019-10-18 14:49:46 -07001154func (c *Module) MustUseVendorVariant() bool {
Jooyung Han097087b2019-10-22 19:32:18 +09001155 return c.isVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001156}
1157
Logan Chienf3511742017-10-31 18:04:35 +08001158func (c *Module) getVndkExtendsModuleName() string {
1159 if vndkdep := c.vndkdep; vndkdep != nil {
1160 return vndkdep.getVndkExtendsModuleName()
1161 }
1162 return ""
1163}
1164
Jiyong Park25fc6a92018-11-18 18:02:45 +09001165func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001166 if lib := c.library; lib != nil {
1167 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001168 }
1169 return false
1170}
1171
1172func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001173 if lib := c.library; lib != nil {
1174 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001175 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001176 return false
1177}
1178
Colin Cross0477b422020-10-13 18:43:54 -07001179// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1180// the implementation. If it is an implementation library it returns its own name.
1181func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1182 name := ctx.OtherModuleName(c)
1183 if versioned, ok := c.linker.(versionedInterface); ok {
1184 name = versioned.implementationModuleName(name)
1185 }
1186 return name
1187}
1188
Martin Stjernholm2856c662020-12-02 15:03:42 +00001189// Similar to ImplementationModuleName, but uses the Make variant of the module
1190// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1191// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1192// under the premise that the prebuilt module overrides its source counterpart
1193// if it is exposed to Make).
1194func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1195 name := c.BaseModuleName()
1196 if versioned, ok := c.linker.(versionedInterface); ok {
1197 name = versioned.implementationModuleName(name)
1198 }
1199 return name
1200}
1201
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001202func (c *Module) bootstrap() bool {
1203 return Bool(c.Properties.Bootstrap)
1204}
1205
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001206func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001207 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1208 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1209 return false
1210 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001211 return c.linker != nil && c.linker.nativeCoverage()
1212}
1213
Inseob Kim8471cda2019-11-15 09:59:12 +09001214func (c *Module) isSnapshotPrebuilt() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09001215 if p, ok := c.linker.(interface{ isSnapshotPrebuilt() bool }); ok {
1216 return p.isSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001217 }
1218 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001219}
1220
Bill Peckham945441c2020-08-31 16:07:58 -07001221func (c *Module) ExcludeFromVendorSnapshot() bool {
1222 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1223}
1224
Jose Galmesf7294582020-11-13 12:07:36 -08001225func (c *Module) ExcludeFromRecoverySnapshot() bool {
1226 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1227}
1228
Jiyong Parkf1194352019-02-25 11:05:47 +09001229func isBionic(name string) bool {
1230 switch name {
Kiyoung Kim4098c7e2020-11-30 14:42:14 +09001231 case "libc", "libm", "libdl", "libdl_android", "linker", "linkerconfig":
Jiyong Parkf1194352019-02-25 11:05:47 +09001232 return true
1233 }
1234 return false
1235}
1236
Martin Stjernholm279de572019-09-10 23:18:20 +01001237func InstallToBootstrap(name string, config android.Config) bool {
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001238 if name == "libclang_rt.hwasan-aarch64-android" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001239 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001240 }
1241 return isBionic(name)
1242}
1243
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001244func (c *Module) XrefCcFiles() android.Paths {
1245 return c.kytheFiles
1246}
1247
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001248func (c *Module) isCfiAssemblySupportEnabled() bool {
1249 return c.sanitize != nil &&
1250 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1251}
1252
Colin Crossca860ac2016-01-04 14:34:37 -08001253type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001254 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001255 moduleContextImpl
1256}
1257
Colin Cross37047f12016-12-13 17:06:13 -08001258type depsContext struct {
1259 android.BottomUpMutatorContext
1260 moduleContextImpl
1261}
1262
Colin Crossca860ac2016-01-04 14:34:37 -08001263type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001264 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001265 moduleContextImpl
1266}
1267
1268type moduleContextImpl struct {
1269 mod *Module
1270 ctx BaseModuleContext
1271}
1272
Colin Crossb98c8b02016-07-29 13:44:28 -07001273func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001274 return ctx.mod.toolchain(ctx.ctx)
1275}
1276
1277func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001278 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001279}
1280
1281func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001282 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001283}
1284
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001285func (ctx *moduleContextImpl) testBinary() bool {
1286 return ctx.mod.testBinary()
1287}
1288
Jiyong Park1d1119f2019-07-29 21:27:18 +09001289func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001290 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001291}
1292
Inseob Kim7f283f42020-06-01 21:53:49 +09001293func (ctx *moduleContextImpl) binary() bool {
1294 return ctx.mod.binary()
1295}
1296
Inseob Kim1042d292020-06-01 23:23:05 +09001297func (ctx *moduleContextImpl) object() bool {
1298 return ctx.mod.object()
1299}
1300
Jooyung Hanccce2f22020-03-07 03:45:53 +09001301func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001302 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001303}
1304
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001305func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001306 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001307}
1308
1309func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001310 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001311 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001312 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001313 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001314 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001315 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001316 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001317 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001318 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001319 }
1320 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001321}
1322
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001323func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001324 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001325}
Justin Yun8effde42017-06-23 19:24:43 +09001326
Colin Cross95f1ca02020-10-29 20:47:22 -07001327func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1328 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001329}
1330
Colin Cross127bb8b2020-12-16 16:46:01 -08001331func (ctx *moduleContextImpl) IsLlndk() bool {
1332 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001333}
1334
Colin Cross127bb8b2020-12-16 16:46:01 -08001335func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1336 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001337}
1338
Colin Cross127bb8b2020-12-16 16:46:01 -08001339func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1340 return ctx.mod.isImplementationForLLNDKPublic()
1341}
1342
1343func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1344 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001345}
1346
Logan Chienf3511742017-10-31 18:04:35 +08001347func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001348 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001349}
1350
Yi Kong7e53c572018-02-14 18:16:12 +08001351func (ctx *moduleContextImpl) isPgoCompile() bool {
1352 return ctx.mod.isPgoCompile()
1353}
1354
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001355func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1356 return ctx.mod.isNDKStubLibrary()
1357}
1358
Justin Yun8effde42017-06-23 19:24:43 +09001359func (ctx *moduleContextImpl) isVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001360 return ctx.mod.isVndkSp()
1361}
1362
Ivan Lozanof9e21722020-12-02 09:00:51 -05001363func (ctx *moduleContextImpl) IsVndkExt() bool {
1364 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001365}
1366
Vic Yangefd249e2018-11-12 20:19:56 -08001367func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001368 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001369}
1370
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001371func (ctx *moduleContextImpl) selectedStl() string {
1372 if stl := ctx.mod.stl; stl != nil {
1373 return stl.Properties.SelectedStl
1374 }
1375 return ""
1376}
1377
Ivan Lozanobd721262018-11-27 14:33:03 -08001378func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1379 return ctx.mod.linker.useClangLld(actx)
1380}
1381
Colin Crossce75d2c2016-10-06 16:12:58 -07001382func (ctx *moduleContextImpl) baseModuleName() string {
1383 return ctx.mod.ModuleBase.BaseModuleName()
1384}
1385
Logan Chienf3511742017-10-31 18:04:35 +08001386func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1387 return ctx.mod.getVndkExtendsModuleName()
1388}
1389
Logan Chiene274fc92019-12-03 11:18:32 -08001390func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001391 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001392}
1393
Colin Crosse07f2312020-08-13 11:24:56 -07001394func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001395 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001396}
1397
Dan Albertc8060532020-07-22 22:32:17 -07001398func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001399 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001400}
1401
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001402func (ctx *moduleContextImpl) bootstrap() bool {
1403 return ctx.mod.bootstrap()
1404}
1405
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001406func (ctx *moduleContextImpl) nativeCoverage() bool {
1407 return ctx.mod.nativeCoverage()
1408}
1409
Colin Cross56a83212020-09-15 18:30:11 -07001410func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1411 return ctx.mod.DirectlyInAnyApex()
1412}
1413
Colin Cross95b07f22020-12-16 11:06:50 -08001414func (ctx *moduleContextImpl) isPreventInstall() bool {
1415 return ctx.mod.Properties.PreventInstall
1416}
1417
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001418func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1419 return ctx.mod.isCfiAssemblySupportEnabled()
1420}
1421
Colin Cross635c3b02016-05-18 15:37:25 -07001422func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001423 return &Module{
1424 hod: hod,
1425 multilib: multilib,
1426 }
1427}
1428
Colin Cross635c3b02016-05-18 15:37:25 -07001429func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001430 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001431 module.features = []feature{
1432 &tidyFeature{},
1433 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001434 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001435 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001436 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001437 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001438 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001439 module.lto = &lto{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001440 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001441 return module
1442}
1443
Colin Crossce75d2c2016-10-06 16:12:58 -07001444func (c *Module) Prebuilt() *android.Prebuilt {
1445 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1446 return p.prebuilt()
1447 }
1448 return nil
1449}
1450
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001451func (c *Module) IsPrebuilt() bool {
1452 return c.Prebuilt() != nil
1453}
1454
Colin Crossce75d2c2016-10-06 16:12:58 -07001455func (c *Module) Name() string {
1456 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001457 if p, ok := c.linker.(interface {
1458 Name(string) string
1459 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001460 name = p.Name(name)
1461 }
1462 return name
1463}
1464
Alex Light3d673592019-01-18 14:37:31 -08001465func (c *Module) Symlinks() []string {
1466 if p, ok := c.installer.(interface {
1467 symlinkList() []string
1468 }); ok {
1469 return p.symlinkList()
1470 }
1471 return nil
1472}
1473
Roland Levillainf89cd092019-07-29 16:22:59 +01001474func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1475 test, ok := c.linker.(testPerSrc)
1476 return ok && test.isAllTestsVariation()
1477}
1478
Chris Parsons216e10a2020-07-09 17:12:52 -04001479func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001480 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001481 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001482 }); ok {
1483 return p.dataPaths()
1484 }
1485 return nil
1486}
1487
Justin Yun5f7f7e82019-11-18 19:52:14 +09001488func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
1489 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1490 // "current", it will append the VNDK version to the name suffix.
1491 var vndkVersion string
1492 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001493 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001494 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
1495 nameSuffix = productSuffix
1496 } else {
1497 vndkVersion = ctx.DeviceConfig().VndkVersion()
1498 nameSuffix = vendorSuffix
1499 }
1500 if vndkVersion == "current" {
1501 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1502 }
Colin Cross127bb8b2020-12-16 16:46:01 -08001503 if c.Properties.VndkVersion != vndkVersion && c.Properties.VndkVersion != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001504 // add version suffix only if the module is using different vndk version than the
1505 // version in product or vendor partition.
1506 nameSuffix += "." + c.Properties.VndkVersion
1507 }
1508 return nameSuffix
1509}
1510
Colin Cross635c3b02016-05-18 15:37:25 -07001511func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Roland Levillainf2fad972019-06-28 15:41:19 +01001512 // Handle the case of a test module split by `test_per_src` mutator.
Roland Levillainf89cd092019-07-29 16:22:59 +01001513 //
1514 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1515 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1516 // module and return early, as this module does not produce an output file per se.
1517 if c.IsTestPerSrcAllTestsVariation() {
1518 c.outputFile = android.OptionalPath{}
1519 return
Roland Levillainf2fad972019-06-28 15:41:19 +01001520 }
1521
Colin Cross56a83212020-09-15 18:30:11 -07001522 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1523 if !apexInfo.IsForPlatform() {
1524 c.hideApexVariantFromMake = true
1525 }
1526
Ivan Lozanof9e21722020-12-02 09:00:51 -05001527 c.makeLinkType = GetMakeLinkType(actx, c)
Inseob Kim9516ee92019-05-09 10:56:13 +09001528
Inseob Kim64c43952019-08-26 16:52:35 +09001529 c.Properties.SubName = ""
1530
1531 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1532 c.Properties.SubName += nativeBridgeSuffix
1533 }
1534
Colin Cross127bb8b2020-12-16 16:46:01 -08001535 llndk := c.IsLlndk()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001536 _, llndkHeader := c.linker.(*llndkHeadersDecorator)
Justin Yun63e9ec72020-10-29 16:49:43 +09001537 if llndk || llndkHeader || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001538 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1539 // added for product variant only when we have vendor and product variants with core
1540 // variant. The suffix is not added for vendor-only or product-only module.
1541 c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
1542 } else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
Inseob Kim64c43952019-08-26 16:52:35 +09001543 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1544 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
1545 c.Properties.SubName += vendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001546 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
1547 c.Properties.SubName += ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001548 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
1549 c.Properties.SubName += vendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001550 } else if c.InRecovery() && !c.OnlyInRecovery() {
Inseob Kim64c43952019-08-26 16:52:35 +09001551 c.Properties.SubName += recoverySuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001552 } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
Colin Crossc511bc52020-04-07 16:50:32 +00001553 c.Properties.SubName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001554 if c.SplitPerApiLevel() {
1555 c.Properties.SubName += "." + c.SdkVersion()
1556 }
Inseob Kim64c43952019-08-26 16:52:35 +09001557 }
1558
Colin Crossca860ac2016-01-04 14:34:37 -08001559 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001560 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001561 moduleContextImpl: moduleContextImpl{
1562 mod: c,
1563 },
1564 }
1565 ctx.ctx = ctx
1566
Colin Crossf18e1102017-11-16 14:33:08 -08001567 deps := c.depsToPaths(ctx)
1568 if ctx.Failed() {
1569 return
1570 }
1571
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001572 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1573 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1574 }
1575
Colin Crossca860ac2016-01-04 14:34:37 -08001576 flags := Flags{
1577 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001578 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001579 }
Colin Crossca860ac2016-01-04 14:34:37 -08001580 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001581 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001582 }
1583 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001584 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001585 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001586 if c.stl != nil {
1587 flags = c.stl.flags(ctx, flags)
1588 }
Colin Cross16b23492016-01-06 14:41:07 -08001589 if c.sanitize != nil {
1590 flags = c.sanitize.flags(ctx, flags)
1591 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001592 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001593 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001594 }
Stephen Craneba090d12017-05-09 15:44:35 -07001595 if c.lto != nil {
1596 flags = c.lto.flags(ctx, flags)
1597 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001598 if c.pgo != nil {
1599 flags = c.pgo.flags(ctx, flags)
1600 }
Colin Crossca860ac2016-01-04 14:34:37 -08001601 for _, feature := range c.features {
1602 flags = feature.flags(ctx, flags)
1603 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001604 if ctx.Failed() {
1605 return
1606 }
1607
Colin Cross4af21ed2019-11-04 09:37:55 -08001608 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1609 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1610 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001611
Colin Cross4af21ed2019-11-04 09:37:55 -08001612 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001613
1614 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001615 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001616 }
1617 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001618 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001619 }
1620
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001621 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001622 // We need access to all the flags seen by a source file.
1623 if c.sabi != nil {
1624 flags = c.sabi.flags(ctx, flags)
1625 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001626
Colin Cross4af21ed2019-11-04 09:37:55 -08001627 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001628
Colin Crossca860ac2016-01-04 14:34:37 -08001629 // Optimization to reduce size of build.ninja
1630 // Replace the long list of flags for each file with a module-local variable
Colin Cross4af21ed2019-11-04 09:37:55 -08001631 ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
1632 ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
1633 ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
1634 flags.Local.CFlags = []string{"$cflags"}
1635 flags.Local.CppFlags = []string{"$cppflags"}
1636 flags.Local.AsFlags = []string{"$asflags"}
Colin Crossca860ac2016-01-04 14:34:37 -08001637
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001638 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001639 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001640 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001641 if ctx.Failed() {
1642 return
1643 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001644 c.kytheFiles = objs.kytheFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001645 }
1646
Colin Crossca860ac2016-01-04 14:34:37 -08001647 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001648 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001649 if ctx.Failed() {
1650 return
1651 }
Colin Cross635c3b02016-05-18 15:37:25 -07001652 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001653
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09001654 // If a lib is directly included in any of the APEXes or is not available to the
1655 // platform (which is often the case when the stub is provided as a prebuilt),
1656 // unhide the stubs variant having the latest version gets visible to make. In
1657 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
1658 // force anything in the make world to link against the stubs library. (unless it
1659 // is explicitly referenced via .bootstrap suffix or the module is marked with
1660 // 'bootstrap: true').
1661 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Ivan Lozano52767be2019-10-18 14:49:46 -07001662 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001663 c.IsStubs() && !c.InVendorRamdisk() {
Jiyong Parkb0788572018-12-20 22:10:17 +09001664 c.Properties.HideFromMake = false // unhide
1665 // Note: this is still non-installable
1666 }
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001667
Jose Galmes6f843bc2020-12-11 13:36:29 -08001668 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
1669 // RECOVERY_SNAPSHOT_VERSION is current.
1670 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Inseob Kimde5744a2020-12-02 13:14:28 +09001671 if shouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001672 i.collectHeadersForSnapshot(ctx)
1673 }
1674 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001675 }
Colin Cross5049f022015-03-18 13:28:46 -07001676
Colin Crossa9c8c9f2020-12-16 10:20:23 -08001677 if !proptools.BoolDefault(c.Properties.Installable, true) {
1678 // If the module has been specifically configure to not be installed then
1679 // hide from make as otherwise it will break when running inside make
1680 // as the output path to install will not be specified. Not all uninstallable
1681 // modules can be hidden from make as some are needed for resolving make side
1682 // dependencies.
1683 c.HideFromMake()
1684 } else if !c.installable(apexInfo) {
1685 c.SkipInstall()
1686 }
1687
1688 // Still call c.installer.install though, the installs will be stored as PackageSpecs
1689 // to allow using the outputs in a genrule.
1690 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07001691 c.installer.install(ctx, c.outputFile.Path())
1692 if ctx.Failed() {
1693 return
Colin Crossca860ac2016-01-04 14:34:37 -08001694 }
Dan Albertc403f7c2015-03-18 14:01:18 -07001695 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001696}
1697
Colin Cross0ea8ba82019-06-06 14:33:29 -07001698func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001699 if c.cachedToolchain == nil {
Colin Crossb98c8b02016-07-29 13:44:28 -07001700 c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
Colin Cross3f40fa42015-01-30 17:27:36 -08001701 }
Colin Crossca860ac2016-01-04 14:34:37 -08001702 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08001703}
1704
Colin Crossca860ac2016-01-04 14:34:37 -08001705func (c *Module) begin(ctx BaseModuleContext) {
1706 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001707 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07001708 }
Colin Crossca860ac2016-01-04 14:34:37 -08001709 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001710 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001711 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001712 if c.stl != nil {
1713 c.stl.begin(ctx)
1714 }
Colin Cross16b23492016-01-06 14:41:07 -08001715 if c.sanitize != nil {
1716 c.sanitize.begin(ctx)
1717 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001718 if c.coverage != nil {
1719 c.coverage.begin(ctx)
1720 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001721 if c.sabi != nil {
1722 c.sabi.begin(ctx)
1723 }
Justin Yun8effde42017-06-23 19:24:43 +09001724 if c.vndkdep != nil {
1725 c.vndkdep.begin(ctx)
1726 }
Stephen Craneba090d12017-05-09 15:44:35 -07001727 if c.lto != nil {
1728 c.lto.begin(ctx)
1729 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001730 if c.pgo != nil {
1731 c.pgo.begin(ctx)
1732 }
Colin Crossca860ac2016-01-04 14:34:37 -08001733 for _, feature := range c.features {
1734 feature.begin(ctx)
1735 }
Dan Albert92fe7402020-07-15 13:33:30 -07001736 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07001737 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001738 if err != nil {
1739 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07001740 c.Properties.Sdk_version = nil
1741 } else {
1742 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001743 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001744 }
Colin Crossca860ac2016-01-04 14:34:37 -08001745}
1746
Colin Cross37047f12016-12-13 17:06:13 -08001747func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07001748 deps := Deps{}
1749
1750 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001751 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001752 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001753 // Add the PGO dependency (the clang_rt.profile runtime library), which
1754 // sometimes depends on symbols from libgcc, before libgcc gets added
1755 // in linkerDeps().
Pirama Arumuga Nainar49b53d52017-10-04 16:47:29 -07001756 if c.pgo != nil {
1757 deps = c.pgo.deps(ctx, deps)
1758 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001759 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001760 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001761 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001762 if c.stl != nil {
1763 deps = c.stl.deps(ctx, deps)
1764 }
Colin Cross16b23492016-01-06 14:41:07 -08001765 if c.sanitize != nil {
1766 deps = c.sanitize.deps(ctx, deps)
1767 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001768 if c.coverage != nil {
1769 deps = c.coverage.deps(ctx, deps)
1770 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001771 if c.sabi != nil {
1772 deps = c.sabi.deps(ctx, deps)
1773 }
Justin Yun8effde42017-06-23 19:24:43 +09001774 if c.vndkdep != nil {
1775 deps = c.vndkdep.deps(ctx, deps)
1776 }
Stephen Craneba090d12017-05-09 15:44:35 -07001777 if c.lto != nil {
1778 deps = c.lto.deps(ctx, deps)
1779 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001780 for _, feature := range c.features {
1781 deps = feature.deps(ctx, deps)
1782 }
1783
Colin Crossb6715442017-10-24 11:13:31 -07001784 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1785 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1786 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
1787 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1788 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
1789 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08001790 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07001791
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001792 for _, lib := range deps.ReexportSharedLibHeaders {
1793 if !inList(lib, deps.SharedLibs) {
1794 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
1795 }
1796 }
1797
1798 for _, lib := range deps.ReexportStaticLibHeaders {
1799 if !inList(lib, deps.StaticLibs) {
1800 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib)
1801 }
1802 }
1803
Colin Cross5950f382016-12-13 12:50:57 -08001804 for _, lib := range deps.ReexportHeaderLibHeaders {
1805 if !inList(lib, deps.HeaderLibs) {
1806 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
1807 }
1808 }
1809
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001810 for _, gen := range deps.ReexportGeneratedHeaders {
1811 if !inList(gen, deps.GeneratedHeaders) {
1812 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
1813 }
1814 }
1815
Colin Crossc99deeb2016-04-11 15:06:20 -07001816 return deps
1817}
1818
Dan Albert7e9d2952016-08-04 13:02:36 -07001819func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08001820 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001821 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001822 moduleContextImpl: moduleContextImpl{
1823 mod: c,
1824 },
1825 }
1826 ctx.ctx = ctx
1827
Colin Crossca860ac2016-01-04 14:34:37 -08001828 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07001829}
1830
Jiyong Park7ed9de32018-10-15 22:25:07 +09001831// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09001832func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001833 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
1834 version := name[sharp+1:]
1835 libname := name[:sharp]
1836 return libname, version
1837 }
1838 return name, ""
1839}
1840
Dan Albert92fe7402020-07-15 13:33:30 -07001841func GetCrtVariations(ctx android.BottomUpMutatorContext,
1842 m LinkableInterface) []blueprint.Variation {
1843 if ctx.Os() != android.Android {
1844 return nil
1845 }
1846 if m.UseSdk() {
1847 return []blueprint.Variation{
1848 {Mutator: "sdk", Variation: "sdk"},
Colin Crossbbc941b2020-09-30 12:27:01 -07001849 {Mutator: "version", Variation: m.SdkVersion()},
Dan Albert92fe7402020-07-15 13:33:30 -07001850 }
1851 }
1852 return []blueprint.Variation{
1853 {Mutator: "sdk", Variation: ""},
1854 }
1855}
1856
Colin Crosse7257d22020-09-24 09:56:18 -07001857func (c *Module) addSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext,
1858 variations []blueprint.Variation, depTag libraryDependencyTag, name, version string, far bool) {
1859
1860 variations = append([]blueprint.Variation(nil), variations...)
1861
Colin Cross3146c5c2020-09-30 15:34:40 -07001862 if version != "" && CanBeOrLinkAgainstVersionVariants(c) {
Colin Crosse7257d22020-09-24 09:56:18 -07001863 // Version is explicitly specified. i.e. libFoo#30
1864 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
1865 depTag.explicitlyVersioned = true
1866 }
Colin Crosse7257d22020-09-24 09:56:18 -07001867
Colin Cross0de8a1e2020-09-18 14:15:30 -07001868 if far {
1869 ctx.AddFarVariationDependencies(variations, depTag, name)
1870 } else {
1871 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07001872 }
1873}
1874
Colin Cross1e676be2016-10-12 14:38:15 -07001875func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09001876 if !c.Enabled() {
1877 return
1878 }
1879
Colin Cross37047f12016-12-13 17:06:13 -08001880 ctx := &depsContext{
1881 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07001882 moduleContextImpl: moduleContextImpl{
1883 mod: c,
1884 },
1885 }
1886 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08001887
Colin Crossc99deeb2016-04-11 15:06:20 -07001888 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001889
Yo Chiang219968c2020-09-22 18:45:04 +08001890 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
1891
Dan Albert914449f2016-06-17 16:45:24 -07001892 variantNdkLibs := []string{}
1893 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07001894 if ctx.Os() == android.Android {
Inseob Kimeec88e12020-01-22 11:11:29 +09001895 // rewriteLibs takes a list of names of shared libraries and scans it for three types
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001896 // of names:
Dan Albert914449f2016-06-17 16:45:24 -07001897 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001898 // 1. Name of an NDK library that refers to a prebuilt module.
1899 // For each of these, it adds the name of the prebuilt module (which will be in
1900 // prebuilts/ndk) to the list of nonvariant libs.
1901 // 2. Name of an NDK library that refers to an ndk_library module.
1902 // For each of these, it adds the name of the ndk_library module to the list of
1903 // variant libs.
1904 // 3. Anything else (so anything that isn't an NDK library).
1905 // It adds these to the nonvariantLibs list.
Dan Albert914449f2016-06-17 16:45:24 -07001906 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001907 // The caller can then know to add the variantLibs dependencies differently from the
1908 // nonvariantLibs
Inseob Kim9516ee92019-05-09 10:56:13 +09001909
Inseob Kim9516ee92019-05-09 10:56:13 +09001910 vendorPublicLibraries := vendorPublicLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001911 vendorSnapshotSharedLibs := vendorSnapshotSharedLibs(actx.Config())
Jose Galmes6f843bc2020-12-11 13:36:29 -08001912 recoverySnapshotSharedLibs := recoverySnapshotSharedLibs(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001913
1914 rewriteVendorLibs := func(lib string) string {
Inseob Kimeec88e12020-01-22 11:11:29 +09001915 // only modules with BOARD_VNDK_VERSION uses snapshot.
1916 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1917 return lib
1918 }
1919
1920 if snapshot, ok := vendorSnapshotSharedLibs.get(lib, actx.Arch().ArchType); ok {
1921 return snapshot
1922 }
1923
1924 return lib
1925 }
1926
1927 rewriteLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001928 variantLibs = []string{}
1929 nonvariantLibs = []string{}
Dan Albert914449f2016-06-17 16:45:24 -07001930 for _, entry := range list {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001931 // strip #version suffix out
Jiyong Park73c54ee2019-10-22 20:31:18 +09001932 name, _ := StubsLibNameAndVersion(entry)
Jose Galmes6f843bc2020-12-11 13:36:29 -08001933 if c.InRecovery() {
1934 recoverySnapshotVersion :=
1935 actx.DeviceConfig().RecoverySnapshotVersion()
1936 if recoverySnapshotVersion == "current" ||
1937 recoverySnapshotVersion == "" {
1938 nonvariantLibs = append(nonvariantLibs, name)
1939 } else if snapshot, ok := recoverySnapshotSharedLibs.get(
1940 name, actx.Arch().ArchType); ok {
1941 nonvariantLibs = append(nonvariantLibs, snapshot)
1942 } else {
1943 nonvariantLibs = append(nonvariantLibs, name)
1944 }
1945 } else if ctx.useSdk() && inList(name, *getNDKKnownLibs(ctx.Config())) {
Dan Albertde5aade2020-06-30 12:32:51 -07001946 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Inseob Kimeec88e12020-01-22 11:11:29 +09001947 } else if ctx.useVndk() {
1948 nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
Inseob Kim9516ee92019-05-09 10:56:13 +09001949 } else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, *vendorPublicLibraries) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001950 vendorPublicLib := name + vendorPublicLibrarySuffix
Jiyong Park374510b2018-03-19 18:23:01 +09001951 if actx.OtherModuleExists(vendorPublicLib) {
1952 nonvariantLibs = append(nonvariantLibs, vendorPublicLib)
1953 } else {
1954 // This can happen if vendor_public_library module is defined in a
1955 // namespace that isn't visible to the current module. In that case,
1956 // link to the original library.
Jiyong Park7ed9de32018-10-15 22:25:07 +09001957 nonvariantLibs = append(nonvariantLibs, name)
Jiyong Park374510b2018-03-19 18:23:01 +09001958 }
Dan Albert914449f2016-06-17 16:45:24 -07001959 } else {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001960 // put name#version back
Dan Willemsen7cbf5f82017-03-28 00:08:30 -07001961 nonvariantLibs = append(nonvariantLibs, entry)
Dan Willemsen72d39932016-07-08 23:23:48 -07001962 }
1963 }
Dan Albert914449f2016-06-17 16:45:24 -07001964 return nonvariantLibs, variantLibs
Dan Willemsen72d39932016-07-08 23:23:48 -07001965 }
1966
Inseob Kimeec88e12020-01-22 11:11:29 +09001967 deps.SharedLibs, variantNdkLibs = rewriteLibs(deps.SharedLibs)
1968 deps.LateSharedLibs, variantLateNdkLibs = rewriteLibs(deps.LateSharedLibs)
1969 deps.ReexportSharedLibHeaders, _ = rewriteLibs(deps.ReexportSharedLibHeaders)
1970 if ctx.useVndk() {
1971 for idx, lib := range deps.RuntimeLibs {
1972 deps.RuntimeLibs[idx] = rewriteVendorLibs(lib)
1973 }
1974 }
Dan Willemsen72d39932016-07-08 23:23:48 -07001975 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001976
Inseob Kimeec88e12020-01-22 11:11:29 +09001977 rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string {
1978 // only modules with BOARD_VNDK_VERSION uses snapshot.
1979 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1980 return lib
1981 }
1982
1983 if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
1984 return snapshot
1985 }
1986
1987 return lib
1988 }
1989
Jose Galmes6f843bc2020-12-11 13:36:29 -08001990 snapshotHeaderLibs := vendorSnapshotHeaderLibs(actx.Config())
1991 snapshotStaticLibs := vendorSnapshotStaticLibs(actx.Config())
1992 snapshotObjects := vendorSnapshotObjects(actx.Config())
1993
1994 if c.InRecovery() {
1995 rewriteSnapshotLibs = func(lib string, snapshotMap *snapshotMap) string {
1996 recoverySnapshotVersion :=
1997 actx.DeviceConfig().RecoverySnapshotVersion()
1998 if recoverySnapshotVersion == "current" ||
1999 recoverySnapshotVersion == "" {
2000 return lib
2001 } else if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
2002 return snapshot
2003 }
2004
2005 return lib
2006 }
2007
2008 snapshotHeaderLibs = recoverySnapshotHeaderLibs(actx.Config())
2009 snapshotStaticLibs = recoverySnapshotStaticLibs(actx.Config())
2010 snapshotObjects = recoverySnapshotObjects(actx.Config())
2011 }
2012
Colin Cross32ec36c2016-12-15 07:39:51 -08002013 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002014 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002015 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002016 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002017 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002018
Jose Galmes6f843bc2020-12-11 13:36:29 -08002019 lib = rewriteSnapshotLibs(lib, snapshotHeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002020
Jiyong Park1ad8e162020-12-01 23:40:09 +09002021 if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002022 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002023 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002024 } else {
2025 actx.AddVariationDependencies(nil, depTag, lib)
2026 }
2027 }
2028
Inseob Kim07def122020-11-23 14:43:02 +09002029 // sysprop_library has to support both C++ and Java. So sysprop_library internally creates one
2030 // C++ implementation library and one Java implementation library. When a module links against
2031 // sysprop_library, the C++ implementation library has to be linked. syspropImplLibraries is a
2032 // map from sysprop_library to implementation library; it will be used in whole_static_libs,
2033 // static_libs, and shared_libs.
Inseob Kimc0907f12019-02-08 21:00:45 +09002034 syspropImplLibraries := syspropImplLibraries(actx.Config())
2035
Jiyong Park5d1598f2019-02-25 22:14:17 +09002036 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002037 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09002038 if impl, ok := syspropImplLibraries[lib]; ok {
2039 lib = impl
2040 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002041
Jose Galmes6f843bc2020-12-11 13:36:29 -08002042 lib = rewriteSnapshotLibs(lib, snapshotStaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002043
Jiyong Park5d1598f2019-02-25 22:14:17 +09002044 actx.AddVariationDependencies([]blueprint.Variation{
2045 {Mutator: "link", Variation: "static"},
2046 }, depTag, lib)
2047 }
2048
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002049 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002050 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002051 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002052 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002053 }
Jiyong Parke3867542020-12-03 17:28:25 +09002054 if inList(lib, deps.ExcludeLibsForApex) {
2055 depTag.excludeInApex = true
2056 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002057
2058 if impl, ok := syspropImplLibraries[lib]; ok {
2059 lib = impl
2060 }
2061
Jose Galmes6f843bc2020-12-11 13:36:29 -08002062 lib = rewriteSnapshotLibs(lib, snapshotStaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002063
Dan Willemsen59339a22018-07-22 21:18:45 -07002064 actx.AddVariationDependencies([]blueprint.Variation{
2065 {Mutator: "link", Variation: "static"},
2066 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002067 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002068
Jooyung Han75568392020-03-20 04:29:24 +09002069 // staticUnwinderDep is treated as staticDep for Q apexes
2070 // so that native libraries/binaries are linked with static unwinder
2071 // because Q libc doesn't have unwinder APIs
2072 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002073 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002074 actx.AddVariationDependencies([]blueprint.Variation{
2075 {Mutator: "link", Variation: "static"},
Jose Galmes6f843bc2020-12-11 13:36:29 -08002076 }, depTag, rewriteSnapshotLibs(staticUnwinder(actx), snapshotStaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002077 }
2078
Inseob Kimeec88e12020-01-22 11:11:29 +09002079 for _, lib := range deps.LateStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002080 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Inseob Kimeec88e12020-01-22 11:11:29 +09002081 actx.AddVariationDependencies([]blueprint.Variation{
2082 {Mutator: "link", Variation: "static"},
Jose Galmes6f843bc2020-12-11 13:36:29 -08002083 }, depTag, rewriteSnapshotLibs(lib, snapshotStaticLibs))
Inseob Kimeec88e12020-01-22 11:11:29 +09002084 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002085
Jiyong Park7ed9de32018-10-15 22:25:07 +09002086 // shared lib names without the #version suffix
2087 var sharedLibNames []string
2088
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002089 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002090 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002091 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002092 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002093 }
Jiyong Parke3867542020-12-03 17:28:25 +09002094 if inList(lib, deps.ExcludeLibsForApex) {
2095 depTag.excludeInApex = true
2096 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002097
2098 if impl, ok := syspropImplLibraries[lib]; ok {
2099 lib = impl
2100 }
2101
Jiyong Park73c54ee2019-10-22 20:31:18 +09002102 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002103 sharedLibNames = append(sharedLibNames, name)
2104
Colin Crosse7257d22020-09-24 09:56:18 -07002105 variations := []blueprint.Variation{
2106 {Mutator: "link", Variation: "shared"},
2107 }
2108 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002109 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002110
Jiyong Park7ed9de32018-10-15 22:25:07 +09002111 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002112 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002113 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2114 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2115 // linking against both the stubs lib and the non-stubs lib at the same time.
2116 continue
2117 }
Colin Cross6e511a92020-07-27 21:26:48 -07002118 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002119 variations := []blueprint.Variation{
2120 {Mutator: "link", Variation: "shared"},
2121 }
2122 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002123 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002124
Dan Willemsen59339a22018-07-22 21:18:45 -07002125 actx.AddVariationDependencies([]blueprint.Variation{
2126 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002127 }, dataLibDepTag, deps.DataLibs...)
2128
2129 actx.AddVariationDependencies([]blueprint.Variation{
2130 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002131 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002132
Colin Cross68861832016-07-08 10:41:41 -07002133 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002134
2135 for _, gen := range deps.GeneratedHeaders {
2136 depTag := genHeaderDepTag
2137 if inList(gen, deps.ReexportGeneratedHeaders) {
2138 depTag = genHeaderExportDepTag
2139 }
2140 actx.AddDependency(c, depTag, gen)
2141 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002142
Dan Albert92fe7402020-07-15 13:33:30 -07002143 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002144 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc99deeb2016-04-11 15:06:20 -07002145 if deps.CrtBegin != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002146 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Jose Galmes6f843bc2020-12-11 13:36:29 -08002147 rewriteSnapshotLibs(deps.CrtBegin, snapshotObjects))
Colin Crossca860ac2016-01-04 14:34:37 -08002148 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002149 if deps.CrtEnd != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002150 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Jose Galmes6f843bc2020-12-11 13:36:29 -08002151 rewriteSnapshotLibs(deps.CrtEnd, snapshotObjects))
Colin Cross21b9a242015-03-24 14:15:58 -07002152 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002153 if deps.LinkerFlagsFile != "" {
2154 actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
2155 }
2156 if deps.DynamicLinker != "" {
2157 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002158 }
Dan Albert914449f2016-06-17 16:45:24 -07002159
2160 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002161
2162 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002163 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002164 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002165 {Mutator: "link", Variation: "shared"},
2166 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002167
2168 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002169 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002170 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002171 {Mutator: "link", Variation: "shared"},
2172 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002173
2174 if vndkdep := c.vndkdep; vndkdep != nil {
2175 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002176 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002177 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002178 {Mutator: "link", Variation: "shared"},
2179 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002180 }
2181 }
Colin Cross6362e272015-10-29 15:25:03 -07002182}
Colin Cross21b9a242015-03-24 14:15:58 -07002183
Colin Crosse40b4ea2018-10-02 22:25:58 -07002184func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002185 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2186 c.beginMutator(ctx)
2187 }
2188}
2189
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002190// Whether a module can link to another module, taking into
2191// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002192func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002193 tag blueprint.DependencyTag) {
2194
2195 switch t := tag.(type) {
2196 case dependencyTag:
2197 if t != vndkExtDepTag {
2198 return
2199 }
2200 case libraryDependencyTag:
2201 default:
2202 return
2203 }
2204
Ivan Lozanof9e21722020-12-02 09:00:51 -05002205 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002206 // Host code is not restricted
2207 return
2208 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002209
2210 // VNDK is cc.Module supported only for now.
2211 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002212 // Though allowed dependency is limited by the image mutator,
2213 // each vendor and product module needs to check link-type
2214 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002215 if ccTo, ok := to.(*Module); ok {
2216 if ccFrom.vndkdep != nil {
2217 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2218 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05002219 } else if linkableMod, ok := to.(LinkableInterface); ok {
2220 // Static libraries from other languages can be linked
2221 if !linkableMod.Static() {
2222 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
2223 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002224 } else {
2225 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002226 }
2227 return
2228 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002229 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002230 // Platform code can link to anything
2231 return
2232 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002233 if from.InRamdisk() {
2234 // Ramdisk code is not NDK
2235 return
2236 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002237 if from.InVendorRamdisk() {
2238 // Vendor ramdisk code is not NDK
2239 return
2240 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002241 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002242 // Recovery code is not NDK
2243 return
2244 }
Colin Cross31076b32020-10-23 17:22:06 -07002245 if c, ok := to.(*Module); ok {
2246 if c.ToolchainLibrary() {
2247 // These are always allowed
2248 return
2249 }
2250 if c.NdkPrebuiltStl() {
2251 // These are allowed, but they don't set sdk_version
2252 return
2253 }
2254 if c.StubDecorator() {
2255 // These aren't real libraries, but are the stub shared libraries that are included in
2256 // the NDK.
2257 return
2258 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002259 }
Logan Chien834b9a62019-01-14 15:39:03 +08002260
Ivan Lozano52767be2019-10-18 14:49:46 -07002261 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002262 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2263 // to link to libc++ (non-NDK and without sdk_version).
2264 return
2265 }
2266
Ivan Lozano52767be2019-10-18 14:49:46 -07002267 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002268 // NDK code linking to platform code is never okay.
2269 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002270 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002271 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002272 }
2273
2274 // At this point we know we have two NDK libraries, but we need to
2275 // check that we're not linking against anything built against a higher
2276 // API level, as it is only valid to link against older or equivalent
2277 // APIs.
2278
Inseob Kim01a28722018-04-11 09:48:45 +09002279 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002280 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002281 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002282 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002283 // Current can't be linked against by anything else.
2284 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002285 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002286 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002287 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002288 if err != nil {
2289 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002290 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002291 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002292 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002293 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002294 if err != nil {
2295 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002296 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002297 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002298 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002299
Inseob Kim01a28722018-04-11 09:48:45 +09002300 if toApi > fromApi {
2301 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002302 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002303 }
2304 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002305 }
Dan Albert202fe492017-12-15 13:56:59 -08002306
2307 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002308 fromStl := from.SelectedStl()
2309 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002310 if fromStl == "" || toStl == "" {
2311 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002312 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002313 // We can be permissive with the system "STL" since it is only the C++
2314 // ABI layer, but in the future we should make sure that everyone is
2315 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002316 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002317 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002318 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2319 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002320 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002321}
2322
Jooyung Han479ca172020-10-19 18:51:07 +09002323func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2324 if c, ok := ctx.Module().(*Module); ok {
2325 ctx.VisitDirectDeps(func(dep android.Module) {
2326 depTag := ctx.OtherModuleDependencyTag(dep)
2327 ccDep, ok := dep.(LinkableInterface)
2328 if ok {
2329 checkLinkType(ctx, c, ccDep, depTag)
2330 }
2331 })
2332 }
2333}
2334
Jiyong Park5fb8c102018-04-09 12:03:06 +09002335// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002336// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2337// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002338// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002339func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2340 check := func(child, parent android.Module) bool {
2341 to, ok := child.(*Module)
2342 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002343 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002344 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002345
Jooyung Hana70f0672019-01-18 15:20:43 +09002346 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2347 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002348 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002349
Jiyong Park0474e1f2021-01-14 14:26:06 +09002350 // These dependencies are not excercised at runtime. Tracking these will give us
2351 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002352 depTag := ctx.OtherModuleDependencyTag(child)
2353 if IsHeaderDepTag(depTag) {
2354 return false
2355 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002356 if depTag == staticVariantTag {
2357 return false
2358 }
2359 if depTag == stubImplDepTag {
2360 return false
2361 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002362
Justin Yun63e9ec72020-10-29 16:49:43 +09002363 // Even if target lib has no vendor variant, keep checking dependency
2364 // graph in case it depends on vendor_available or product_available
2365 // but not double_loadable transtively.
2366 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002367 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002368 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002369
Jiyong Park0474e1f2021-01-14 14:26:06 +09002370 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2371 // one.
2372 if Bool(to.VendorProperties.Double_loadable) {
2373 return true
2374 }
2375
2376 if to.isVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002377 return false
2378 }
2379
Jooyung Hana70f0672019-01-18 15:20:43 +09002380 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2381 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002382 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002383 return false
2384 }
2385 if module, ok := ctx.Module().(*Module); ok {
2386 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002387 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002388 ctx.WalkDeps(check)
2389 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002390 }
2391 }
2392}
2393
Colin Cross0de8a1e2020-09-18 14:15:30 -07002394// Returns the highest version which is <= maxSdkVersion.
2395// For example, with maxSdkVersion is 10 and versionList is [9,11]
2396// it returns 9 as string. The list of stubs must be in order from
2397// oldest to newest.
Chris Parsons3c27ca32020-11-20 12:42:07 -05002398func (c *Module) chooseSdkVersion(ctx android.PathContext, stubsInfo []SharedStubLibrary,
2399 maxSdkVersion android.ApiLevel) (SharedStubLibrary, error) {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002400
2401 for i := range stubsInfo {
2402 stubInfo := stubsInfo[len(stubsInfo)-i-1]
2403 var ver android.ApiLevel
2404 if stubInfo.Version == "" {
2405 ver = android.FutureApiLevel
2406 } else {
2407 var err error
2408 ver, err = android.ApiLevelFromUser(ctx, stubInfo.Version)
2409 if err != nil {
Chris Parsons3c27ca32020-11-20 12:42:07 -05002410 return SharedStubLibrary{}, err
Colin Cross0de8a1e2020-09-18 14:15:30 -07002411 }
2412 }
2413 if ver.LessThanOrEqualTo(maxSdkVersion) {
2414 return stubInfo, nil
2415 }
2416 }
2417 var versionList []string
2418 for _, stubInfo := range stubsInfo {
2419 versionList = append(versionList, stubInfo.Version)
2420 }
Chris Parsons3c27ca32020-11-20 12:42:07 -05002421 return SharedStubLibrary{}, fmt.Errorf("not found a version(<=%s) in versionList: %v", maxSdkVersion.String(), versionList)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002422}
2423
Colin Crossc99deeb2016-04-11 15:06:20 -07002424// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002425func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002426 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002427
Colin Cross0de8a1e2020-09-18 14:15:30 -07002428 var directStaticDeps []StaticLibraryInfo
2429 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002430
Colin Cross0de8a1e2020-09-18 14:15:30 -07002431 reexportExporter := func(exporter FlagExporterInfo) {
2432 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2433 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2434 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2435 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2436 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002437 }
2438
Jooyung Hande34d232020-07-23 13:04:15 +09002439 // For the dependency from platform to apex, use the latest stubs
2440 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002441 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2442 if !apexInfo.IsForPlatform() {
2443 c.apexSdkVersion = apexInfo.MinSdkVersion(ctx)
Jooyung Hande34d232020-07-23 13:04:15 +09002444 }
2445
2446 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2447 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2448 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2449 // (b/144430859)
2450 c.apexSdkVersion = android.FutureApiLevel
2451 }
2452
Colin Crossd11fcda2017-10-23 17:59:01 -07002453 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002454 depName := ctx.OtherModuleName(dep)
2455 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002456
Ivan Lozano52767be2019-10-18 14:49:46 -07002457 ccDep, ok := dep.(LinkableInterface)
2458 if !ok {
2459
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002460 // handling for a few module types that aren't cc Module but that are also supported
2461 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002462 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002463 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002464 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2465 genRule.GeneratedSourceFiles()...)
2466 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002467 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002468 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002469 // Support exported headers from a generated_sources dependency
2470 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002471 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002472 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002473 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002474 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002475 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002476 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002477 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002478 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002479 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2480 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002481 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002482 // 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 +09002483 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002484
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002485 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002486 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002487 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002488 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002489 case linkerFlagsDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002490 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002491 files := genRule.GeneratedSourceFiles()
2492 if len(files) == 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002493 depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002494 } else if len(files) > 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002495 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 -07002496 }
2497 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002498 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002499 }
Colin Crossca860ac2016-01-04 14:34:37 -08002500 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002501 return
2502 }
2503
Colin Crossfe17f6f2019-03-28 19:30:56 -07002504 if depTag == android.ProtoPluginDepTag {
2505 return
2506 }
2507
Colin Crossd11fcda2017-10-23 17:59:01 -07002508 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002509 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2510 return
2511 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002512 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002513 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2514 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002515 return
2516 }
2517
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002518 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07002519 // Skip reused objects for stub libraries, they use their own stub object file instead.
2520 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
2521 // version mutator, so the stubs variant is created from the shared variant that
2522 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07002523 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07002524 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2525 objs := staticAnalogue.ReuseObjects
2526 depPaths.Objs = depPaths.Objs.Append(objs)
2527 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2528 reexportExporter(depExporterInfo)
2529 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002530 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002531 }
2532
Colin Cross6e511a92020-07-27 21:26:48 -07002533 linkFile := ccDep.OutputFile()
2534
2535 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2536 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002537 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002538 return
2539 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002540
Jiyong Parke3867542020-12-03 17:28:25 +09002541 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
2542 return
2543 }
2544
Colin Cross0de8a1e2020-09-18 14:15:30 -07002545 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002546
Colin Cross6e511a92020-07-27 21:26:48 -07002547 var ptr *android.Paths
2548 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002549
Colin Cross6e511a92020-07-27 21:26:48 -07002550 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002551
Colin Cross6e511a92020-07-27 21:26:48 -07002552 switch {
2553 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08002554 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
2555 if !ctx.Config().AllowMissingDependencies() {
2556 ctx.ModuleErrorf("module %q is not a header library", depName)
2557 } else {
2558 ctx.AddMissingDependencies([]string{depName})
2559 }
2560 return
2561 }
Colin Cross6e511a92020-07-27 21:26:48 -07002562 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002563 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2564 if !ctx.Config().AllowMissingDependencies() {
2565 ctx.ModuleErrorf("module %q is not a shared library", depName)
2566 } else {
2567 ctx.AddMissingDependencies([]string{depName})
2568 }
2569 return
2570 }
Jiyong Parke3867542020-12-03 17:28:25 +09002571
Colin Cross0de8a1e2020-09-18 14:15:30 -07002572 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
Chris Parsons3c27ca32020-11-20 12:42:07 -05002573 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002574
Chris Parsons3c27ca32020-11-20 12:42:07 -05002575 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002576 useStubs := false
Colin Cross31076b32020-10-23 17:22:06 -07002577
2578 if lib := moduleLibraryInterface(dep); lib.buildStubs() && c.UseVndk() { // LLNDK
Colin Cross0de8a1e2020-09-18 14:15:30 -07002579 if !apexInfo.IsForPlatform() {
2580 // For platform libraries, use current version of LLNDK
2581 // If this is for use_vendor apex we will apply the same rules
2582 // of apex sdk enforcement below to choose right version.
2583 useStubs = true
2584 }
2585 } else if apexInfo.IsForPlatform() {
2586 // If not building for APEX, use stubs only when it is from
2587 // an APEX (and not from platform)
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002588 // However, for host, ramdisk, vendor_ramdisk, recovery or bootstrap modules,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002589 // always link to non-stub variant
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09002590 useStubs = dep.(android.ApexModule).NotInPlatform() && !c.bootstrap()
Colin Cross0de8a1e2020-09-18 14:15:30 -07002591 // Another exception: if this module is bundled with an APEX, then
2592 // it is linked with the non-stub variant of a module in the APEX
2593 // as if this is part of the APEX.
2594 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
2595 for _, apexContents := range testFor.ApexContents {
2596 if apexContents.DirectlyInApex(depName) {
2597 useStubs = false
2598 break
2599 }
2600 }
2601 } else {
2602 // If building for APEX, use stubs when the parent is in any APEX that
2603 // the child is not in.
2604 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
2605 }
2606
2607 // when to use (unspecified) stubs, check min_sdk_version and choose the right one
2608 if useStubs {
2609 sharedLibraryStubsInfo, err :=
Chris Parsons3c27ca32020-11-20 12:42:07 -05002610 c.chooseSdkVersion(ctx, sharedLibraryStubsInfo.SharedStubLibraries, c.apexSdkVersion)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002611 if err != nil {
2612 ctx.OtherModuleErrorf(dep, err.Error())
2613 return
2614 }
2615 sharedLibraryInfo = sharedLibraryStubsInfo.SharedLibraryInfo
2616 depExporterInfo = sharedLibraryStubsInfo.FlagExporterInfo
2617 }
2618 }
2619
Jiyong Park1ad8e162020-12-01 23:40:09 +09002620 // Stubs lib doesn't link to the shared lib dependencies. Don't set
2621 // linkFile, depFile, and ptr.
2622 if c.IsStubs() {
2623 break
2624 }
2625
Colin Cross0de8a1e2020-09-18 14:15:30 -07002626 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2627 depFile = sharedLibraryInfo.TableOfContents
2628
Colin Cross6e511a92020-07-27 21:26:48 -07002629 ptr = &depPaths.SharedLibs
2630 switch libDepTag.Order {
2631 case earlyLibraryDependency:
2632 ptr = &depPaths.EarlySharedLibs
2633 depPtr = &depPaths.EarlySharedLibsDeps
2634 case normalLibraryDependency:
2635 ptr = &depPaths.SharedLibs
2636 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002637 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002638 case lateLibraryDependency:
2639 ptr = &depPaths.LateSharedLibs
2640 depPtr = &depPaths.LateSharedLibsDeps
2641 default:
2642 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002643 }
Colin Cross6e511a92020-07-27 21:26:48 -07002644 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002645 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2646 if !ctx.Config().AllowMissingDependencies() {
2647 ctx.ModuleErrorf("module %q is not a static library", depName)
2648 } else {
2649 ctx.AddMissingDependencies([]string{depName})
2650 }
2651 return
2652 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002653
2654 // Stubs lib doesn't link to the static lib dependencies. Don't set
2655 // linkFile, depFile, and ptr.
2656 if c.IsStubs() {
2657 break
2658 }
2659
Colin Cross0de8a1e2020-09-18 14:15:30 -07002660 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2661 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002662 if libDepTag.wholeStatic {
2663 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002664 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2665 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002666 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002667 // This case normally catches prebuilt static
2668 // libraries, but it can also occur when
2669 // AllowMissingDependencies is on and the
2670 // dependencies has no sources of its own
2671 // but has a whole_static_libs dependency
2672 // on a missing library. We want to depend
2673 // on the .a file so that there is something
2674 // in the dependency tree that contains the
2675 // error rule for the missing transitive
2676 // dependency.
2677 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002678 }
Colin Cross6e511a92020-07-27 21:26:48 -07002679 } else {
2680 switch libDepTag.Order {
2681 case earlyLibraryDependency:
2682 panic(fmt.Errorf("early static libs not suppported"))
2683 case normalLibraryDependency:
2684 // static dependencies will be handled separately so they can be ordered
2685 // using transitive dependencies.
2686 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002687 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002688 case lateLibraryDependency:
2689 ptr = &depPaths.LateStaticLibs
2690 default:
2691 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002692 }
2693 }
2694 }
2695
Colin Cross6e511a92020-07-27 21:26:48 -07002696 if libDepTag.static() && !libDepTag.wholeStatic {
2697 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2698 ctx.ModuleErrorf("module %q not a static library", depName)
2699 return
2700 }
Logan Chien43d34c32017-12-20 01:17:32 +08002701
Colin Cross6e511a92020-07-27 21:26:48 -07002702 // When combining coverage files for shared libraries and executables, coverage files
2703 // in static libraries act as if they were whole static libraries. The same goes for
2704 // source based Abi dump files.
2705 if c, ok := ccDep.(*Module); ok {
2706 staticLib := c.linker.(libraryInterface)
2707 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2708 staticLib.objs().coverageFiles...)
2709 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2710 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002711 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002712 // Handle non-CC modules here
2713 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002714 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002715 }
2716 }
2717
Colin Cross6e511a92020-07-27 21:26:48 -07002718 if ptr != nil {
2719 if !linkFile.Valid() {
2720 if !ctx.Config().AllowMissingDependencies() {
2721 ctx.ModuleErrorf("module %q missing output file", depName)
2722 } else {
2723 ctx.AddMissingDependencies([]string{depName})
2724 }
2725 return
2726 }
2727 *ptr = append(*ptr, linkFile.Path())
2728 }
2729
2730 if depPtr != nil {
2731 dep := depFile
2732 if !dep.Valid() {
2733 dep = linkFile
2734 }
2735 *depPtr = append(*depPtr, dep.Path())
2736 }
2737
Colin Cross0de8a1e2020-09-18 14:15:30 -07002738 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2739 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2740 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2741 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2742
2743 if libDepTag.reexportFlags {
2744 reexportExporter(depExporterInfo)
2745 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2746 // Re-exported shared library headers must be included as well since they can help us with type information
2747 // about template instantiations (instantiated from their headers).
2748 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2749 // scripts.
2750 c.sabi.Properties.ReexportedIncludes = append(
2751 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2752 }
2753
Colin Cross6e511a92020-07-27 21:26:48 -07002754 makeLibName := c.makeLibName(ctx, ccDep, depName) + libDepTag.makeSuffix
2755 switch {
2756 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002757 c.Properties.AndroidMkHeaderLibs = append(
2758 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002759 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07002760 if lib := moduleLibraryInterface(dep); lib != nil {
2761 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002762 // Add the dependency to the APEX(es) providing the library so that
2763 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002764 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
2765 for _, an := range depApexInfo.InApexes {
Colin Cross6e511a92020-07-27 21:26:48 -07002766 c.Properties.ApexesProvidingSharedLibs = append(
2767 c.Properties.ApexesProvidingSharedLibs, an)
2768 }
2769 }
2770 }
2771
2772 // Note: the order of libs in this list is not important because
2773 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002774 c.Properties.AndroidMkSharedLibs = append(
2775 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002776 // Record baseLibName for snapshots.
2777 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, baseLibName(depName))
2778 case libDepTag.static():
2779 if libDepTag.wholeStatic {
2780 c.Properties.AndroidMkWholeStaticLibs = append(
2781 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2782 } else {
2783 c.Properties.AndroidMkStaticLibs = append(
2784 c.Properties.AndroidMkStaticLibs, makeLibName)
2785 }
2786 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002787 } else if !c.IsStubs() {
2788 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
2789
Colin Cross6e511a92020-07-27 21:26:48 -07002790 switch depTag {
2791 case runtimeDepTag:
2792 c.Properties.AndroidMkRuntimeLibs = append(
2793 c.Properties.AndroidMkRuntimeLibs, c.makeLibName(ctx, ccDep, depName)+libDepTag.makeSuffix)
2794 // Record baseLibName for snapshots.
2795 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, baseLibName(depName))
2796 case objDepTag:
2797 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2798 case CrtBeginDepTag:
2799 depPaths.CrtBegin = linkFile
2800 case CrtEndDepTag:
2801 depPaths.CrtEnd = linkFile
2802 case dynamicLinkerDepTag:
2803 depPaths.DynamicLinker = linkFile
2804 }
Jiyong Park27b188b2017-07-18 13:23:39 +09002805 }
Colin Crossca860ac2016-01-04 14:34:37 -08002806 })
2807
Jeff Gaston294356f2017-09-27 17:05:30 -07002808 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07002809 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
2810 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
2811 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07002812
Colin Crossdd84e052017-05-17 13:44:16 -07002813 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07002814 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09002815 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
2816 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09002817 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09002818 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
2819 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07002820 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09002821 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09002822 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002823
2824 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09002825 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002826 }
Colin Crossdd84e052017-05-17 13:44:16 -07002827
Colin Crossca860ac2016-01-04 14:34:37 -08002828 return depPaths
2829}
2830
Colin Cross0de8a1e2020-09-18 14:15:30 -07002831// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
2832// to match the topological order of the dependency tree, including any static analogues of
2833// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
2834// of the transitive dependencies.
2835func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
2836 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
2837 var staticPaths android.Paths
2838 for _, staticDep := range staticDeps {
2839 staticPaths = append(staticPaths, staticDep.StaticLibrary)
2840 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
2841 }
2842 for _, sharedDep := range sharedDeps {
2843 if sharedDep.StaticAnalogue != nil {
2844 transitiveStaticLibsBuilder.Transitive(sharedDep.StaticAnalogue.TransitiveStaticLibrariesForOrdering)
2845 }
2846 }
2847 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
2848
2849 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
2850
2851 // reorder the dependencies based on transitive dependencies
2852 staticPaths = android.FirstUniquePaths(staticPaths)
2853 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
2854
2855 if len(orderedStaticPaths) != len(staticPaths) {
2856 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
2857 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
2858 }
2859
2860 return orderedStaticPaths, transitiveStaticLibs
2861}
2862
Colin Cross6e511a92020-07-27 21:26:48 -07002863// baseLibName trims known prefixes and suffixes
2864func baseLibName(depName string) string {
2865 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
2866 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00002867 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07002868 return libName
2869}
2870
2871func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, depName string) string {
2872 vendorSuffixModules := vendorSuffixModules(ctx.Config())
Jose Galmes6f843bc2020-12-11 13:36:29 -08002873 recoverySuffixModules := recoverySuffixModules(ctx.Config())
Colin Cross6e511a92020-07-27 21:26:48 -07002874 vendorPublicLibraries := vendorPublicLibraries(ctx.Config())
2875
2876 libName := baseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08002877 ccDepModule, _ := ccDep.(*Module)
2878 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Colin Cross6e511a92020-07-27 21:26:48 -07002879 isVendorPublicLib := inList(libName, *vendorPublicLibraries)
2880 bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk
2881
2882 if c, ok := ccDep.(*Module); ok {
2883 // Use base module name for snapshots when exporting to Makefile.
2884 if c.isSnapshotPrebuilt() {
2885 baseName := c.BaseModuleName()
2886
2887 if c.IsVndk() {
2888 return baseName + ".vendor"
2889 }
2890
Ivan Lozano3968d8f2020-12-14 11:27:52 -05002891 if c.InVendor() && vendorSuffixModules[baseName] {
Colin Cross6e511a92020-07-27 21:26:48 -07002892 return baseName + ".vendor"
Jose Galmes6f843bc2020-12-11 13:36:29 -08002893 } else if c.InRecovery() && recoverySuffixModules[baseName] {
2894 return baseName + ".recovery"
Colin Cross6e511a92020-07-27 21:26:48 -07002895 } else {
2896 return baseName
2897 }
2898 }
2899 }
2900
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002901 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
2902 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07002903 // The vendor module is a no-vendor-variant VNDK library. Depend on the
2904 // core module instead.
2905 return libName
2906 } else if c.UseVndk() && bothVendorAndCoreVariantsExist {
2907 // The vendor module in Make will have been renamed to not conflict with the core
2908 // module, so update the dependency name here accordingly.
2909 return libName + c.getNameSuffixWithVndkVersion(ctx)
2910 } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
2911 return libName + vendorPublicLibrarySuffix
2912 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
2913 return libName + ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002914 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
2915 return libName + vendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07002916 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
2917 return libName + recoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05002918 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Colin Cross6e511a92020-07-27 21:26:48 -07002919 return libName + nativeBridgeSuffix
2920 } else {
2921 return libName
2922 }
2923}
2924
Colin Crossca860ac2016-01-04 14:34:37 -08002925func (c *Module) InstallInData() bool {
2926 if c.installer == nil {
2927 return false
2928 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002929 return c.installer.inData()
2930}
2931
2932func (c *Module) InstallInSanitizerDir() bool {
2933 if c.installer == nil {
2934 return false
2935 }
2936 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07002937 return true
2938 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002939 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08002940}
2941
Yifan Hong1b3348d2020-01-21 15:53:22 -08002942func (c *Module) InstallInRamdisk() bool {
2943 return c.InRamdisk()
2944}
2945
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002946func (c *Module) InstallInVendorRamdisk() bool {
2947 return c.InVendorRamdisk()
2948}
2949
Jiyong Parkf9332f12018-02-01 00:54:12 +09002950func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07002951 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002952}
2953
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002954func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002955 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002956 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002957 return
2958 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002959 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002960}
2961
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07002962func (c *Module) HostToolPath() android.OptionalPath {
2963 if c.installer == nil {
2964 return android.OptionalPath{}
2965 }
2966 return c.installer.hostToolPath()
2967}
2968
Nan Zhangd4e641b2017-07-12 12:55:28 -07002969func (c *Module) IntermPathForModuleOut() android.OptionalPath {
2970 return c.outputFile
2971}
2972
Colin Cross41955e82019-05-29 14:40:35 -07002973func (c *Module) OutputFiles(tag string) (android.Paths, error) {
2974 switch tag {
2975 case "":
2976 if c.outputFile.Valid() {
2977 return android.Paths{c.outputFile.Path()}, nil
2978 }
2979 return android.Paths{}, nil
2980 default:
2981 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002982 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002983}
2984
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00002985func (c *Module) static() bool {
2986 if static, ok := c.linker.(interface {
2987 static() bool
2988 }); ok {
2989 return static.static()
2990 }
2991 return false
2992}
2993
Jiyong Park379de2f2018-12-19 02:47:14 +09002994func (c *Module) staticBinary() bool {
2995 if static, ok := c.linker.(interface {
2996 staticBinary() bool
2997 }); ok {
2998 return static.staticBinary()
2999 }
3000 return false
3001}
3002
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003003func (c *Module) testBinary() bool {
3004 if test, ok := c.linker.(interface {
3005 testBinary() bool
3006 }); ok {
3007 return test.testBinary()
3008 }
3009 return false
3010}
3011
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003012// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3013func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003014 if h, ok := c.linker.(interface {
3015 header() bool
3016 }); ok {
3017 return h.header()
3018 }
3019 return false
3020}
3021
Inseob Kim7f283f42020-06-01 21:53:49 +09003022func (c *Module) binary() bool {
3023 if b, ok := c.linker.(interface {
3024 binary() bool
3025 }); ok {
3026 return b.binary()
3027 }
3028 return false
3029}
3030
Inseob Kim1042d292020-06-01 23:23:05 +09003031func (c *Module) object() bool {
3032 if o, ok := c.linker.(interface {
3033 object() bool
3034 }); ok {
3035 return o.object()
3036 }
3037 return false
3038}
3039
Ivan Lozanof9e21722020-12-02 09:00:51 -05003040func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003041 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003042 if c.IsLlndk() {
3043 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003044 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003045 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003046 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003047 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003048 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003049 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003050 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003051 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003052 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003053 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003054 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003055 return "native:product"
3056 }
Jooyung Han38002912019-05-16 04:01:54 +09003057 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003058 } else if c.InRamdisk() {
3059 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003060 } else if c.InVendorRamdisk() {
3061 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003062 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003063 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003064 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003065 return "native:ndk:none:none"
3066 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3067 //family, link := getNdkStlFamilyAndLinkType(c)
3068 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003069 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003070 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003071 } else {
3072 return "native:platform"
3073 }
3074}
3075
Jiyong Park9d452992018-10-03 00:38:19 +09003076// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003077// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003078func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003079 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003080 // Stub libs and prebuilt libs in a versioned SDK are not
3081 // installable to APEX even though they are shared libs.
Colin Cross31076b32020-10-23 17:22:06 -07003082 return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01003083 } else if _, ok := c.linker.(testPerSrc); ok {
3084 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003085 }
3086 return false
3087}
3088
Jiyong Parka90ca002019-10-07 15:47:24 +09003089func (c *Module) AvailableFor(what string) bool {
3090 if linker, ok := c.linker.(interface {
3091 availableFor(string) bool
3092 }); ok {
3093 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3094 } else {
3095 return c.ApexModuleBase.AvailableFor(what)
3096 }
3097}
3098
Jiyong Park62304bb2020-04-13 16:19:48 +09003099func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003100 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003101}
3102
Colin Crossaede88c2020-08-11 12:17:01 -07003103func (c *Module) UniqueApexVariations() bool {
3104 if u, ok := c.compiler.(interface {
3105 uniqueApexVariations() bool
3106 }); ok {
3107 return u.uniqueApexVariations()
3108 } else {
3109 return false
3110 }
3111}
3112
Paul Duffin0cb37b92020-03-04 14:52:46 +00003113// Return true if the module is ever installable.
3114func (c *Module) EverInstallable() bool {
3115 return c.installer != nil &&
3116 // Check to see whether the module is actually ever installable.
3117 c.installer.everInstallable()
3118}
3119
Colin Cross56a83212020-09-15 18:30:11 -07003120func (c *Module) installable(apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003121 ret := c.EverInstallable() &&
3122 // Check to see whether the module has been configured to not be installed.
3123 proptools.BoolDefault(c.Properties.Installable, true) &&
3124 !c.Properties.PreventInstall && c.outputFile.Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003125
3126 // The platform variant doesn't need further condition. Apex variants however might not
3127 // be installable because it will likely to be included in the APEX and won't appear
3128 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003129 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003130 return ret
3131 }
3132
3133 // Special case for modules that are configured to be installed to /data, which includes
3134 // test modules. For these modules, both APEX and non-APEX variants are considered as
3135 // installable. This is because even the APEX variants won't be included in the APEX, but
3136 // will anyway be installed to /data/*.
3137 // See b/146995717
3138 if c.InstallInData() {
3139 return ret
3140 }
3141
3142 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003143}
3144
Logan Chien41eabe62019-04-10 13:33:58 +08003145func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3146 if c.linker != nil {
3147 if library, ok := c.linker.(*libraryDecorator); ok {
3148 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3149 }
3150 }
3151}
3152
Jiyong Park45bf82e2020-12-15 22:29:02 +09003153var _ android.ApexModule = (*Module)(nil)
3154
3155// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003156func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003157 depTag := ctx.OtherModuleDependencyTag(dep)
3158 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3159
3160 if cc, ok := dep.(*Module); ok {
3161 if cc.HasStubsVariants() {
3162 if isLibDepTag && libDepTag.shared() {
3163 // dynamic dep to a stubs lib crosses APEX boundary
3164 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003165 }
Colin Cross6e511a92020-07-27 21:26:48 -07003166 if IsRuntimeDepTag(depTag) {
3167 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003168 return false
3169 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003170 }
Colin Crossaac32222020-07-29 12:51:56 -07003171 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003172 // shared_lib dependency from a static lib is considered as crossing
3173 // the APEX boundary because the dependency doesn't actually is
3174 // linked; the dependency is used only during the compilation phase.
3175 return false
3176 }
Jiyong Parke3867542020-12-03 17:28:25 +09003177
3178 if isLibDepTag && libDepTag.excludeInApex {
3179 return false
3180 }
Colin Cross6e511a92020-07-27 21:26:48 -07003181 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003182 if depTag == stubImplDepTag || depTag == llndkStubDepTag {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003183 // We don't track beyond LLNDK or from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003184 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003185 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003186 if depTag == staticVariantTag {
3187 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3188 // actually mean that the static lib (and its dependencies) are copied into the
3189 // APEX.
3190 return false
3191 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003192 return true
3193}
3194
Jiyong Park45bf82e2020-12-15 22:29:02 +09003195// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003196func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3197 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003198 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3199 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3200 return nil
3201 }
3202 // b/154569636: set min_sdk_version correctly for toolchain_libraries
3203 if c.ToolchainLibrary() {
3204 return nil
3205 }
3206 // We don't check for prebuilt modules
3207 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3208 return nil
3209 }
3210 minSdkVersion := c.MinSdkVersion()
3211 if minSdkVersion == "apex_inherit" {
3212 return nil
3213 }
3214 if minSdkVersion == "" {
3215 // JNI libs within APK-in-APEX fall into here
3216 // Those are okay to set sdk_version instead
3217 // We don't have to check if this is a SDK variant because
3218 // non-SDK variant resets sdk_version, which works too.
3219 minSdkVersion = c.SdkVersion()
3220 }
Dan Albertc8060532020-07-22 22:32:17 -07003221 if minSdkVersion == "" {
3222 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3223 }
3224 // Not using nativeApiLevelFromUser because the context here is not
3225 // necessarily a native context.
3226 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003227 if err != nil {
3228 return err
3229 }
Dan Albertc8060532020-07-22 22:32:17 -07003230
3231 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003232 return fmt.Errorf("newer SDK(%v)", ver)
3233 }
3234 return nil
3235}
3236
Colin Cross2ba19d92015-05-07 15:44:20 -07003237//
Colin Crosscfad1192015-11-02 16:43:11 -08003238// Defaults
3239//
Colin Crossca860ac2016-01-04 14:34:37 -08003240type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07003241 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07003242 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09003243 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08003244}
3245
Patrice Arrudac249c712019-03-19 17:00:29 -07003246// cc_defaults provides a set of properties that can be inherited by other cc
3247// modules. A module can use the properties from a cc_defaults using
3248// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3249// merged (when possible) by prepending the default module's values to the
3250// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003251func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003252 return DefaultsFactory()
3253}
3254
Colin Cross36242852017-06-23 15:06:31 -07003255func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003256 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003257
Colin Cross36242852017-06-23 15:06:31 -07003258 module.AddProperties(props...)
3259 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003260 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003261 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003262 &BaseCompilerProperties{},
3263 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003264 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003265 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003266 &StaticProperties{},
3267 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003268 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003269 &BinaryLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003270 &TestProperties{},
3271 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003272 &BenchmarkProperties{},
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -07003273 &FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003274 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003275 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003276 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003277 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003278 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003279 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003280 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003281 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003282 &LTOProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003283 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003284 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003285 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3286 &RustBindgenClangProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003287 )
Colin Crosscfad1192015-11-02 16:43:11 -08003288
Jooyung Hancc372c52019-09-25 15:18:44 +09003289 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003290
3291 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003292}
3293
Jiyong Park2286afd2020-06-16 21:58:53 +09003294func (c *Module) IsSdkVariant() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07003295 return c.Properties.IsSdkVariant || c.AlwaysSdk()
Jiyong Park2286afd2020-06-16 21:58:53 +09003296}
3297
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003298func kytheExtractAllFactory() android.Singleton {
3299 return &kytheExtractAllSingleton{}
3300}
3301
3302type kytheExtractAllSingleton struct {
3303}
3304
3305func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3306 var xrefTargets android.Paths
3307 ctx.VisitAllModules(func(module android.Module) {
3308 if ccModule, ok := module.(xref); ok {
3309 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3310 }
3311 })
3312 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3313 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003314 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003315 }
3316}
3317
Colin Cross06a931b2015-10-28 17:23:31 -07003318var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003319var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003320var BoolPtr = proptools.BoolPtr
3321var String = proptools.String
3322var StringPtr = proptools.StringPtr