blob: ca2bd4fd48300c59ac8c7121c4d97ebd824dbff6 [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
411 // IsLLNDKPrivate is set to true for the vendor variant of a cc_library module that has LLNDK
Justin Yunc0d8c492021-01-07 17:45:31 +0900412 // stubs and also sets llndk.private: true.
Colin Cross127bb8b2020-12-16 16:46:01 -0800413 IsLLNDKPrivate bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800414}
415
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500416// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
417// to understanding details about the type of the current module.
418// For example, one might call these functions to determine whether the current module is a static
419// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800420type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800421 static() bool
422 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700423 testBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900424 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900425 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900426 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700427 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900428 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700429 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800430 sdkVersion() string
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700431 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700432 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800433 IsLlndk() bool
434 IsLlndkPublic() bool
435 isImplementationForLLNDKPublic() bool
436 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900437 isVndk() bool
438 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500439 IsVndkExt() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900440 inProduct() bool
441 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800442 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700443 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900444 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700445 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700446 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800447 getVndkExtendsModuleName() string
Yi Kong7e53c572018-02-14 18:16:12 +0800448 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800449 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800450 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800451 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700452 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700453 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900454 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800455 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700456 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700457 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800458 isPreventInstall() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800459}
460
461type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700462 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800463 ModuleContextIntf
464}
465
466type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700467 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800468 ModuleContextIntf
469}
470
Colin Cross37047f12016-12-13 17:06:13 -0800471type DepsContext interface {
472 android.BottomUpMutatorContext
473 ModuleContextIntf
474}
475
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500476// feature represents additional (optional) steps to building cc-related modules, such as invocation
477// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800478type feature interface {
479 begin(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800480 deps(ctx DepsContext, deps Deps) Deps
Colin Crossca860ac2016-01-04 14:34:37 -0800481 flags(ctx ModuleContext, flags Flags) Flags
482 props() []interface{}
483}
484
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500485// compiler is the interface for a compiler helper object. Different module decorators may implement
486// this helper differently. For example, compiling a `cc_library` may use a different build
487// statement than building a `toolchain_library`.
Colin Crossca860ac2016-01-04 14:34:37 -0800488type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700489 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800490 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800491 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700492 compilerProps() []interface{}
493
Colin Cross76fada02016-07-27 10:31:13 -0700494 appendCflags([]string)
495 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700496 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800497}
498
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500499// linker is the interface for a linker decorator object. Individual module types can provide
500// their own implementation for this decorator, and thus specify custom logic regarding build
501// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800502type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700503 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800504 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700505 linkerFlags(ctx ModuleContext, flags Flags) Flags
506 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800507 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700508
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700509 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700510 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900511 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700512
513 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900514 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000515
516 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000517 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
518}
519
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500520// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000521type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500522 sharedLibs []string
523 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
524 // libc, libm, etc.)
525 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800526}
527
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500528// installer is the interface for an installer helper object. This helper is responsible for
529// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800530type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700531 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700532 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000533 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800534 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700535 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700536 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900537 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100538 makeUninstallable(mod *Module)
Colin Crossca860ac2016-01-04 14:34:37 -0800539}
540
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800541type xref interface {
542 XrefCcFiles() android.Paths
543}
544
Colin Cross6e511a92020-07-27 21:26:48 -0700545type libraryDependencyKind int
546
547const (
548 headerLibraryDependency = iota
549 sharedLibraryDependency
550 staticLibraryDependency
551)
552
553func (k libraryDependencyKind) String() string {
554 switch k {
555 case headerLibraryDependency:
556 return "headerLibraryDependency"
557 case sharedLibraryDependency:
558 return "sharedLibraryDependency"
559 case staticLibraryDependency:
560 return "staticLibraryDependency"
561 default:
562 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
563 }
564}
565
566type libraryDependencyOrder int
567
568const (
569 earlyLibraryDependency = -1
570 normalLibraryDependency = 0
571 lateLibraryDependency = 1
572)
573
574func (o libraryDependencyOrder) String() string {
575 switch o {
576 case earlyLibraryDependency:
577 return "earlyLibraryDependency"
578 case normalLibraryDependency:
579 return "normalLibraryDependency"
580 case lateLibraryDependency:
581 return "lateLibraryDependency"
582 default:
583 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
584 }
585}
586
587// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
588// tags that have a set of predefined tag objects that are reused for each dependency, a
589// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
590// That means that comparing a libraryDependencyTag for equality will only be equal if all
591// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
592// then check individual metadata fields instead.
593type libraryDependencyTag struct {
594 blueprint.BaseDependencyTag
595
596 // These are exported so that fmt.Printf("%#v") can call their String methods.
597 Kind libraryDependencyKind
598 Order libraryDependencyOrder
599
600 wholeStatic bool
601
602 reexportFlags bool
603 explicitlyVersioned bool
604 dataLib bool
605 ndk bool
606
607 staticUnwinder bool
608
609 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900610
Cindy Zhou18417cb2020-12-10 07:12:38 -0800611 // Whether or not this dependency should skip the apex dependency check
612 skipApexAllowedDependenciesCheck bool
613
Jiyong Parke3867542020-12-03 17:28:25 +0900614 // Whether or not this dependency has to be followed for the apex variants
615 excludeInApex bool
Colin Cross6e511a92020-07-27 21:26:48 -0700616}
617
618// header returns true if the libraryDependencyTag is tagging a header lib dependency.
619func (d libraryDependencyTag) header() bool {
620 return d.Kind == headerLibraryDependency
621}
622
623// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
624func (d libraryDependencyTag) shared() bool {
625 return d.Kind == sharedLibraryDependency
626}
627
628// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
629func (d libraryDependencyTag) static() bool {
630 return d.Kind == staticLibraryDependency
631}
632
Colin Crosse9fe2942020-11-10 18:12:15 -0800633// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
634// binaries or other shared libraries are installed as dependencies.
635func (d libraryDependencyTag) InstallDepNeeded() bool {
636 return d.shared()
637}
638
639var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
640
641// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700642// libraryDependencyTag. Each tag object is created globally and reused for multiple
643// dependencies (although since the object contains no references, assigning a tag to a
644// variable and modifying it will not modify the original). Users can compare the tag
645// returned by ctx.OtherModuleDependencyTag against the global original
646type dependencyTag struct {
647 blueprint.BaseDependencyTag
648 name string
649}
650
Colin Crosse9fe2942020-11-10 18:12:15 -0800651// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
652// libraryDependencyTag, but where the dependency needs to be installed when the parent is
653// installed.
654type installDependencyTag struct {
655 blueprint.BaseDependencyTag
656 android.InstallAlwaysNeededDependencyTag
657 name string
658}
659
Colin Crossc99deeb2016-04-11 15:06:20 -0700660var (
Colin Cross6e511a92020-07-27 21:26:48 -0700661 genSourceDepTag = dependencyTag{name: "gen source"}
662 genHeaderDepTag = dependencyTag{name: "gen header"}
663 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
664 objDepTag = dependencyTag{name: "obj"}
665 linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900666 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700667 reuseObjTag = dependencyTag{name: "reuse objects"}
668 staticVariantTag = dependencyTag{name: "static variant"}
669 vndkExtDepTag = dependencyTag{name: "vndk extends"}
670 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800671 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700672 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700673 stubImplDepTag = dependencyTag{name: "stub_impl"}
Colin Cross127bb8b2020-12-16 16:46:01 -0800674 llndkStubDepTag = dependencyTag{name: "llndk stub"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700675)
676
Colin Cross56a83212020-09-15 18:30:11 -0700677type copyDirectlyInAnyApexDependencyTag dependencyTag
678
679func (copyDirectlyInAnyApexDependencyTag) CopyDirectlyInAnyApex() {}
680
681var _ android.CopyDirectlyInAnyApexTag = copyDirectlyInAnyApexDependencyTag{}
682
Roland Levillainf89cd092019-07-29 16:22:59 +0100683func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700684 ccLibDepTag, ok := depTag.(libraryDependencyTag)
685 return ok && ccLibDepTag.shared()
686}
687
688func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
689 ccLibDepTag, ok := depTag.(libraryDependencyTag)
690 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100691}
692
Zach Johnson3df4e632020-11-06 11:56:27 -0800693func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
694 ccLibDepTag, ok := depTag.(libraryDependencyTag)
695 return ok && ccLibDepTag.header()
696}
697
Roland Levillainf89cd092019-07-29 16:22:59 +0100698func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800699 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100700}
701
702func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700703 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100704 return ok && ccDepTag == testPerSrcDepTag
705}
706
Colin Crossca860ac2016-01-04 14:34:37 -0800707// Module contains the properties and members used by all C/C++ module types, and implements
708// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500709// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
710// interface.
711//
712// To define a C/C++ related module, construct a new Module object and point its delegates to
713// type-specific structs. These delegates will be invoked to register module-specific build
714// statements which may be unique to the module type. For example, module.compiler.compile() should
715// be defined so as to register build statements which are responsible for compiling the module.
716//
717// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
718// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
719// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
720// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800721type Module struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700722 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -0700723 android.DefaultableModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +0900724 android.ApexModuleBase
Jiyong Parkd1063c12019-07-17 20:08:41 +0900725 android.SdkBase
Colin Crossc472d572015-03-17 15:06:21 -0700726
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700727 Properties BaseProperties
728 VendorProperties VendorProperties
Colin Crossfa138792015-04-24 17:31:52 -0700729
Colin Crossca860ac2016-01-04 14:34:37 -0800730 // initialize before calling Init
Colin Cross635c3b02016-05-18 15:37:25 -0700731 hod android.HostOrDeviceSupported
732 multilib android.Multilib
Colin Crossc472d572015-03-17 15:06:21 -0700733
Paul Duffina0843f62019-12-13 19:50:38 +0000734 // Allowable SdkMemberTypes of this module type.
735 sdkMemberTypes []android.SdkMemberType
736
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500737 // decorator delegates, initialize before calling Init
738 // these may contain module-specific implementations, and effectively allow for custom
739 // type-specific logic. These members may reference different objects or the same object.
740 // Functions of these decorators will be invoked to initialize and register type-specific
741 // build statements.
Colin Crossb4ce0ec2016-09-13 13:41:39 -0700742 compiler compiler
743 linker linker
744 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500745
746 features []feature
747 stl *stl
748 sanitize *sanitize
749 coverage *coverage
750 sabi *sabi
751 vndkdep *vndkdep
752 lto *lto
753 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800754
Colin Cross31076b32020-10-23 17:22:06 -0700755 library libraryInterface
756
Colin Cross635c3b02016-05-18 15:37:25 -0700757 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800758
Colin Crossb98c8b02016-07-29 13:44:28 -0700759 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700760
761 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800762
763 // Flags used to compile this module
764 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700765
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800766 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700767 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900768
769 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800770 // Kythe (source file indexer) paths for this compilation module
771 kytheFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900772
773 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700774 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700775
776 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700777}
778
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500779func (c *Module) SetPreventInstall() {
780 c.Properties.PreventInstall = true
781}
782
783func (c *Module) SetHideFromMake() {
784 c.Properties.HideFromMake = true
785}
786
Ivan Lozano52767be2019-10-18 14:49:46 -0700787func (c *Module) Toc() android.OptionalPath {
788 if c.linker != nil {
789 if library, ok := c.linker.(libraryInterface); ok {
790 return library.toc()
791 }
792 }
793 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
794}
795
796func (c *Module) ApiLevel() string {
797 if c.linker != nil {
798 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700799 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700800 }
801 }
802 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
803}
804
805func (c *Module) Static() bool {
806 if c.linker != nil {
807 if library, ok := c.linker.(libraryInterface); ok {
808 return library.static()
809 }
810 }
811 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
812}
813
814func (c *Module) Shared() bool {
815 if c.linker != nil {
816 if library, ok := c.linker.(libraryInterface); ok {
817 return library.shared()
818 }
819 }
820 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
821}
822
823func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +0000824 if c.stl != nil {
825 return c.stl.Properties.SelectedStl
826 }
827 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -0700828}
829
830func (c *Module) ToolchainLibrary() bool {
831 if _, ok := c.linker.(*toolchainLibraryDecorator); ok {
832 return true
833 }
834 return false
835}
836
837func (c *Module) NdkPrebuiltStl() bool {
838 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
839 return true
840 }
841 return false
842}
843
844func (c *Module) StubDecorator() bool {
845 if _, ok := c.linker.(*stubDecorator); ok {
846 return true
847 }
848 return false
849}
850
851func (c *Module) SdkVersion() string {
852 return String(c.Properties.Sdk_version)
853}
854
Artur Satayev480e25b2020-04-27 18:53:18 +0100855func (c *Module) MinSdkVersion() string {
856 return String(c.Properties.Min_sdk_version)
857}
858
Dan Albert92fe7402020-07-15 13:33:30 -0700859func (c *Module) SplitPerApiLevel() bool {
Colin Cross1348ce32020-10-01 13:37:16 -0700860 if !c.canUseSdk() {
861 return false
862 }
Dan Albert92fe7402020-07-15 13:33:30 -0700863 if linker, ok := c.linker.(*objectLinker); ok {
864 return linker.isCrt()
865 }
866 return false
867}
868
Colin Crossc511bc52020-04-07 16:50:32 +0000869func (c *Module) AlwaysSdk() bool {
870 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
871}
872
Ivan Lozano183a3212019-10-18 14:18:45 -0700873func (c *Module) CcLibrary() bool {
874 if c.linker != nil {
875 if _, ok := c.linker.(*libraryDecorator); ok {
876 return true
877 }
Colin Crossd48fe732020-09-23 20:37:24 -0700878 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
879 return true
880 }
Ivan Lozano183a3212019-10-18 14:18:45 -0700881 }
882 return false
883}
884
885func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -0700886 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700887 return true
888 }
889 return false
890}
891
Ivan Lozano2b262972019-11-21 12:30:50 -0800892func (c *Module) NonCcVariants() bool {
893 return false
894}
895
Ivan Lozano183a3212019-10-18 14:18:45 -0700896func (c *Module) SetStatic() {
897 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700898 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700899 library.setStatic()
900 return
901 }
902 }
903 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
904}
905
906func (c *Module) SetShared() {
907 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700908 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700909 library.setShared()
910 return
911 }
912 }
913 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
914}
915
916func (c *Module) BuildStaticVariant() bool {
917 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700918 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700919 return library.buildStatic()
920 }
921 }
922 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
923}
924
925func (c *Module) BuildSharedVariant() bool {
926 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700927 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700928 return library.buildShared()
929 }
930 }
931 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
932}
933
934func (c *Module) Module() android.Module {
935 return c
936}
937
Jiyong Parkc20eee32018-09-05 22:36:17 +0900938func (c *Module) OutputFile() android.OptionalPath {
939 return c.outputFile
940}
941
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400942func (c *Module) CoverageFiles() android.Paths {
943 if c.linker != nil {
944 if library, ok := c.linker.(libraryInterface); ok {
945 return library.objs().coverageFiles
946 }
947 }
948 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
949}
950
Ivan Lozano183a3212019-10-18 14:18:45 -0700951var _ LinkableInterface = (*Module)(nil)
952
Jiyong Park719b4462019-01-13 00:39:51 +0900953func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900954 if c.linker != nil {
955 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +0900956 }
957 return nil
958}
959
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900960func (c *Module) CoverageOutputFile() android.OptionalPath {
961 if c.linker != nil {
962 return c.linker.coverageOutputFilePath()
963 }
964 return android.OptionalPath{}
965}
966
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900967func (c *Module) RelativeInstallPath() string {
968 if c.installer != nil {
969 return c.installer.relativeInstallPath()
970 }
971 return ""
972}
973
Jooyung Han344d5432019-08-23 11:17:39 +0900974func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +0900975 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +0900976}
977
Colin Cross36242852017-06-23 15:06:31 -0700978func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -0700979 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -0800980 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -0700981 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800982 }
983 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -0700984 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800985 }
986 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -0700987 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -0800988 }
Colin Crossa8e07cc2016-04-04 15:07:06 -0700989 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -0700990 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -0700991 }
Colin Cross16b23492016-01-06 14:41:07 -0800992 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -0700993 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -0800994 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800995 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -0700996 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -0800997 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -0800998 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -0700999 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001000 }
Justin Yun8effde42017-06-23 19:24:43 +09001001 if c.vndkdep != nil {
1002 c.AddProperties(c.vndkdep.props()...)
1003 }
Stephen Craneba090d12017-05-09 15:44:35 -07001004 if c.lto != nil {
1005 c.AddProperties(c.lto.props()...)
1006 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001007 if c.pgo != nil {
1008 c.AddProperties(c.pgo.props()...)
1009 }
Colin Crossca860ac2016-01-04 14:34:37 -08001010 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001011 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001012 }
Colin Crossc472d572015-03-17 15:06:21 -07001013
Jiyong Park1613e552020-09-14 19:43:17 +09001014 c.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, os android.OsType) bool {
Elliott Hughes79ae3412020-04-17 15:49:49 -07001015 // Windows builds always prefer 32-bit
Jiyong Park1613e552020-09-14 19:43:17 +09001016 return os == android.Windows
Colin Crossa9d8bee2018-10-02 13:59:46 -07001017 })
Colin Cross36242852017-06-23 15:06:31 -07001018 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001019 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +09001020 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001021 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001022
Colin Cross36242852017-06-23 15:06:31 -07001023 return c
Colin Crossc472d572015-03-17 15:06:21 -07001024}
1025
Colin Crossb916a382016-07-29 17:28:03 -07001026// Returns true for dependency roots (binaries)
1027// TODO(ccross): also handle dlopenable libraries
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001028func (c *Module) IsDependencyRoot() bool {
Colin Crossb916a382016-07-29 17:28:03 -07001029 if root, ok := c.linker.(interface {
1030 isDependencyRoot() bool
1031 }); ok {
1032 return root.isDependencyRoot()
1033 }
1034 return false
1035}
1036
Justin Yun5f7f7e82019-11-18 19:52:14 +09001037// Returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64.
1038// "product" and "vendor" variant modules return true for this function.
1039// When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true",
1040// "soc_specific: true" and more vendor installed modules are included here.
Justin Yun63e9ec72020-10-29 16:49:43 +09001041// When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "product_available: true" or
Justin Yun5f7f7e82019-11-18 19:52:14 +09001042// "product_specific: true" modules are included here.
Ivan Lozano52767be2019-10-18 14:49:46 -07001043func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001044 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001045}
1046
Colin Crossc511bc52020-04-07 16:50:32 +00001047func (c *Module) canUseSdk() bool {
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001048 return c.Os() == android.Android && !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001049}
1050
1051func (c *Module) UseSdk() bool {
1052 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001053 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001054 }
1055 return false
1056}
1057
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001058func (c *Module) isCoverageVariant() bool {
1059 return c.coverage.Properties.IsCoverageVariant
1060}
1061
Colin Cross95f1ca02020-10-29 20:47:22 -07001062func (c *Module) IsNdk(config android.Config) bool {
1063 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001064}
1065
Colin Cross127bb8b2020-12-16 16:46:01 -08001066// isLLndk returns true for both LLNDK (public) and LLNDK-private libs.
1067func (c *Module) IsLlndk() bool {
1068 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001069}
1070
Colin Cross127bb8b2020-12-16 16:46:01 -08001071// IsLlndkPublic returns true only for LLNDK (public) libs.
1072func (c *Module) IsLlndkPublic() bool {
1073 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsLLNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001074}
1075
Colin Cross127bb8b2020-12-16 16:46:01 -08001076// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1077// and does not set llndk.vendor_available: false.
1078func (c *Module) isImplementationForLLNDKPublic() bool {
1079 library, _ := c.library.(*libraryDecorator)
1080 return library != nil && library.hasLLNDKStubs() &&
Justin Yunc0d8c492021-01-07 17:45:31 +09001081 (!Bool(library.Properties.Llndk.Private) ||
Colin Cross127bb8b2020-12-16 16:46:01 -08001082 // TODO(b/170784825): until the LLNDK properties are moved into the cc_library,
1083 // the non-Vendor variants of the cc_library don't know if the corresponding
Justin Yunc0d8c492021-01-07 17:45:31 +09001084 // llndk_library set private: true. Since libft2 is the only private LLNDK
1085 // library, hardcode it during the transition.
Colin Cross127bb8b2020-12-16 16:46:01 -08001086 c.BaseModuleName() != "libft2")
1087}
1088
Justin Yunfd9e8042020-12-23 18:23:14 +09001089// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001090func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001091 // Check if VNDK-core-private or VNDK-SP-private
1092 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001093 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001094 }
1095
1096 // Check if LLNDK-private
1097 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001098 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001099 }
1100
1101 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001102}
1103
Ivan Lozano52767be2019-10-18 14:49:46 -07001104func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001105 if vndkdep := c.vndkdep; vndkdep != nil {
1106 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001107 }
1108 return false
1109}
1110
Yi Kong7e53c572018-02-14 18:16:12 +08001111func (c *Module) isPgoCompile() bool {
1112 if pgo := c.pgo; pgo != nil {
1113 return pgo.Properties.PgoCompile
1114 }
1115 return false
1116}
1117
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001118func (c *Module) isNDKStubLibrary() bool {
1119 if _, ok := c.compiler.(*stubDecorator); ok {
1120 return true
1121 }
1122 return false
1123}
1124
Logan Chienf3511742017-10-31 18:04:35 +08001125func (c *Module) isVndkSp() bool {
1126 if vndkdep := c.vndkdep; vndkdep != nil {
1127 return vndkdep.isVndkSp()
1128 }
1129 return false
1130}
1131
Ivan Lozanof9e21722020-12-02 09:00:51 -05001132func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001133 if vndkdep := c.vndkdep; vndkdep != nil {
1134 return vndkdep.isVndkExt()
1135 }
1136 return false
1137}
1138
Ivan Lozano52767be2019-10-18 14:49:46 -07001139func (c *Module) MustUseVendorVariant() bool {
Jooyung Han097087b2019-10-22 19:32:18 +09001140 return c.isVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001141}
1142
Logan Chienf3511742017-10-31 18:04:35 +08001143func (c *Module) getVndkExtendsModuleName() string {
1144 if vndkdep := c.vndkdep; vndkdep != nil {
1145 return vndkdep.getVndkExtendsModuleName()
1146 }
1147 return ""
1148}
1149
Jiyong Park25fc6a92018-11-18 18:02:45 +09001150func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001151 if lib := c.library; lib != nil {
1152 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001153 }
1154 return false
1155}
1156
1157func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001158 if lib := c.library; lib != nil {
1159 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001160 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001161 return false
1162}
1163
Colin Cross0477b422020-10-13 18:43:54 -07001164// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1165// the implementation. If it is an implementation library it returns its own name.
1166func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1167 name := ctx.OtherModuleName(c)
1168 if versioned, ok := c.linker.(versionedInterface); ok {
1169 name = versioned.implementationModuleName(name)
1170 }
1171 return name
1172}
1173
Martin Stjernholm2856c662020-12-02 15:03:42 +00001174// Similar to ImplementationModuleName, but uses the Make variant of the module
1175// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1176// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1177// under the premise that the prebuilt module overrides its source counterpart
1178// if it is exposed to Make).
1179func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1180 name := c.BaseModuleName()
1181 if versioned, ok := c.linker.(versionedInterface); ok {
1182 name = versioned.implementationModuleName(name)
1183 }
1184 return name
1185}
1186
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001187func (c *Module) bootstrap() bool {
1188 return Bool(c.Properties.Bootstrap)
1189}
1190
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001191func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001192 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1193 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1194 return false
1195 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001196 return c.linker != nil && c.linker.nativeCoverage()
1197}
1198
Inseob Kim8471cda2019-11-15 09:59:12 +09001199func (c *Module) isSnapshotPrebuilt() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09001200 if p, ok := c.linker.(interface{ isSnapshotPrebuilt() bool }); ok {
1201 return p.isSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001202 }
1203 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001204}
1205
Bill Peckham945441c2020-08-31 16:07:58 -07001206func (c *Module) ExcludeFromVendorSnapshot() bool {
1207 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1208}
1209
Jose Galmesf7294582020-11-13 12:07:36 -08001210func (c *Module) ExcludeFromRecoverySnapshot() bool {
1211 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1212}
1213
Jiyong Parkf1194352019-02-25 11:05:47 +09001214func isBionic(name string) bool {
1215 switch name {
Kiyoung Kim4098c7e2020-11-30 14:42:14 +09001216 case "libc", "libm", "libdl", "libdl_android", "linker", "linkerconfig":
Jiyong Parkf1194352019-02-25 11:05:47 +09001217 return true
1218 }
1219 return false
1220}
1221
Martin Stjernholm279de572019-09-10 23:18:20 +01001222func InstallToBootstrap(name string, config android.Config) bool {
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001223 if name == "libclang_rt.hwasan-aarch64-android" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001224 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001225 }
1226 return isBionic(name)
1227}
1228
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001229func (c *Module) XrefCcFiles() android.Paths {
1230 return c.kytheFiles
1231}
1232
Colin Crossca860ac2016-01-04 14:34:37 -08001233type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001234 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001235 moduleContextImpl
1236}
1237
Colin Cross37047f12016-12-13 17:06:13 -08001238type depsContext struct {
1239 android.BottomUpMutatorContext
1240 moduleContextImpl
1241}
1242
Colin Crossca860ac2016-01-04 14:34:37 -08001243type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001244 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001245 moduleContextImpl
1246}
1247
1248type moduleContextImpl struct {
1249 mod *Module
1250 ctx BaseModuleContext
1251}
1252
Colin Crossb98c8b02016-07-29 13:44:28 -07001253func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001254 return ctx.mod.toolchain(ctx.ctx)
1255}
1256
1257func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001258 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001259}
1260
1261func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001262 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001263}
1264
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001265func (ctx *moduleContextImpl) testBinary() bool {
1266 return ctx.mod.testBinary()
1267}
1268
Jiyong Park1d1119f2019-07-29 21:27:18 +09001269func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001270 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001271}
1272
Inseob Kim7f283f42020-06-01 21:53:49 +09001273func (ctx *moduleContextImpl) binary() bool {
1274 return ctx.mod.binary()
1275}
1276
Inseob Kim1042d292020-06-01 23:23:05 +09001277func (ctx *moduleContextImpl) object() bool {
1278 return ctx.mod.object()
1279}
1280
Jooyung Hanccce2f22020-03-07 03:45:53 +09001281func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001282 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001283}
1284
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001285func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001286 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001287}
1288
1289func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001290 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001291 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001292 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001293 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001294 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001295 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001296 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001297 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001298 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001299 }
1300 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001301}
1302
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001303func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001304 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001305}
Justin Yun8effde42017-06-23 19:24:43 +09001306
Colin Cross95f1ca02020-10-29 20:47:22 -07001307func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1308 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001309}
1310
Colin Cross127bb8b2020-12-16 16:46:01 -08001311func (ctx *moduleContextImpl) IsLlndk() bool {
1312 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001313}
1314
Colin Cross127bb8b2020-12-16 16:46:01 -08001315func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1316 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001317}
1318
Colin Cross127bb8b2020-12-16 16:46:01 -08001319func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1320 return ctx.mod.isImplementationForLLNDKPublic()
1321}
1322
1323func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1324 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001325}
1326
Logan Chienf3511742017-10-31 18:04:35 +08001327func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001328 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001329}
1330
Yi Kong7e53c572018-02-14 18:16:12 +08001331func (ctx *moduleContextImpl) isPgoCompile() bool {
1332 return ctx.mod.isPgoCompile()
1333}
1334
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001335func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1336 return ctx.mod.isNDKStubLibrary()
1337}
1338
Justin Yun8effde42017-06-23 19:24:43 +09001339func (ctx *moduleContextImpl) isVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001340 return ctx.mod.isVndkSp()
1341}
1342
Ivan Lozanof9e21722020-12-02 09:00:51 -05001343func (ctx *moduleContextImpl) IsVndkExt() bool {
1344 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001345}
1346
Vic Yangefd249e2018-11-12 20:19:56 -08001347func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001348 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001349}
1350
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001351func (ctx *moduleContextImpl) selectedStl() string {
1352 if stl := ctx.mod.stl; stl != nil {
1353 return stl.Properties.SelectedStl
1354 }
1355 return ""
1356}
1357
Ivan Lozanobd721262018-11-27 14:33:03 -08001358func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1359 return ctx.mod.linker.useClangLld(actx)
1360}
1361
Colin Crossce75d2c2016-10-06 16:12:58 -07001362func (ctx *moduleContextImpl) baseModuleName() string {
1363 return ctx.mod.ModuleBase.BaseModuleName()
1364}
1365
Logan Chienf3511742017-10-31 18:04:35 +08001366func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1367 return ctx.mod.getVndkExtendsModuleName()
1368}
1369
Logan Chiene274fc92019-12-03 11:18:32 -08001370func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001371 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001372}
1373
Colin Crosse07f2312020-08-13 11:24:56 -07001374func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001375 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001376}
1377
Dan Albertc8060532020-07-22 22:32:17 -07001378func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001379 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001380}
1381
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001382func (ctx *moduleContextImpl) bootstrap() bool {
1383 return ctx.mod.bootstrap()
1384}
1385
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001386func (ctx *moduleContextImpl) nativeCoverage() bool {
1387 return ctx.mod.nativeCoverage()
1388}
1389
Colin Cross56a83212020-09-15 18:30:11 -07001390func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1391 return ctx.mod.DirectlyInAnyApex()
1392}
1393
Colin Cross95b07f22020-12-16 11:06:50 -08001394func (ctx *moduleContextImpl) isPreventInstall() bool {
1395 return ctx.mod.Properties.PreventInstall
1396}
1397
Colin Cross635c3b02016-05-18 15:37:25 -07001398func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001399 return &Module{
1400 hod: hod,
1401 multilib: multilib,
1402 }
1403}
1404
Colin Cross635c3b02016-05-18 15:37:25 -07001405func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001406 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001407 module.features = []feature{
1408 &tidyFeature{},
1409 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001410 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001411 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001412 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001413 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001414 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001415 module.lto = &lto{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001416 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001417 return module
1418}
1419
Colin Crossce75d2c2016-10-06 16:12:58 -07001420func (c *Module) Prebuilt() *android.Prebuilt {
1421 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1422 return p.prebuilt()
1423 }
1424 return nil
1425}
1426
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001427func (c *Module) IsPrebuilt() bool {
1428 return c.Prebuilt() != nil
1429}
1430
Colin Crossce75d2c2016-10-06 16:12:58 -07001431func (c *Module) Name() string {
1432 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001433 if p, ok := c.linker.(interface {
1434 Name(string) string
1435 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001436 name = p.Name(name)
1437 }
1438 return name
1439}
1440
Alex Light3d673592019-01-18 14:37:31 -08001441func (c *Module) Symlinks() []string {
1442 if p, ok := c.installer.(interface {
1443 symlinkList() []string
1444 }); ok {
1445 return p.symlinkList()
1446 }
1447 return nil
1448}
1449
Roland Levillainf89cd092019-07-29 16:22:59 +01001450func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1451 test, ok := c.linker.(testPerSrc)
1452 return ok && test.isAllTestsVariation()
1453}
1454
Chris Parsons216e10a2020-07-09 17:12:52 -04001455func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001456 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001457 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001458 }); ok {
1459 return p.dataPaths()
1460 }
1461 return nil
1462}
1463
Justin Yun5f7f7e82019-11-18 19:52:14 +09001464func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
1465 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1466 // "current", it will append the VNDK version to the name suffix.
1467 var vndkVersion string
1468 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001469 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001470 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
1471 nameSuffix = productSuffix
1472 } else {
1473 vndkVersion = ctx.DeviceConfig().VndkVersion()
1474 nameSuffix = vendorSuffix
1475 }
1476 if vndkVersion == "current" {
1477 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1478 }
Colin Cross127bb8b2020-12-16 16:46:01 -08001479 if c.Properties.VndkVersion != vndkVersion && c.Properties.VndkVersion != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001480 // add version suffix only if the module is using different vndk version than the
1481 // version in product or vendor partition.
1482 nameSuffix += "." + c.Properties.VndkVersion
1483 }
1484 return nameSuffix
1485}
1486
Colin Cross635c3b02016-05-18 15:37:25 -07001487func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Roland Levillainf2fad972019-06-28 15:41:19 +01001488 // Handle the case of a test module split by `test_per_src` mutator.
Roland Levillainf89cd092019-07-29 16:22:59 +01001489 //
1490 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1491 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1492 // module and return early, as this module does not produce an output file per se.
1493 if c.IsTestPerSrcAllTestsVariation() {
1494 c.outputFile = android.OptionalPath{}
1495 return
Roland Levillainf2fad972019-06-28 15:41:19 +01001496 }
1497
Colin Cross56a83212020-09-15 18:30:11 -07001498 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1499 if !apexInfo.IsForPlatform() {
1500 c.hideApexVariantFromMake = true
1501 }
1502
Ivan Lozanof9e21722020-12-02 09:00:51 -05001503 c.makeLinkType = GetMakeLinkType(actx, c)
Inseob Kim9516ee92019-05-09 10:56:13 +09001504
Inseob Kim64c43952019-08-26 16:52:35 +09001505 c.Properties.SubName = ""
1506
1507 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1508 c.Properties.SubName += nativeBridgeSuffix
1509 }
1510
Colin Cross127bb8b2020-12-16 16:46:01 -08001511 llndk := c.IsLlndk()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001512 _, llndkHeader := c.linker.(*llndkHeadersDecorator)
Justin Yun63e9ec72020-10-29 16:49:43 +09001513 if llndk || llndkHeader || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001514 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1515 // added for product variant only when we have vendor and product variants with core
1516 // variant. The suffix is not added for vendor-only or product-only module.
1517 c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
1518 } else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
Inseob Kim64c43952019-08-26 16:52:35 +09001519 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1520 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
1521 c.Properties.SubName += vendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001522 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
1523 c.Properties.SubName += ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001524 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
1525 c.Properties.SubName += vendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001526 } else if c.InRecovery() && !c.OnlyInRecovery() {
Inseob Kim64c43952019-08-26 16:52:35 +09001527 c.Properties.SubName += recoverySuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001528 } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
Colin Crossc511bc52020-04-07 16:50:32 +00001529 c.Properties.SubName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001530 if c.SplitPerApiLevel() {
1531 c.Properties.SubName += "." + c.SdkVersion()
1532 }
Inseob Kim64c43952019-08-26 16:52:35 +09001533 }
1534
Colin Crossca860ac2016-01-04 14:34:37 -08001535 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001536 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001537 moduleContextImpl: moduleContextImpl{
1538 mod: c,
1539 },
1540 }
1541 ctx.ctx = ctx
1542
Colin Crossf18e1102017-11-16 14:33:08 -08001543 deps := c.depsToPaths(ctx)
1544 if ctx.Failed() {
1545 return
1546 }
1547
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001548 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1549 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1550 }
1551
Colin Crossca860ac2016-01-04 14:34:37 -08001552 flags := Flags{
1553 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001554 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001555 }
Colin Crossca860ac2016-01-04 14:34:37 -08001556 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001557 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001558 }
1559 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001560 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001561 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001562 if c.stl != nil {
1563 flags = c.stl.flags(ctx, flags)
1564 }
Colin Cross16b23492016-01-06 14:41:07 -08001565 if c.sanitize != nil {
1566 flags = c.sanitize.flags(ctx, flags)
1567 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001568 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001569 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001570 }
Stephen Craneba090d12017-05-09 15:44:35 -07001571 if c.lto != nil {
1572 flags = c.lto.flags(ctx, flags)
1573 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001574 if c.pgo != nil {
1575 flags = c.pgo.flags(ctx, flags)
1576 }
Colin Crossca860ac2016-01-04 14:34:37 -08001577 for _, feature := range c.features {
1578 flags = feature.flags(ctx, flags)
1579 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001580 if ctx.Failed() {
1581 return
1582 }
1583
Colin Cross4af21ed2019-11-04 09:37:55 -08001584 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1585 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1586 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001587
Colin Cross4af21ed2019-11-04 09:37:55 -08001588 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001589
1590 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001591 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001592 }
1593 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001594 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001595 }
1596
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001597 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001598 // We need access to all the flags seen by a source file.
1599 if c.sabi != nil {
1600 flags = c.sabi.flags(ctx, flags)
1601 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001602
Colin Cross4af21ed2019-11-04 09:37:55 -08001603 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001604
Colin Crossca860ac2016-01-04 14:34:37 -08001605 // Optimization to reduce size of build.ninja
1606 // Replace the long list of flags for each file with a module-local variable
Colin Cross4af21ed2019-11-04 09:37:55 -08001607 ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
1608 ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
1609 ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
1610 flags.Local.CFlags = []string{"$cflags"}
1611 flags.Local.CppFlags = []string{"$cppflags"}
1612 flags.Local.AsFlags = []string{"$asflags"}
Colin Crossca860ac2016-01-04 14:34:37 -08001613
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001614 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001615 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001616 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001617 if ctx.Failed() {
1618 return
1619 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001620 c.kytheFiles = objs.kytheFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001621 }
1622
Colin Crossca860ac2016-01-04 14:34:37 -08001623 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001624 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001625 if ctx.Failed() {
1626 return
1627 }
Colin Cross635c3b02016-05-18 15:37:25 -07001628 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001629
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09001630 // If a lib is directly included in any of the APEXes or is not available to the
1631 // platform (which is often the case when the stub is provided as a prebuilt),
1632 // unhide the stubs variant having the latest version gets visible to make. In
1633 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
1634 // force anything in the make world to link against the stubs library. (unless it
1635 // is explicitly referenced via .bootstrap suffix or the module is marked with
1636 // 'bootstrap: true').
1637 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Ivan Lozano52767be2019-10-18 14:49:46 -07001638 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001639 c.IsStubs() && !c.InVendorRamdisk() {
Jiyong Parkb0788572018-12-20 22:10:17 +09001640 c.Properties.HideFromMake = false // unhide
1641 // Note: this is still non-installable
1642 }
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001643
Jose Galmes6f843bc2020-12-11 13:36:29 -08001644 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
1645 // RECOVERY_SNAPSHOT_VERSION is current.
1646 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Inseob Kimde5744a2020-12-02 13:14:28 +09001647 if shouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001648 i.collectHeadersForSnapshot(ctx)
1649 }
1650 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001651 }
Colin Cross5049f022015-03-18 13:28:46 -07001652
Colin Crossa9c8c9f2020-12-16 10:20:23 -08001653 if !proptools.BoolDefault(c.Properties.Installable, true) {
1654 // If the module has been specifically configure to not be installed then
1655 // hide from make as otherwise it will break when running inside make
1656 // as the output path to install will not be specified. Not all uninstallable
1657 // modules can be hidden from make as some are needed for resolving make side
1658 // dependencies.
1659 c.HideFromMake()
1660 } else if !c.installable(apexInfo) {
1661 c.SkipInstall()
1662 }
1663
1664 // Still call c.installer.install though, the installs will be stored as PackageSpecs
1665 // to allow using the outputs in a genrule.
1666 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07001667 c.installer.install(ctx, c.outputFile.Path())
1668 if ctx.Failed() {
1669 return
Colin Crossca860ac2016-01-04 14:34:37 -08001670 }
Dan Albertc403f7c2015-03-18 14:01:18 -07001671 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001672}
1673
Colin Cross0ea8ba82019-06-06 14:33:29 -07001674func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001675 if c.cachedToolchain == nil {
Colin Crossb98c8b02016-07-29 13:44:28 -07001676 c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
Colin Cross3f40fa42015-01-30 17:27:36 -08001677 }
Colin Crossca860ac2016-01-04 14:34:37 -08001678 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08001679}
1680
Colin Crossca860ac2016-01-04 14:34:37 -08001681func (c *Module) begin(ctx BaseModuleContext) {
1682 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001683 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07001684 }
Colin Crossca860ac2016-01-04 14:34:37 -08001685 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001686 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001687 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001688 if c.stl != nil {
1689 c.stl.begin(ctx)
1690 }
Colin Cross16b23492016-01-06 14:41:07 -08001691 if c.sanitize != nil {
1692 c.sanitize.begin(ctx)
1693 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001694 if c.coverage != nil {
1695 c.coverage.begin(ctx)
1696 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001697 if c.sabi != nil {
1698 c.sabi.begin(ctx)
1699 }
Justin Yun8effde42017-06-23 19:24:43 +09001700 if c.vndkdep != nil {
1701 c.vndkdep.begin(ctx)
1702 }
Stephen Craneba090d12017-05-09 15:44:35 -07001703 if c.lto != nil {
1704 c.lto.begin(ctx)
1705 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001706 if c.pgo != nil {
1707 c.pgo.begin(ctx)
1708 }
Colin Crossca860ac2016-01-04 14:34:37 -08001709 for _, feature := range c.features {
1710 feature.begin(ctx)
1711 }
Dan Albert92fe7402020-07-15 13:33:30 -07001712 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07001713 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001714 if err != nil {
1715 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07001716 c.Properties.Sdk_version = nil
1717 } else {
1718 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001719 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001720 }
Colin Crossca860ac2016-01-04 14:34:37 -08001721}
1722
Colin Cross37047f12016-12-13 17:06:13 -08001723func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07001724 deps := Deps{}
1725
1726 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001727 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001728 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001729 // Add the PGO dependency (the clang_rt.profile runtime library), which
1730 // sometimes depends on symbols from libgcc, before libgcc gets added
1731 // in linkerDeps().
Pirama Arumuga Nainar49b53d52017-10-04 16:47:29 -07001732 if c.pgo != nil {
1733 deps = c.pgo.deps(ctx, deps)
1734 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001735 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001736 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001737 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001738 if c.stl != nil {
1739 deps = c.stl.deps(ctx, deps)
1740 }
Colin Cross16b23492016-01-06 14:41:07 -08001741 if c.sanitize != nil {
1742 deps = c.sanitize.deps(ctx, deps)
1743 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001744 if c.coverage != nil {
1745 deps = c.coverage.deps(ctx, deps)
1746 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001747 if c.sabi != nil {
1748 deps = c.sabi.deps(ctx, deps)
1749 }
Justin Yun8effde42017-06-23 19:24:43 +09001750 if c.vndkdep != nil {
1751 deps = c.vndkdep.deps(ctx, deps)
1752 }
Stephen Craneba090d12017-05-09 15:44:35 -07001753 if c.lto != nil {
1754 deps = c.lto.deps(ctx, deps)
1755 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001756 for _, feature := range c.features {
1757 deps = feature.deps(ctx, deps)
1758 }
1759
Colin Crossb6715442017-10-24 11:13:31 -07001760 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1761 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1762 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
1763 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1764 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
1765 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08001766 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07001767
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001768 for _, lib := range deps.ReexportSharedLibHeaders {
1769 if !inList(lib, deps.SharedLibs) {
1770 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
1771 }
1772 }
1773
1774 for _, lib := range deps.ReexportStaticLibHeaders {
1775 if !inList(lib, deps.StaticLibs) {
1776 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib)
1777 }
1778 }
1779
Colin Cross5950f382016-12-13 12:50:57 -08001780 for _, lib := range deps.ReexportHeaderLibHeaders {
1781 if !inList(lib, deps.HeaderLibs) {
1782 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
1783 }
1784 }
1785
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001786 for _, gen := range deps.ReexportGeneratedHeaders {
1787 if !inList(gen, deps.GeneratedHeaders) {
1788 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
1789 }
1790 }
1791
Colin Crossc99deeb2016-04-11 15:06:20 -07001792 return deps
1793}
1794
Dan Albert7e9d2952016-08-04 13:02:36 -07001795func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08001796 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001797 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001798 moduleContextImpl: moduleContextImpl{
1799 mod: c,
1800 },
1801 }
1802 ctx.ctx = ctx
1803
Colin Crossca860ac2016-01-04 14:34:37 -08001804 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07001805}
1806
Jiyong Park7ed9de32018-10-15 22:25:07 +09001807// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09001808func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001809 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
1810 version := name[sharp+1:]
1811 libname := name[:sharp]
1812 return libname, version
1813 }
1814 return name, ""
1815}
1816
Dan Albert92fe7402020-07-15 13:33:30 -07001817func GetCrtVariations(ctx android.BottomUpMutatorContext,
1818 m LinkableInterface) []blueprint.Variation {
1819 if ctx.Os() != android.Android {
1820 return nil
1821 }
1822 if m.UseSdk() {
1823 return []blueprint.Variation{
1824 {Mutator: "sdk", Variation: "sdk"},
Colin Crossbbc941b2020-09-30 12:27:01 -07001825 {Mutator: "version", Variation: m.SdkVersion()},
Dan Albert92fe7402020-07-15 13:33:30 -07001826 }
1827 }
1828 return []blueprint.Variation{
1829 {Mutator: "sdk", Variation: ""},
1830 }
1831}
1832
Colin Crosse7257d22020-09-24 09:56:18 -07001833func (c *Module) addSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext,
1834 variations []blueprint.Variation, depTag libraryDependencyTag, name, version string, far bool) {
1835
1836 variations = append([]blueprint.Variation(nil), variations...)
1837
Colin Cross3146c5c2020-09-30 15:34:40 -07001838 if version != "" && CanBeOrLinkAgainstVersionVariants(c) {
Colin Crosse7257d22020-09-24 09:56:18 -07001839 // Version is explicitly specified. i.e. libFoo#30
1840 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
1841 depTag.explicitlyVersioned = true
1842 }
Colin Crosse7257d22020-09-24 09:56:18 -07001843
Colin Cross0de8a1e2020-09-18 14:15:30 -07001844 if far {
1845 ctx.AddFarVariationDependencies(variations, depTag, name)
1846 } else {
1847 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07001848 }
1849}
1850
Colin Cross1e676be2016-10-12 14:38:15 -07001851func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09001852 if !c.Enabled() {
1853 return
1854 }
1855
Colin Cross37047f12016-12-13 17:06:13 -08001856 ctx := &depsContext{
1857 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07001858 moduleContextImpl: moduleContextImpl{
1859 mod: c,
1860 },
1861 }
1862 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08001863
Colin Crossc99deeb2016-04-11 15:06:20 -07001864 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001865
Yo Chiang219968c2020-09-22 18:45:04 +08001866 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
1867
Dan Albert914449f2016-06-17 16:45:24 -07001868 variantNdkLibs := []string{}
1869 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07001870 if ctx.Os() == android.Android {
Inseob Kimeec88e12020-01-22 11:11:29 +09001871 // rewriteLibs takes a list of names of shared libraries and scans it for three types
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001872 // of names:
Dan Albert914449f2016-06-17 16:45:24 -07001873 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001874 // 1. Name of an NDK library that refers to a prebuilt module.
1875 // For each of these, it adds the name of the prebuilt module (which will be in
1876 // prebuilts/ndk) to the list of nonvariant libs.
1877 // 2. Name of an NDK library that refers to an ndk_library module.
1878 // For each of these, it adds the name of the ndk_library module to the list of
1879 // variant libs.
1880 // 3. Anything else (so anything that isn't an NDK library).
1881 // It adds these to the nonvariantLibs list.
Dan Albert914449f2016-06-17 16:45:24 -07001882 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001883 // The caller can then know to add the variantLibs dependencies differently from the
1884 // nonvariantLibs
Inseob Kim9516ee92019-05-09 10:56:13 +09001885
Inseob Kim9516ee92019-05-09 10:56:13 +09001886 vendorPublicLibraries := vendorPublicLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001887 vendorSnapshotSharedLibs := vendorSnapshotSharedLibs(actx.Config())
Jose Galmes6f843bc2020-12-11 13:36:29 -08001888 recoverySnapshotSharedLibs := recoverySnapshotSharedLibs(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001889
1890 rewriteVendorLibs := func(lib string) string {
Inseob Kimeec88e12020-01-22 11:11:29 +09001891 // only modules with BOARD_VNDK_VERSION uses snapshot.
1892 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1893 return lib
1894 }
1895
1896 if snapshot, ok := vendorSnapshotSharedLibs.get(lib, actx.Arch().ArchType); ok {
1897 return snapshot
1898 }
1899
1900 return lib
1901 }
1902
1903 rewriteLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001904 variantLibs = []string{}
1905 nonvariantLibs = []string{}
Dan Albert914449f2016-06-17 16:45:24 -07001906 for _, entry := range list {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001907 // strip #version suffix out
Jiyong Park73c54ee2019-10-22 20:31:18 +09001908 name, _ := StubsLibNameAndVersion(entry)
Jose Galmes6f843bc2020-12-11 13:36:29 -08001909 if c.InRecovery() {
1910 recoverySnapshotVersion :=
1911 actx.DeviceConfig().RecoverySnapshotVersion()
1912 if recoverySnapshotVersion == "current" ||
1913 recoverySnapshotVersion == "" {
1914 nonvariantLibs = append(nonvariantLibs, name)
1915 } else if snapshot, ok := recoverySnapshotSharedLibs.get(
1916 name, actx.Arch().ArchType); ok {
1917 nonvariantLibs = append(nonvariantLibs, snapshot)
1918 } else {
1919 nonvariantLibs = append(nonvariantLibs, name)
1920 }
1921 } else if ctx.useSdk() && inList(name, *getNDKKnownLibs(ctx.Config())) {
Dan Albertde5aade2020-06-30 12:32:51 -07001922 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Inseob Kimeec88e12020-01-22 11:11:29 +09001923 } else if ctx.useVndk() {
1924 nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
Inseob Kim9516ee92019-05-09 10:56:13 +09001925 } else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, *vendorPublicLibraries) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001926 vendorPublicLib := name + vendorPublicLibrarySuffix
Jiyong Park374510b2018-03-19 18:23:01 +09001927 if actx.OtherModuleExists(vendorPublicLib) {
1928 nonvariantLibs = append(nonvariantLibs, vendorPublicLib)
1929 } else {
1930 // This can happen if vendor_public_library module is defined in a
1931 // namespace that isn't visible to the current module. In that case,
1932 // link to the original library.
Jiyong Park7ed9de32018-10-15 22:25:07 +09001933 nonvariantLibs = append(nonvariantLibs, name)
Jiyong Park374510b2018-03-19 18:23:01 +09001934 }
Dan Albert914449f2016-06-17 16:45:24 -07001935 } else {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001936 // put name#version back
Dan Willemsen7cbf5f82017-03-28 00:08:30 -07001937 nonvariantLibs = append(nonvariantLibs, entry)
Dan Willemsen72d39932016-07-08 23:23:48 -07001938 }
1939 }
Dan Albert914449f2016-06-17 16:45:24 -07001940 return nonvariantLibs, variantLibs
Dan Willemsen72d39932016-07-08 23:23:48 -07001941 }
1942
Inseob Kimeec88e12020-01-22 11:11:29 +09001943 deps.SharedLibs, variantNdkLibs = rewriteLibs(deps.SharedLibs)
1944 deps.LateSharedLibs, variantLateNdkLibs = rewriteLibs(deps.LateSharedLibs)
1945 deps.ReexportSharedLibHeaders, _ = rewriteLibs(deps.ReexportSharedLibHeaders)
1946 if ctx.useVndk() {
1947 for idx, lib := range deps.RuntimeLibs {
1948 deps.RuntimeLibs[idx] = rewriteVendorLibs(lib)
1949 }
1950 }
Dan Willemsen72d39932016-07-08 23:23:48 -07001951 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001952
Inseob Kimeec88e12020-01-22 11:11:29 +09001953 rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string {
1954 // only modules with BOARD_VNDK_VERSION uses snapshot.
1955 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1956 return lib
1957 }
1958
1959 if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
1960 return snapshot
1961 }
1962
1963 return lib
1964 }
1965
Jose Galmes6f843bc2020-12-11 13:36:29 -08001966 snapshotHeaderLibs := vendorSnapshotHeaderLibs(actx.Config())
1967 snapshotStaticLibs := vendorSnapshotStaticLibs(actx.Config())
1968 snapshotObjects := vendorSnapshotObjects(actx.Config())
1969
1970 if c.InRecovery() {
1971 rewriteSnapshotLibs = func(lib string, snapshotMap *snapshotMap) string {
1972 recoverySnapshotVersion :=
1973 actx.DeviceConfig().RecoverySnapshotVersion()
1974 if recoverySnapshotVersion == "current" ||
1975 recoverySnapshotVersion == "" {
1976 return lib
1977 } else if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
1978 return snapshot
1979 }
1980
1981 return lib
1982 }
1983
1984 snapshotHeaderLibs = recoverySnapshotHeaderLibs(actx.Config())
1985 snapshotStaticLibs = recoverySnapshotStaticLibs(actx.Config())
1986 snapshotObjects = recoverySnapshotObjects(actx.Config())
1987 }
1988
Colin Cross32ec36c2016-12-15 07:39:51 -08001989 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07001990 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08001991 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07001992 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08001993 }
Inseob Kimeec88e12020-01-22 11:11:29 +09001994
Jose Galmes6f843bc2020-12-11 13:36:29 -08001995 lib = rewriteSnapshotLibs(lib, snapshotHeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09001996
Jiyong Park1ad8e162020-12-01 23:40:09 +09001997 if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08001998 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07001999 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002000 } else {
2001 actx.AddVariationDependencies(nil, depTag, lib)
2002 }
2003 }
2004
Inseob Kim07def122020-11-23 14:43:02 +09002005 // sysprop_library has to support both C++ and Java. So sysprop_library internally creates one
2006 // C++ implementation library and one Java implementation library. When a module links against
2007 // sysprop_library, the C++ implementation library has to be linked. syspropImplLibraries is a
2008 // map from sysprop_library to implementation library; it will be used in whole_static_libs,
2009 // static_libs, and shared_libs.
Inseob Kimc0907f12019-02-08 21:00:45 +09002010 syspropImplLibraries := syspropImplLibraries(actx.Config())
2011
Jiyong Park5d1598f2019-02-25 22:14:17 +09002012 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002013 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09002014 if impl, ok := syspropImplLibraries[lib]; ok {
2015 lib = impl
2016 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002017
Jose Galmes6f843bc2020-12-11 13:36:29 -08002018 lib = rewriteSnapshotLibs(lib, snapshotStaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002019
Jiyong Park5d1598f2019-02-25 22:14:17 +09002020 actx.AddVariationDependencies([]blueprint.Variation{
2021 {Mutator: "link", Variation: "static"},
2022 }, depTag, lib)
2023 }
2024
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002025 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002026 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002027 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002028 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002029 }
Jiyong Parke3867542020-12-03 17:28:25 +09002030 if inList(lib, deps.ExcludeLibsForApex) {
2031 depTag.excludeInApex = true
2032 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002033
2034 if impl, ok := syspropImplLibraries[lib]; ok {
2035 lib = impl
2036 }
2037
Jose Galmes6f843bc2020-12-11 13:36:29 -08002038 lib = rewriteSnapshotLibs(lib, snapshotStaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002039
Dan Willemsen59339a22018-07-22 21:18:45 -07002040 actx.AddVariationDependencies([]blueprint.Variation{
2041 {Mutator: "link", Variation: "static"},
2042 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002043 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002044
Jooyung Han75568392020-03-20 04:29:24 +09002045 // staticUnwinderDep is treated as staticDep for Q apexes
2046 // so that native libraries/binaries are linked with static unwinder
2047 // because Q libc doesn't have unwinder APIs
2048 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002049 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002050 actx.AddVariationDependencies([]blueprint.Variation{
2051 {Mutator: "link", Variation: "static"},
Jose Galmes6f843bc2020-12-11 13:36:29 -08002052 }, depTag, rewriteSnapshotLibs(staticUnwinder(actx), snapshotStaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002053 }
2054
Inseob Kimeec88e12020-01-22 11:11:29 +09002055 for _, lib := range deps.LateStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002056 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Inseob Kimeec88e12020-01-22 11:11:29 +09002057 actx.AddVariationDependencies([]blueprint.Variation{
2058 {Mutator: "link", Variation: "static"},
Jose Galmes6f843bc2020-12-11 13:36:29 -08002059 }, depTag, rewriteSnapshotLibs(lib, snapshotStaticLibs))
Inseob Kimeec88e12020-01-22 11:11:29 +09002060 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002061
Jiyong Park7ed9de32018-10-15 22:25:07 +09002062 // shared lib names without the #version suffix
2063 var sharedLibNames []string
2064
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002065 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002066 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002067 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002068 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002069 }
Jiyong Parke3867542020-12-03 17:28:25 +09002070 if inList(lib, deps.ExcludeLibsForApex) {
2071 depTag.excludeInApex = true
2072 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002073
2074 if impl, ok := syspropImplLibraries[lib]; ok {
2075 lib = impl
2076 }
2077
Jiyong Park73c54ee2019-10-22 20:31:18 +09002078 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002079 sharedLibNames = append(sharedLibNames, name)
2080
Colin Crosse7257d22020-09-24 09:56:18 -07002081 variations := []blueprint.Variation{
2082 {Mutator: "link", Variation: "shared"},
2083 }
2084 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002085 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002086
Jiyong Park7ed9de32018-10-15 22:25:07 +09002087 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002088 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002089 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2090 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2091 // linking against both the stubs lib and the non-stubs lib at the same time.
2092 continue
2093 }
Colin Cross6e511a92020-07-27 21:26:48 -07002094 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002095 variations := []blueprint.Variation{
2096 {Mutator: "link", Variation: "shared"},
2097 }
2098 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002099 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002100
Dan Willemsen59339a22018-07-22 21:18:45 -07002101 actx.AddVariationDependencies([]blueprint.Variation{
2102 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002103 }, dataLibDepTag, deps.DataLibs...)
2104
2105 actx.AddVariationDependencies([]blueprint.Variation{
2106 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002107 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002108
Colin Cross68861832016-07-08 10:41:41 -07002109 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002110
2111 for _, gen := range deps.GeneratedHeaders {
2112 depTag := genHeaderDepTag
2113 if inList(gen, deps.ReexportGeneratedHeaders) {
2114 depTag = genHeaderExportDepTag
2115 }
2116 actx.AddDependency(c, depTag, gen)
2117 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002118
Dan Albert92fe7402020-07-15 13:33:30 -07002119 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002120 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc99deeb2016-04-11 15:06:20 -07002121 if deps.CrtBegin != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002122 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Jose Galmes6f843bc2020-12-11 13:36:29 -08002123 rewriteSnapshotLibs(deps.CrtBegin, snapshotObjects))
Colin Crossca860ac2016-01-04 14:34:37 -08002124 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002125 if deps.CrtEnd != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002126 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Jose Galmes6f843bc2020-12-11 13:36:29 -08002127 rewriteSnapshotLibs(deps.CrtEnd, snapshotObjects))
Colin Cross21b9a242015-03-24 14:15:58 -07002128 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002129 if deps.LinkerFlagsFile != "" {
2130 actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
2131 }
2132 if deps.DynamicLinker != "" {
2133 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002134 }
Dan Albert914449f2016-06-17 16:45:24 -07002135
2136 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002137
2138 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002139 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002140 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002141 {Mutator: "link", Variation: "shared"},
2142 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002143
2144 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002145 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002146 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002147 {Mutator: "link", Variation: "shared"},
2148 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002149
2150 if vndkdep := c.vndkdep; vndkdep != nil {
2151 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002152 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002153 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002154 {Mutator: "link", Variation: "shared"},
2155 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002156 }
2157 }
Colin Cross6362e272015-10-29 15:25:03 -07002158}
Colin Cross21b9a242015-03-24 14:15:58 -07002159
Colin Crosse40b4ea2018-10-02 22:25:58 -07002160func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002161 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2162 c.beginMutator(ctx)
2163 }
2164}
2165
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002166// Whether a module can link to another module, taking into
2167// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002168func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002169 tag blueprint.DependencyTag) {
2170
2171 switch t := tag.(type) {
2172 case dependencyTag:
2173 if t != vndkExtDepTag {
2174 return
2175 }
2176 case libraryDependencyTag:
2177 default:
2178 return
2179 }
2180
Ivan Lozanof9e21722020-12-02 09:00:51 -05002181 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002182 // Host code is not restricted
2183 return
2184 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002185
2186 // VNDK is cc.Module supported only for now.
2187 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002188 // Though allowed dependency is limited by the image mutator,
2189 // each vendor and product module needs to check link-type
2190 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002191 if ccTo, ok := to.(*Module); ok {
2192 if ccFrom.vndkdep != nil {
2193 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2194 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05002195 } else if linkableMod, ok := to.(LinkableInterface); ok {
2196 // Static libraries from other languages can be linked
2197 if !linkableMod.Static() {
2198 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
2199 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002200 } else {
2201 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002202 }
2203 return
2204 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002205 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002206 // Platform code can link to anything
2207 return
2208 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002209 if from.InRamdisk() {
2210 // Ramdisk code is not NDK
2211 return
2212 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002213 if from.InVendorRamdisk() {
2214 // Vendor ramdisk code is not NDK
2215 return
2216 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002217 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002218 // Recovery code is not NDK
2219 return
2220 }
Colin Cross31076b32020-10-23 17:22:06 -07002221 if c, ok := to.(*Module); ok {
2222 if c.ToolchainLibrary() {
2223 // These are always allowed
2224 return
2225 }
2226 if c.NdkPrebuiltStl() {
2227 // These are allowed, but they don't set sdk_version
2228 return
2229 }
2230 if c.StubDecorator() {
2231 // These aren't real libraries, but are the stub shared libraries that are included in
2232 // the NDK.
2233 return
2234 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002235 }
Logan Chien834b9a62019-01-14 15:39:03 +08002236
Ivan Lozano52767be2019-10-18 14:49:46 -07002237 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002238 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2239 // to link to libc++ (non-NDK and without sdk_version).
2240 return
2241 }
2242
Ivan Lozano52767be2019-10-18 14:49:46 -07002243 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002244 // NDK code linking to platform code is never okay.
2245 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002246 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002247 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002248 }
2249
2250 // At this point we know we have two NDK libraries, but we need to
2251 // check that we're not linking against anything built against a higher
2252 // API level, as it is only valid to link against older or equivalent
2253 // APIs.
2254
Inseob Kim01a28722018-04-11 09:48:45 +09002255 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002256 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002257 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002258 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002259 // Current can't be linked against by anything else.
2260 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002261 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002262 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002263 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002264 if err != nil {
2265 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002266 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002267 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002268 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002269 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002270 if err != nil {
2271 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002272 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002273 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002274 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002275
Inseob Kim01a28722018-04-11 09:48:45 +09002276 if toApi > fromApi {
2277 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002278 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002279 }
2280 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002281 }
Dan Albert202fe492017-12-15 13:56:59 -08002282
2283 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002284 fromStl := from.SelectedStl()
2285 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002286 if fromStl == "" || toStl == "" {
2287 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002288 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002289 // We can be permissive with the system "STL" since it is only the C++
2290 // ABI layer, but in the future we should make sure that everyone is
2291 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002292 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002293 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002294 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2295 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002296 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002297}
2298
Jooyung Han479ca172020-10-19 18:51:07 +09002299func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2300 if c, ok := ctx.Module().(*Module); ok {
2301 ctx.VisitDirectDeps(func(dep android.Module) {
2302 depTag := ctx.OtherModuleDependencyTag(dep)
2303 ccDep, ok := dep.(LinkableInterface)
2304 if ok {
2305 checkLinkType(ctx, c, ccDep, depTag)
2306 }
2307 })
2308 }
2309}
2310
Jiyong Park5fb8c102018-04-09 12:03:06 +09002311// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002312// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2313// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002314// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002315func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2316 check := func(child, parent android.Module) bool {
2317 to, ok := child.(*Module)
2318 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002319 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002320 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002321
Jooyung Hana70f0672019-01-18 15:20:43 +09002322 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2323 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002324 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002325
Jiyong Park1ad8e162020-12-01 23:40:09 +09002326 depTag := ctx.OtherModuleDependencyTag(child)
2327 if IsHeaderDepTag(depTag) {
2328 return false
2329 }
2330
Justin Yun63e9ec72020-10-29 16:49:43 +09002331 // Even if target lib has no vendor variant, keep checking dependency
2332 // graph in case it depends on vendor_available or product_available
2333 // but not double_loadable transtively.
2334 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002335 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002336 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002337
Colin Cross127bb8b2020-12-16 16:46:01 -08002338 if to.isVndkSp() || to.IsLlndk() || Bool(to.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002339 return false
2340 }
2341
2342 var stringPath []string
2343 for _, m := range ctx.GetWalkPath() {
2344 stringPath = append(stringPath, m.Name())
2345 }
2346 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2347 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
2348 "(dependency: %s)", ctx.OtherModuleName(to), strings.Join(stringPath, " -> "))
2349 return false
2350 }
2351 if module, ok := ctx.Module().(*Module); ok {
2352 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Colin Cross127bb8b2020-12-16 16:46:01 -08002353 if lib.hasLLNDKStubs() || Bool(module.VendorProperties.Double_loadable) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002354 ctx.WalkDeps(check)
2355 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002356 }
2357 }
2358}
2359
Colin Cross0de8a1e2020-09-18 14:15:30 -07002360// Returns the highest version which is <= maxSdkVersion.
2361// For example, with maxSdkVersion is 10 and versionList is [9,11]
2362// it returns 9 as string. The list of stubs must be in order from
2363// oldest to newest.
Chris Parsons3c27ca32020-11-20 12:42:07 -05002364func (c *Module) chooseSdkVersion(ctx android.PathContext, stubsInfo []SharedStubLibrary,
2365 maxSdkVersion android.ApiLevel) (SharedStubLibrary, error) {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002366
2367 for i := range stubsInfo {
2368 stubInfo := stubsInfo[len(stubsInfo)-i-1]
2369 var ver android.ApiLevel
2370 if stubInfo.Version == "" {
2371 ver = android.FutureApiLevel
2372 } else {
2373 var err error
2374 ver, err = android.ApiLevelFromUser(ctx, stubInfo.Version)
2375 if err != nil {
Chris Parsons3c27ca32020-11-20 12:42:07 -05002376 return SharedStubLibrary{}, err
Colin Cross0de8a1e2020-09-18 14:15:30 -07002377 }
2378 }
2379 if ver.LessThanOrEqualTo(maxSdkVersion) {
2380 return stubInfo, nil
2381 }
2382 }
2383 var versionList []string
2384 for _, stubInfo := range stubsInfo {
2385 versionList = append(versionList, stubInfo.Version)
2386 }
Chris Parsons3c27ca32020-11-20 12:42:07 -05002387 return SharedStubLibrary{}, fmt.Errorf("not found a version(<=%s) in versionList: %v", maxSdkVersion.String(), versionList)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002388}
2389
Colin Crossc99deeb2016-04-11 15:06:20 -07002390// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002391func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002392 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002393
Colin Cross0de8a1e2020-09-18 14:15:30 -07002394 var directStaticDeps []StaticLibraryInfo
2395 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002396
Colin Cross0de8a1e2020-09-18 14:15:30 -07002397 reexportExporter := func(exporter FlagExporterInfo) {
2398 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2399 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2400 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2401 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2402 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002403 }
2404
Jooyung Hande34d232020-07-23 13:04:15 +09002405 // For the dependency from platform to apex, use the latest stubs
2406 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002407 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2408 if !apexInfo.IsForPlatform() {
2409 c.apexSdkVersion = apexInfo.MinSdkVersion(ctx)
Jooyung Hande34d232020-07-23 13:04:15 +09002410 }
2411
2412 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2413 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2414 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2415 // (b/144430859)
2416 c.apexSdkVersion = android.FutureApiLevel
2417 }
2418
Colin Crossd11fcda2017-10-23 17:59:01 -07002419 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002420 depName := ctx.OtherModuleName(dep)
2421 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002422
Ivan Lozano52767be2019-10-18 14:49:46 -07002423 ccDep, ok := dep.(LinkableInterface)
2424 if !ok {
2425
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002426 // handling for a few module types that aren't cc Module but that are also supported
2427 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002428 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002429 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002430 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2431 genRule.GeneratedSourceFiles()...)
2432 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002433 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002434 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002435 // Support exported headers from a generated_sources dependency
2436 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002437 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002438 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002439 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002440 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002441 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002442 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002443 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002444 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002445 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2446 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002447 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002448 // 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 +09002449 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002450
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002451 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002452 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002453 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002454 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002455 case linkerFlagsDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002456 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002457 files := genRule.GeneratedSourceFiles()
2458 if len(files) == 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002459 depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002460 } else if len(files) > 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002461 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 -07002462 }
2463 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002464 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002465 }
Colin Crossca860ac2016-01-04 14:34:37 -08002466 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002467 return
2468 }
2469
Colin Crossfe17f6f2019-03-28 19:30:56 -07002470 if depTag == android.ProtoPluginDepTag {
2471 return
2472 }
2473
Colin Crossd11fcda2017-10-23 17:59:01 -07002474 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002475 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2476 return
2477 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002478 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002479 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2480 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002481 return
2482 }
2483
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002484 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07002485 // Skip reused objects for stub libraries, they use their own stub object file instead.
2486 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
2487 // version mutator, so the stubs variant is created from the shared variant that
2488 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07002489 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07002490 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2491 objs := staticAnalogue.ReuseObjects
2492 depPaths.Objs = depPaths.Objs.Append(objs)
2493 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2494 reexportExporter(depExporterInfo)
2495 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002496 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002497 }
2498
Colin Cross6e511a92020-07-27 21:26:48 -07002499 linkFile := ccDep.OutputFile()
2500
2501 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2502 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002503 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002504 return
2505 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002506
Jiyong Parke3867542020-12-03 17:28:25 +09002507 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
2508 return
2509 }
2510
Colin Cross0de8a1e2020-09-18 14:15:30 -07002511 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002512
Colin Cross6e511a92020-07-27 21:26:48 -07002513 var ptr *android.Paths
2514 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002515
Colin Cross6e511a92020-07-27 21:26:48 -07002516 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002517
Colin Cross6e511a92020-07-27 21:26:48 -07002518 switch {
2519 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08002520 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
2521 if !ctx.Config().AllowMissingDependencies() {
2522 ctx.ModuleErrorf("module %q is not a header library", depName)
2523 } else {
2524 ctx.AddMissingDependencies([]string{depName})
2525 }
2526 return
2527 }
Colin Cross6e511a92020-07-27 21:26:48 -07002528 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002529 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2530 if !ctx.Config().AllowMissingDependencies() {
2531 ctx.ModuleErrorf("module %q is not a shared library", depName)
2532 } else {
2533 ctx.AddMissingDependencies([]string{depName})
2534 }
2535 return
2536 }
Jiyong Parke3867542020-12-03 17:28:25 +09002537
Colin Cross0de8a1e2020-09-18 14:15:30 -07002538 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
Chris Parsons3c27ca32020-11-20 12:42:07 -05002539 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002540
Chris Parsons3c27ca32020-11-20 12:42:07 -05002541 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002542 useStubs := false
Colin Cross31076b32020-10-23 17:22:06 -07002543
2544 if lib := moduleLibraryInterface(dep); lib.buildStubs() && c.UseVndk() { // LLNDK
Colin Cross0de8a1e2020-09-18 14:15:30 -07002545 if !apexInfo.IsForPlatform() {
2546 // For platform libraries, use current version of LLNDK
2547 // If this is for use_vendor apex we will apply the same rules
2548 // of apex sdk enforcement below to choose right version.
2549 useStubs = true
2550 }
2551 } else if apexInfo.IsForPlatform() {
2552 // If not building for APEX, use stubs only when it is from
2553 // an APEX (and not from platform)
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002554 // However, for host, ramdisk, vendor_ramdisk, recovery or bootstrap modules,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002555 // always link to non-stub variant
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09002556 useStubs = dep.(android.ApexModule).NotInPlatform() && !c.bootstrap()
Colin Cross0de8a1e2020-09-18 14:15:30 -07002557 // Another exception: if this module is bundled with an APEX, then
2558 // it is linked with the non-stub variant of a module in the APEX
2559 // as if this is part of the APEX.
2560 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
2561 for _, apexContents := range testFor.ApexContents {
2562 if apexContents.DirectlyInApex(depName) {
2563 useStubs = false
2564 break
2565 }
2566 }
2567 } else {
2568 // If building for APEX, use stubs when the parent is in any APEX that
2569 // the child is not in.
2570 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
2571 }
2572
2573 // when to use (unspecified) stubs, check min_sdk_version and choose the right one
2574 if useStubs {
2575 sharedLibraryStubsInfo, err :=
Chris Parsons3c27ca32020-11-20 12:42:07 -05002576 c.chooseSdkVersion(ctx, sharedLibraryStubsInfo.SharedStubLibraries, c.apexSdkVersion)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002577 if err != nil {
2578 ctx.OtherModuleErrorf(dep, err.Error())
2579 return
2580 }
2581 sharedLibraryInfo = sharedLibraryStubsInfo.SharedLibraryInfo
2582 depExporterInfo = sharedLibraryStubsInfo.FlagExporterInfo
2583 }
2584 }
2585
Jiyong Park1ad8e162020-12-01 23:40:09 +09002586 // Stubs lib doesn't link to the shared lib dependencies. Don't set
2587 // linkFile, depFile, and ptr.
2588 if c.IsStubs() {
2589 break
2590 }
2591
Colin Cross0de8a1e2020-09-18 14:15:30 -07002592 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2593 depFile = sharedLibraryInfo.TableOfContents
2594
Colin Cross6e511a92020-07-27 21:26:48 -07002595 ptr = &depPaths.SharedLibs
2596 switch libDepTag.Order {
2597 case earlyLibraryDependency:
2598 ptr = &depPaths.EarlySharedLibs
2599 depPtr = &depPaths.EarlySharedLibsDeps
2600 case normalLibraryDependency:
2601 ptr = &depPaths.SharedLibs
2602 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002603 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002604 case lateLibraryDependency:
2605 ptr = &depPaths.LateSharedLibs
2606 depPtr = &depPaths.LateSharedLibsDeps
2607 default:
2608 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002609 }
Colin Cross6e511a92020-07-27 21:26:48 -07002610 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002611 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2612 if !ctx.Config().AllowMissingDependencies() {
2613 ctx.ModuleErrorf("module %q is not a static library", depName)
2614 } else {
2615 ctx.AddMissingDependencies([]string{depName})
2616 }
2617 return
2618 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002619
2620 // Stubs lib doesn't link to the static 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 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2627 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002628 if libDepTag.wholeStatic {
2629 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002630 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2631 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002632 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002633 // This case normally catches prebuilt static
2634 // libraries, but it can also occur when
2635 // AllowMissingDependencies is on and the
2636 // dependencies has no sources of its own
2637 // but has a whole_static_libs dependency
2638 // on a missing library. We want to depend
2639 // on the .a file so that there is something
2640 // in the dependency tree that contains the
2641 // error rule for the missing transitive
2642 // dependency.
2643 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002644 }
Colin Cross6e511a92020-07-27 21:26:48 -07002645 } else {
2646 switch libDepTag.Order {
2647 case earlyLibraryDependency:
2648 panic(fmt.Errorf("early static libs not suppported"))
2649 case normalLibraryDependency:
2650 // static dependencies will be handled separately so they can be ordered
2651 // using transitive dependencies.
2652 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002653 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002654 case lateLibraryDependency:
2655 ptr = &depPaths.LateStaticLibs
2656 default:
2657 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002658 }
2659 }
2660 }
2661
Colin Cross6e511a92020-07-27 21:26:48 -07002662 if libDepTag.static() && !libDepTag.wholeStatic {
2663 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2664 ctx.ModuleErrorf("module %q not a static library", depName)
2665 return
2666 }
Logan Chien43d34c32017-12-20 01:17:32 +08002667
Colin Cross6e511a92020-07-27 21:26:48 -07002668 // When combining coverage files for shared libraries and executables, coverage files
2669 // in static libraries act as if they were whole static libraries. The same goes for
2670 // source based Abi dump files.
2671 if c, ok := ccDep.(*Module); ok {
2672 staticLib := c.linker.(libraryInterface)
2673 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2674 staticLib.objs().coverageFiles...)
2675 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2676 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002677 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002678 // Handle non-CC modules here
2679 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002680 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002681 }
2682 }
2683
Colin Cross6e511a92020-07-27 21:26:48 -07002684 if ptr != nil {
2685 if !linkFile.Valid() {
2686 if !ctx.Config().AllowMissingDependencies() {
2687 ctx.ModuleErrorf("module %q missing output file", depName)
2688 } else {
2689 ctx.AddMissingDependencies([]string{depName})
2690 }
2691 return
2692 }
2693 *ptr = append(*ptr, linkFile.Path())
2694 }
2695
2696 if depPtr != nil {
2697 dep := depFile
2698 if !dep.Valid() {
2699 dep = linkFile
2700 }
2701 *depPtr = append(*depPtr, dep.Path())
2702 }
2703
Colin Cross0de8a1e2020-09-18 14:15:30 -07002704 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2705 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2706 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2707 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2708
2709 if libDepTag.reexportFlags {
2710 reexportExporter(depExporterInfo)
2711 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2712 // Re-exported shared library headers must be included as well since they can help us with type information
2713 // about template instantiations (instantiated from their headers).
2714 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2715 // scripts.
2716 c.sabi.Properties.ReexportedIncludes = append(
2717 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2718 }
2719
Colin Cross6e511a92020-07-27 21:26:48 -07002720 makeLibName := c.makeLibName(ctx, ccDep, depName) + libDepTag.makeSuffix
2721 switch {
2722 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002723 c.Properties.AndroidMkHeaderLibs = append(
2724 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002725 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07002726 if lib := moduleLibraryInterface(dep); lib != nil {
2727 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002728 // Add the dependency to the APEX(es) providing the library so that
2729 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002730 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
2731 for _, an := range depApexInfo.InApexes {
Colin Cross6e511a92020-07-27 21:26:48 -07002732 c.Properties.ApexesProvidingSharedLibs = append(
2733 c.Properties.ApexesProvidingSharedLibs, an)
2734 }
2735 }
2736 }
2737
2738 // Note: the order of libs in this list is not important because
2739 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002740 c.Properties.AndroidMkSharedLibs = append(
2741 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002742 // Record baseLibName for snapshots.
2743 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, baseLibName(depName))
2744 case libDepTag.static():
2745 if libDepTag.wholeStatic {
2746 c.Properties.AndroidMkWholeStaticLibs = append(
2747 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2748 } else {
2749 c.Properties.AndroidMkStaticLibs = append(
2750 c.Properties.AndroidMkStaticLibs, makeLibName)
2751 }
2752 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002753 } else if !c.IsStubs() {
2754 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
2755
Colin Cross6e511a92020-07-27 21:26:48 -07002756 switch depTag {
2757 case runtimeDepTag:
2758 c.Properties.AndroidMkRuntimeLibs = append(
2759 c.Properties.AndroidMkRuntimeLibs, c.makeLibName(ctx, ccDep, depName)+libDepTag.makeSuffix)
2760 // Record baseLibName for snapshots.
2761 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, baseLibName(depName))
2762 case objDepTag:
2763 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2764 case CrtBeginDepTag:
2765 depPaths.CrtBegin = linkFile
2766 case CrtEndDepTag:
2767 depPaths.CrtEnd = linkFile
2768 case dynamicLinkerDepTag:
2769 depPaths.DynamicLinker = linkFile
2770 }
Jiyong Park27b188b2017-07-18 13:23:39 +09002771 }
Colin Crossca860ac2016-01-04 14:34:37 -08002772 })
2773
Jeff Gaston294356f2017-09-27 17:05:30 -07002774 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07002775 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
2776 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
2777 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07002778
Colin Crossdd84e052017-05-17 13:44:16 -07002779 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07002780 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09002781 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
2782 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09002783 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09002784 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
2785 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07002786 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09002787 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09002788 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002789
2790 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09002791 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002792 }
Colin Crossdd84e052017-05-17 13:44:16 -07002793
Colin Crossca860ac2016-01-04 14:34:37 -08002794 return depPaths
2795}
2796
Colin Cross0de8a1e2020-09-18 14:15:30 -07002797// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
2798// to match the topological order of the dependency tree, including any static analogues of
2799// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
2800// of the transitive dependencies.
2801func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
2802 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
2803 var staticPaths android.Paths
2804 for _, staticDep := range staticDeps {
2805 staticPaths = append(staticPaths, staticDep.StaticLibrary)
2806 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
2807 }
2808 for _, sharedDep := range sharedDeps {
2809 if sharedDep.StaticAnalogue != nil {
2810 transitiveStaticLibsBuilder.Transitive(sharedDep.StaticAnalogue.TransitiveStaticLibrariesForOrdering)
2811 }
2812 }
2813 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
2814
2815 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
2816
2817 // reorder the dependencies based on transitive dependencies
2818 staticPaths = android.FirstUniquePaths(staticPaths)
2819 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
2820
2821 if len(orderedStaticPaths) != len(staticPaths) {
2822 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
2823 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
2824 }
2825
2826 return orderedStaticPaths, transitiveStaticLibs
2827}
2828
Colin Cross6e511a92020-07-27 21:26:48 -07002829// baseLibName trims known prefixes and suffixes
2830func baseLibName(depName string) string {
2831 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
2832 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00002833 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07002834 return libName
2835}
2836
2837func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, depName string) string {
2838 vendorSuffixModules := vendorSuffixModules(ctx.Config())
Jose Galmes6f843bc2020-12-11 13:36:29 -08002839 recoverySuffixModules := recoverySuffixModules(ctx.Config())
Colin Cross6e511a92020-07-27 21:26:48 -07002840 vendorPublicLibraries := vendorPublicLibraries(ctx.Config())
2841
2842 libName := baseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08002843 ccDepModule, _ := ccDep.(*Module)
2844 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Colin Cross6e511a92020-07-27 21:26:48 -07002845 isVendorPublicLib := inList(libName, *vendorPublicLibraries)
2846 bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk
2847
2848 if c, ok := ccDep.(*Module); ok {
2849 // Use base module name for snapshots when exporting to Makefile.
2850 if c.isSnapshotPrebuilt() {
2851 baseName := c.BaseModuleName()
2852
2853 if c.IsVndk() {
2854 return baseName + ".vendor"
2855 }
2856
Ivan Lozano3968d8f2020-12-14 11:27:52 -05002857 if c.InVendor() && vendorSuffixModules[baseName] {
Colin Cross6e511a92020-07-27 21:26:48 -07002858 return baseName + ".vendor"
Jose Galmes6f843bc2020-12-11 13:36:29 -08002859 } else if c.InRecovery() && recoverySuffixModules[baseName] {
2860 return baseName + ".recovery"
Colin Cross6e511a92020-07-27 21:26:48 -07002861 } else {
2862 return baseName
2863 }
2864 }
2865 }
2866
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002867 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
2868 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07002869 // The vendor module is a no-vendor-variant VNDK library. Depend on the
2870 // core module instead.
2871 return libName
2872 } else if c.UseVndk() && bothVendorAndCoreVariantsExist {
2873 // The vendor module in Make will have been renamed to not conflict with the core
2874 // module, so update the dependency name here accordingly.
2875 return libName + c.getNameSuffixWithVndkVersion(ctx)
2876 } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
2877 return libName + vendorPublicLibrarySuffix
2878 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
2879 return libName + ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002880 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
2881 return libName + vendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07002882 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
2883 return libName + recoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05002884 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Colin Cross6e511a92020-07-27 21:26:48 -07002885 return libName + nativeBridgeSuffix
2886 } else {
2887 return libName
2888 }
2889}
2890
Colin Crossca860ac2016-01-04 14:34:37 -08002891func (c *Module) InstallInData() bool {
2892 if c.installer == nil {
2893 return false
2894 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002895 return c.installer.inData()
2896}
2897
2898func (c *Module) InstallInSanitizerDir() bool {
2899 if c.installer == nil {
2900 return false
2901 }
2902 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07002903 return true
2904 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002905 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08002906}
2907
Yifan Hong1b3348d2020-01-21 15:53:22 -08002908func (c *Module) InstallInRamdisk() bool {
2909 return c.InRamdisk()
2910}
2911
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002912func (c *Module) InstallInVendorRamdisk() bool {
2913 return c.InVendorRamdisk()
2914}
2915
Jiyong Parkf9332f12018-02-01 00:54:12 +09002916func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07002917 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09002918}
2919
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002920func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002921 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002922 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002923 return
2924 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01002925 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01002926}
2927
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07002928func (c *Module) HostToolPath() android.OptionalPath {
2929 if c.installer == nil {
2930 return android.OptionalPath{}
2931 }
2932 return c.installer.hostToolPath()
2933}
2934
Nan Zhangd4e641b2017-07-12 12:55:28 -07002935func (c *Module) IntermPathForModuleOut() android.OptionalPath {
2936 return c.outputFile
2937}
2938
Colin Cross41955e82019-05-29 14:40:35 -07002939func (c *Module) OutputFiles(tag string) (android.Paths, error) {
2940 switch tag {
2941 case "":
2942 if c.outputFile.Valid() {
2943 return android.Paths{c.outputFile.Path()}, nil
2944 }
2945 return android.Paths{}, nil
2946 default:
2947 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002948 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07002949}
2950
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00002951func (c *Module) static() bool {
2952 if static, ok := c.linker.(interface {
2953 static() bool
2954 }); ok {
2955 return static.static()
2956 }
2957 return false
2958}
2959
Jiyong Park379de2f2018-12-19 02:47:14 +09002960func (c *Module) staticBinary() bool {
2961 if static, ok := c.linker.(interface {
2962 staticBinary() bool
2963 }); ok {
2964 return static.staticBinary()
2965 }
2966 return false
2967}
2968
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07002969func (c *Module) testBinary() bool {
2970 if test, ok := c.linker.(interface {
2971 testBinary() bool
2972 }); ok {
2973 return test.testBinary()
2974 }
2975 return false
2976}
2977
Ivan Lozano3968d8f2020-12-14 11:27:52 -05002978// Header returns true if the module is a header-only variant. (See cc/library.go header()).
2979func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09002980 if h, ok := c.linker.(interface {
2981 header() bool
2982 }); ok {
2983 return h.header()
2984 }
2985 return false
2986}
2987
Inseob Kim7f283f42020-06-01 21:53:49 +09002988func (c *Module) binary() bool {
2989 if b, ok := c.linker.(interface {
2990 binary() bool
2991 }); ok {
2992 return b.binary()
2993 }
2994 return false
2995}
2996
Inseob Kim1042d292020-06-01 23:23:05 +09002997func (c *Module) object() bool {
2998 if o, ok := c.linker.(interface {
2999 object() bool
3000 }); ok {
3001 return o.object()
3002 }
3003 return false
3004}
3005
Ivan Lozanof9e21722020-12-02 09:00:51 -05003006func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003007 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003008 if c.IsLlndk() {
3009 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003010 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003011 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003012 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003013 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003014 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003015 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003016 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003017 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003018 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003019 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003020 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003021 return "native:product"
3022 }
Jooyung Han38002912019-05-16 04:01:54 +09003023 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003024 } else if c.InRamdisk() {
3025 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003026 } else if c.InVendorRamdisk() {
3027 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003028 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003029 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003030 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003031 return "native:ndk:none:none"
3032 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3033 //family, link := getNdkStlFamilyAndLinkType(c)
3034 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003035 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003036 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003037 } else {
3038 return "native:platform"
3039 }
3040}
3041
Jiyong Park9d452992018-10-03 00:38:19 +09003042// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003043// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003044func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003045 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003046 // Stub libs and prebuilt libs in a versioned SDK are not
3047 // installable to APEX even though they are shared libs.
Colin Cross31076b32020-10-23 17:22:06 -07003048 return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01003049 } else if _, ok := c.linker.(testPerSrc); ok {
3050 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003051 }
3052 return false
3053}
3054
Jiyong Parka90ca002019-10-07 15:47:24 +09003055func (c *Module) AvailableFor(what string) bool {
3056 if linker, ok := c.linker.(interface {
3057 availableFor(string) bool
3058 }); ok {
3059 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3060 } else {
3061 return c.ApexModuleBase.AvailableFor(what)
3062 }
3063}
3064
Jiyong Park62304bb2020-04-13 16:19:48 +09003065func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003066 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003067}
3068
Colin Crossaede88c2020-08-11 12:17:01 -07003069func (c *Module) UniqueApexVariations() bool {
3070 if u, ok := c.compiler.(interface {
3071 uniqueApexVariations() bool
3072 }); ok {
3073 return u.uniqueApexVariations()
3074 } else {
3075 return false
3076 }
3077}
3078
Paul Duffin0cb37b92020-03-04 14:52:46 +00003079// Return true if the module is ever installable.
3080func (c *Module) EverInstallable() bool {
3081 return c.installer != nil &&
3082 // Check to see whether the module is actually ever installable.
3083 c.installer.everInstallable()
3084}
3085
Colin Cross56a83212020-09-15 18:30:11 -07003086func (c *Module) installable(apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003087 ret := c.EverInstallable() &&
3088 // Check to see whether the module has been configured to not be installed.
3089 proptools.BoolDefault(c.Properties.Installable, true) &&
3090 !c.Properties.PreventInstall && c.outputFile.Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003091
3092 // The platform variant doesn't need further condition. Apex variants however might not
3093 // be installable because it will likely to be included in the APEX and won't appear
3094 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003095 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003096 return ret
3097 }
3098
3099 // Special case for modules that are configured to be installed to /data, which includes
3100 // test modules. For these modules, both APEX and non-APEX variants are considered as
3101 // installable. This is because even the APEX variants won't be included in the APEX, but
3102 // will anyway be installed to /data/*.
3103 // See b/146995717
3104 if c.InstallInData() {
3105 return ret
3106 }
3107
3108 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003109}
3110
Logan Chien41eabe62019-04-10 13:33:58 +08003111func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3112 if c.linker != nil {
3113 if library, ok := c.linker.(*libraryDecorator); ok {
3114 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3115 }
3116 }
3117}
3118
Jiyong Park45bf82e2020-12-15 22:29:02 +09003119var _ android.ApexModule = (*Module)(nil)
3120
3121// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003122func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003123 depTag := ctx.OtherModuleDependencyTag(dep)
3124 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3125
3126 if cc, ok := dep.(*Module); ok {
3127 if cc.HasStubsVariants() {
3128 if isLibDepTag && libDepTag.shared() {
3129 // dynamic dep to a stubs lib crosses APEX boundary
3130 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003131 }
Colin Cross6e511a92020-07-27 21:26:48 -07003132 if IsRuntimeDepTag(depTag) {
3133 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003134 return false
3135 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003136 }
Colin Crossaac32222020-07-29 12:51:56 -07003137 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003138 // shared_lib dependency from a static lib is considered as crossing
3139 // the APEX boundary because the dependency doesn't actually is
3140 // linked; the dependency is used only during the compilation phase.
3141 return false
3142 }
Jiyong Parke3867542020-12-03 17:28:25 +09003143
3144 if isLibDepTag && libDepTag.excludeInApex {
3145 return false
3146 }
Colin Cross6e511a92020-07-27 21:26:48 -07003147 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003148 if depTag == stubImplDepTag || depTag == llndkStubDepTag {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003149 // We don't track beyond LLNDK or from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003150 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003151 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003152 if depTag == staticVariantTag {
3153 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3154 // actually mean that the static lib (and its dependencies) are copied into the
3155 // APEX.
3156 return false
3157 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003158 return true
3159}
3160
Jiyong Park45bf82e2020-12-15 22:29:02 +09003161// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003162func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3163 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003164 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3165 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3166 return nil
3167 }
3168 // b/154569636: set min_sdk_version correctly for toolchain_libraries
3169 if c.ToolchainLibrary() {
3170 return nil
3171 }
3172 // We don't check for prebuilt modules
3173 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3174 return nil
3175 }
3176 minSdkVersion := c.MinSdkVersion()
3177 if minSdkVersion == "apex_inherit" {
3178 return nil
3179 }
3180 if minSdkVersion == "" {
3181 // JNI libs within APK-in-APEX fall into here
3182 // Those are okay to set sdk_version instead
3183 // We don't have to check if this is a SDK variant because
3184 // non-SDK variant resets sdk_version, which works too.
3185 minSdkVersion = c.SdkVersion()
3186 }
Dan Albertc8060532020-07-22 22:32:17 -07003187 if minSdkVersion == "" {
3188 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3189 }
3190 // Not using nativeApiLevelFromUser because the context here is not
3191 // necessarily a native context.
3192 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003193 if err != nil {
3194 return err
3195 }
Dan Albertc8060532020-07-22 22:32:17 -07003196
3197 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003198 return fmt.Errorf("newer SDK(%v)", ver)
3199 }
3200 return nil
3201}
3202
Colin Cross2ba19d92015-05-07 15:44:20 -07003203//
Colin Crosscfad1192015-11-02 16:43:11 -08003204// Defaults
3205//
Colin Crossca860ac2016-01-04 14:34:37 -08003206type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07003207 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07003208 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09003209 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08003210}
3211
Patrice Arrudac249c712019-03-19 17:00:29 -07003212// cc_defaults provides a set of properties that can be inherited by other cc
3213// modules. A module can use the properties from a cc_defaults using
3214// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3215// merged (when possible) by prepending the default module's values to the
3216// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003217func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003218 return DefaultsFactory()
3219}
3220
Colin Cross36242852017-06-23 15:06:31 -07003221func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003222 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003223
Colin Cross36242852017-06-23 15:06:31 -07003224 module.AddProperties(props...)
3225 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003226 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003227 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003228 &BaseCompilerProperties{},
3229 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003230 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003231 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003232 &StaticProperties{},
3233 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003234 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003235 &BinaryLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003236 &TestProperties{},
3237 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003238 &BenchmarkProperties{},
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -07003239 &FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003240 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003241 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003242 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003243 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003244 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003245 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003246 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003247 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003248 &LTOProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003249 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003250 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003251 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3252 &RustBindgenClangProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003253 )
Colin Crosscfad1192015-11-02 16:43:11 -08003254
Jooyung Hancc372c52019-09-25 15:18:44 +09003255 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003256
3257 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003258}
3259
Jiyong Park2286afd2020-06-16 21:58:53 +09003260func (c *Module) IsSdkVariant() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07003261 return c.Properties.IsSdkVariant || c.AlwaysSdk()
Jiyong Park2286afd2020-06-16 21:58:53 +09003262}
3263
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003264func kytheExtractAllFactory() android.Singleton {
3265 return &kytheExtractAllSingleton{}
3266}
3267
3268type kytheExtractAllSingleton struct {
3269}
3270
3271func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3272 var xrefTargets android.Paths
3273 ctx.VisitAllModules(func(module android.Module) {
3274 if ccModule, ok := module.(xref); ok {
3275 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3276 }
3277 })
3278 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3279 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003280 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003281 }
3282}
3283
Colin Cross06a931b2015-10-28 17:23:31 -07003284var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003285var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003286var BoolPtr = proptools.BoolPtr
3287var String = proptools.String
3288var StringPtr = proptools.StringPtr