blob: afa6bf9b11be4914f9d9b970e14f201b965bb874 [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
Jiyong Parkb35a8192020-08-10 15:59:36 +0900259 // The API level that this module is built against. The APIs of this API level will be
260 // visible at build time, but use of any APIs newer than min_sdk_version will render the
261 // module unloadable on older devices. In the future it will be possible to weakly-link new
262 // APIs, making the behavior match Java: such modules will load on older devices, but
263 // calling new APIs on devices that do not support them will result in a crash.
264 //
265 // This property has the same behavior as sdk_version does for Java modules. For those
266 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
267 // does for Java code.
268 //
269 // In addition, setting this property causes two variants to be built, one for the platform
270 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800271 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700272
Jiyong Parkb35a8192020-08-10 15:59:36 +0900273 // Minimum OS API level supported by this C or C++ module. This property becomes the value
274 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
275 // this property is also used to ensure that the min_sdk_version of the containing module is
276 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
277 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
278 // min_sdk_version of the containing APEX. When the module
279 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900280 Min_sdk_version *string
281
Colin Crossc511bc52020-04-07 16:50:32 +0000282 // If true, always create an sdk variant and don't create a platform variant.
283 Sdk_variant_only *bool
284
Jiyong Parkde866cb2018-12-07 23:08:36 +0900285 AndroidMkSharedLibs []string `blueprint:"mutated"`
286 AndroidMkStaticLibs []string `blueprint:"mutated"`
287 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
288 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700289 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900290 HideFromMake bool `blueprint:"mutated"`
291 PreventInstall bool `blueprint:"mutated"`
292 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700293
Yo Chiang219968c2020-09-22 18:45:04 +0800294 // Set by DepsMutator.
295 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
296
Justin Yun5f7f7e82019-11-18 19:52:14 +0900297 ImageVariationPrefix string `blueprint:"mutated"`
298 VndkVersion string `blueprint:"mutated"`
299 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800300
301 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
302 // file
303 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900304
Yifan Hong39143a92020-10-26 12:43:12 -0700305 // Make this module available when building for ramdisk.
306 // On device without a dedicated recovery partition, the module is only
307 // available after switching root into
308 // /first_stage_ramdisk. To expose the module before switching root, install
309 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800310 Ramdisk_available *bool
311
Yifan Hong39143a92020-10-26 12:43:12 -0700312 // Make this module available when building for vendor ramdisk.
313 // On device without a dedicated recovery partition, the module is only
314 // available after switching root into
315 // /first_stage_ramdisk. To expose the module before switching root, install
316 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700317 Vendor_ramdisk_available *bool
318
Jiyong Parkf9332f12018-02-01 00:54:12 +0900319 // Make this module available when building for recovery
320 Recovery_available *bool
321
Colin Crossae6c5202019-11-20 13:35:50 -0800322 // Set by imageMutator
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700323 CoreVariantNeeded bool `blueprint:"mutated"`
324 RamdiskVariantNeeded bool `blueprint:"mutated"`
325 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
326 RecoveryVariantNeeded bool `blueprint:"mutated"`
327 ExtraVariants []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900328
329 // Allows this module to use non-APEX version of libraries. Useful
330 // for building binaries that are started before APEXes are activated.
331 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900332
333 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
334 // see soong/cc/config/vndk.go
335 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900336
337 // Used by vendor snapshot to record dependencies from snapshot modules.
338 SnapshotSharedLibs []string `blueprint:"mutated"`
339 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000340
341 Installable *bool
Colin Crossc511bc52020-04-07 16:50:32 +0000342
343 // Set by factories of module types that can only be referenced from variants compiled against
344 // the SDK.
345 AlwaysSdk bool `blueprint:"mutated"`
346
347 // Variant is an SDK variant created by sdkMutator
348 IsSdkVariant bool `blueprint:"mutated"`
349 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
350 // variant to have a ".sdk" suffix.
351 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700352
353 // Normally Soong uses the directory structure to decide which modules
354 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800355 // different snapshots (vendor, recovery, etc.), but this property
356 // allows a partner to exclude a module normally thought of as a
357 // framework module from the vendor snapshot.
358 Exclude_from_vendor_snapshot *bool
359
360 // Normally Soong uses the directory structure to decide which modules
361 // should be included (framework) or excluded (non-framework) from the
362 // different snapshots (vendor, recovery, etc.), but this property
363 // allows a partner to exclude a module normally thought of as a
364 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800365 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900366
367 // List of APEXes that this module has private access to for testing purpose. The module
368 // can depend on libraries that are not exported by the APEXes and use private symbols
369 // from the exported libraries.
370 Test_for []string
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700371}
372
373type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900374 // whether this module should be allowed to be directly depended by other
375 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900376 // If set to true, two variants will be built separately, one like
377 // normal, and the other limited to the set of libraries and headers
378 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700379 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900380 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700381 // so it shouldn't have any unversioned runtime dependencies, or
382 // make assumptions about the system that may not be true in the
383 // future.
384 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900385 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900386 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900387 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900388 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900389 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700390 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
391 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900392
Justin Yunebcf0c52021-01-08 18:00:19 +0900393 // This is the same as the "vendor_available" except that the install path
394 // of the vendor variant is /odm or /vendor/odm.
395 // By replacing "vendor_available: true" with "odm_available: true", the
396 // module will install its vendor variant to the /odm partition or /vendor/odm.
397 // As the modules with "odm_available: true" still create the vendor variants,
398 // they can link to the other vendor modules as the vendor_available modules do.
399 // Also, the vendor modules can link to odm_available modules.
400 //
401 // It may not be used for VNDK modules.
402 Odm_available *bool
403
Justin Yun63e9ec72020-10-29 16:49:43 +0900404 // whether this module should be allowed to be directly depended by other
405 // modules with `product_specific: true` or `product_available: true`.
406 // If set to true, an additional product variant will be built separately
407 // that is limited to the set of libraries and headers that are exposed to
408 // /product modules.
409 //
410 // The product variant may be used with a different (newer) /system,
411 // so it shouldn't have any unversioned runtime dependencies, or
412 // make assumptions about the system that may not be true in the
413 // future.
414 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900415 // If set to false, this module becomes inaccessible from /product modules.
416 //
417 // Different from the 'vendor_available' property, the modules with
418 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
419 // library without 'product_available' may not be depended on by any other
420 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900421 //
422 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
423 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
424 Product_available *bool
425
Jiyong Park5fb8c102018-04-09 12:03:06 +0900426 // whether this module is capable of being loaded with other instance
427 // (possibly an older version) of the same module in the same process.
428 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
429 // can be double loaded in a vendor process if the library is also a
430 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
431 // explicitly marked as `double_loadable: true` by the owner, or the dependency
432 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
433 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800434
435 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
436 IsLLNDK bool `blueprint:"mutated"`
437
Colin Cross78212242021-01-06 14:51:30 -0800438 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
439 // set and the module is not listed in VndkMustUseVendorVariantList.
440 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
441
442 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
443 IsVNDKCore bool `blueprint:"mutated"`
444
445 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
446 IsVNDKSP bool `blueprint:"mutated"`
447
448 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
449 // module sets the llndk.private property.
450 IsVNDKPrivate bool `blueprint:"mutated"`
451
452 // IsVNDKProduct is set if a VNDK module sets the product_available property.
453 IsVNDKProduct bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800454}
455
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500456// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
457// to understanding details about the type of the current module.
458// For example, one might call these functions to determine whether the current module is a static
459// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800460type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800461 static() bool
462 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700463 testBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900464 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900465 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900466 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700467 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900468 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700469 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800470 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900471 minSdkVersion() string
472 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700473 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700474 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800475 IsLlndk() bool
476 IsLlndkPublic() bool
477 isImplementationForLLNDKPublic() bool
478 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900479 isVndk() bool
480 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500481 IsVndkExt() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900482 inProduct() bool
483 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800484 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700485 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900486 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700487 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700488 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800489 getVndkExtendsModuleName() string
Yi Kong7e53c572018-02-14 18:16:12 +0800490 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800491 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800492 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800493 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700494 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700495 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900496 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800497 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700498 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700499 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800500 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800501 isCfiAssemblySupportEnabled() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800502}
503
504type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700505 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800506 ModuleContextIntf
507}
508
509type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700510 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800511 ModuleContextIntf
512}
513
Colin Cross37047f12016-12-13 17:06:13 -0800514type DepsContext interface {
515 android.BottomUpMutatorContext
516 ModuleContextIntf
517}
518
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500519// feature represents additional (optional) steps to building cc-related modules, such as invocation
520// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800521type feature interface {
522 begin(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800523 deps(ctx DepsContext, deps Deps) Deps
Colin Crossca860ac2016-01-04 14:34:37 -0800524 flags(ctx ModuleContext, flags Flags) Flags
525 props() []interface{}
526}
527
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500528// compiler is the interface for a compiler helper object. Different module decorators may implement
529// this helper differently. For example, compiling a `cc_library` may use a different build
530// statement than building a `toolchain_library`.
Colin Crossca860ac2016-01-04 14:34:37 -0800531type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700532 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800533 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800534 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700535 compilerProps() []interface{}
536
Colin Cross76fada02016-07-27 10:31:13 -0700537 appendCflags([]string)
538 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700539 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800540}
541
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500542// linker is the interface for a linker decorator object. Individual module types can provide
543// their own implementation for this decorator, and thus specify custom logic regarding build
544// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800545type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700546 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800547 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700548 linkerFlags(ctx ModuleContext, flags Flags) Flags
549 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800550 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700551
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700552 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700553 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900554 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700555
556 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900557 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000558
559 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000560 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
561}
562
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500563// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000564type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500565 sharedLibs []string
566 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
567 // libc, libm, etc.)
568 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800569}
570
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500571// installer is the interface for an installer helper object. This helper is responsible for
572// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800573type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700574 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700575 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000576 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800577 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700578 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700579 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900580 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100581 makeUninstallable(mod *Module)
Colin Crossca860ac2016-01-04 14:34:37 -0800582}
583
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800584type xref interface {
585 XrefCcFiles() android.Paths
586}
587
Colin Cross6e511a92020-07-27 21:26:48 -0700588type libraryDependencyKind int
589
590const (
591 headerLibraryDependency = iota
592 sharedLibraryDependency
593 staticLibraryDependency
594)
595
596func (k libraryDependencyKind) String() string {
597 switch k {
598 case headerLibraryDependency:
599 return "headerLibraryDependency"
600 case sharedLibraryDependency:
601 return "sharedLibraryDependency"
602 case staticLibraryDependency:
603 return "staticLibraryDependency"
604 default:
605 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
606 }
607}
608
609type libraryDependencyOrder int
610
611const (
612 earlyLibraryDependency = -1
613 normalLibraryDependency = 0
614 lateLibraryDependency = 1
615)
616
617func (o libraryDependencyOrder) String() string {
618 switch o {
619 case earlyLibraryDependency:
620 return "earlyLibraryDependency"
621 case normalLibraryDependency:
622 return "normalLibraryDependency"
623 case lateLibraryDependency:
624 return "lateLibraryDependency"
625 default:
626 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
627 }
628}
629
630// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
631// tags that have a set of predefined tag objects that are reused for each dependency, a
632// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
633// That means that comparing a libraryDependencyTag for equality will only be equal if all
634// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
635// then check individual metadata fields instead.
636type libraryDependencyTag struct {
637 blueprint.BaseDependencyTag
638
639 // These are exported so that fmt.Printf("%#v") can call their String methods.
640 Kind libraryDependencyKind
641 Order libraryDependencyOrder
642
643 wholeStatic bool
644
645 reexportFlags bool
646 explicitlyVersioned bool
647 dataLib bool
648 ndk bool
649
650 staticUnwinder bool
651
652 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900653
Cindy Zhou18417cb2020-12-10 07:12:38 -0800654 // Whether or not this dependency should skip the apex dependency check
655 skipApexAllowedDependenciesCheck bool
656
Jiyong Parke3867542020-12-03 17:28:25 +0900657 // Whether or not this dependency has to be followed for the apex variants
658 excludeInApex bool
Colin Cross6e511a92020-07-27 21:26:48 -0700659}
660
661// header returns true if the libraryDependencyTag is tagging a header lib dependency.
662func (d libraryDependencyTag) header() bool {
663 return d.Kind == headerLibraryDependency
664}
665
666// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
667func (d libraryDependencyTag) shared() bool {
668 return d.Kind == sharedLibraryDependency
669}
670
671// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
672func (d libraryDependencyTag) static() bool {
673 return d.Kind == staticLibraryDependency
674}
675
Colin Crosse9fe2942020-11-10 18:12:15 -0800676// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
677// binaries or other shared libraries are installed as dependencies.
678func (d libraryDependencyTag) InstallDepNeeded() bool {
679 return d.shared()
680}
681
682var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
683
684// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700685// libraryDependencyTag. Each tag object is created globally and reused for multiple
686// dependencies (although since the object contains no references, assigning a tag to a
687// variable and modifying it will not modify the original). Users can compare the tag
688// returned by ctx.OtherModuleDependencyTag against the global original
689type dependencyTag struct {
690 blueprint.BaseDependencyTag
691 name string
692}
693
Colin Crosse9fe2942020-11-10 18:12:15 -0800694// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
695// libraryDependencyTag, but where the dependency needs to be installed when the parent is
696// installed.
697type installDependencyTag struct {
698 blueprint.BaseDependencyTag
699 android.InstallAlwaysNeededDependencyTag
700 name string
701}
702
Colin Crossc99deeb2016-04-11 15:06:20 -0700703var (
Colin Cross6e511a92020-07-27 21:26:48 -0700704 genSourceDepTag = dependencyTag{name: "gen source"}
705 genHeaderDepTag = dependencyTag{name: "gen header"}
706 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
707 objDepTag = dependencyTag{name: "obj"}
708 linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900709 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700710 reuseObjTag = dependencyTag{name: "reuse objects"}
711 staticVariantTag = dependencyTag{name: "static variant"}
712 vndkExtDepTag = dependencyTag{name: "vndk extends"}
713 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800714 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700715 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700716 stubImplDepTag = dependencyTag{name: "stub_impl"}
Colin Cross127bb8b2020-12-16 16:46:01 -0800717 llndkStubDepTag = dependencyTag{name: "llndk stub"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700718)
719
Colin Cross56a83212020-09-15 18:30:11 -0700720type copyDirectlyInAnyApexDependencyTag dependencyTag
721
722func (copyDirectlyInAnyApexDependencyTag) CopyDirectlyInAnyApex() {}
723
724var _ android.CopyDirectlyInAnyApexTag = copyDirectlyInAnyApexDependencyTag{}
725
Roland Levillainf89cd092019-07-29 16:22:59 +0100726func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700727 ccLibDepTag, ok := depTag.(libraryDependencyTag)
728 return ok && ccLibDepTag.shared()
729}
730
731func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
732 ccLibDepTag, ok := depTag.(libraryDependencyTag)
733 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100734}
735
Zach Johnson3df4e632020-11-06 11:56:27 -0800736func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
737 ccLibDepTag, ok := depTag.(libraryDependencyTag)
738 return ok && ccLibDepTag.header()
739}
740
Roland Levillainf89cd092019-07-29 16:22:59 +0100741func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800742 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100743}
744
745func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700746 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100747 return ok && ccDepTag == testPerSrcDepTag
748}
749
Colin Crossca860ac2016-01-04 14:34:37 -0800750// Module contains the properties and members used by all C/C++ module types, and implements
751// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500752// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
753// interface.
754//
755// To define a C/C++ related module, construct a new Module object and point its delegates to
756// type-specific structs. These delegates will be invoked to register module-specific build
757// statements which may be unique to the module type. For example, module.compiler.compile() should
758// be defined so as to register build statements which are responsible for compiling the module.
759//
760// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
761// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
762// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
763// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800764type Module struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700765 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -0700766 android.DefaultableModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +0900767 android.ApexModuleBase
Jiyong Parkd1063c12019-07-17 20:08:41 +0900768 android.SdkBase
Colin Crossc472d572015-03-17 15:06:21 -0700769
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700770 Properties BaseProperties
771 VendorProperties VendorProperties
Colin Crossfa138792015-04-24 17:31:52 -0700772
Colin Crossca860ac2016-01-04 14:34:37 -0800773 // initialize before calling Init
Colin Cross635c3b02016-05-18 15:37:25 -0700774 hod android.HostOrDeviceSupported
775 multilib android.Multilib
Colin Crossc472d572015-03-17 15:06:21 -0700776
Paul Duffina0843f62019-12-13 19:50:38 +0000777 // Allowable SdkMemberTypes of this module type.
778 sdkMemberTypes []android.SdkMemberType
779
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500780 // decorator delegates, initialize before calling Init
781 // these may contain module-specific implementations, and effectively allow for custom
782 // type-specific logic. These members may reference different objects or the same object.
783 // Functions of these decorators will be invoked to initialize and register type-specific
784 // build statements.
Colin Crossb4ce0ec2016-09-13 13:41:39 -0700785 compiler compiler
786 linker linker
787 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500788
789 features []feature
790 stl *stl
791 sanitize *sanitize
792 coverage *coverage
793 sabi *sabi
794 vndkdep *vndkdep
795 lto *lto
796 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800797
Colin Cross31076b32020-10-23 17:22:06 -0700798 library libraryInterface
799
Colin Cross635c3b02016-05-18 15:37:25 -0700800 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800801
Colin Crossb98c8b02016-07-29 13:44:28 -0700802 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700803
804 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800805
806 // Flags used to compile this module
807 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700808
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800809 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700810 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900811
812 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800813 // Kythe (source file indexer) paths for this compilation module
814 kytheFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900815
816 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700817 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700818
819 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700820}
821
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500822func (c *Module) SetPreventInstall() {
823 c.Properties.PreventInstall = true
824}
825
826func (c *Module) SetHideFromMake() {
827 c.Properties.HideFromMake = true
828}
829
Ivan Lozano52767be2019-10-18 14:49:46 -0700830func (c *Module) Toc() android.OptionalPath {
831 if c.linker != nil {
832 if library, ok := c.linker.(libraryInterface); ok {
833 return library.toc()
834 }
835 }
836 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
837}
838
839func (c *Module) ApiLevel() string {
840 if c.linker != nil {
841 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700842 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700843 }
844 }
845 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
846}
847
848func (c *Module) Static() bool {
849 if c.linker != nil {
850 if library, ok := c.linker.(libraryInterface); ok {
851 return library.static()
852 }
853 }
854 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
855}
856
857func (c *Module) Shared() bool {
858 if c.linker != nil {
859 if library, ok := c.linker.(libraryInterface); ok {
860 return library.shared()
861 }
862 }
863 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
864}
865
866func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +0000867 if c.stl != nil {
868 return c.stl.Properties.SelectedStl
869 }
870 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -0700871}
872
873func (c *Module) ToolchainLibrary() bool {
874 if _, ok := c.linker.(*toolchainLibraryDecorator); ok {
875 return true
876 }
877 return false
878}
879
880func (c *Module) NdkPrebuiltStl() bool {
881 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
882 return true
883 }
884 return false
885}
886
887func (c *Module) StubDecorator() bool {
888 if _, ok := c.linker.(*stubDecorator); ok {
889 return true
890 }
891 return false
892}
893
894func (c *Module) SdkVersion() string {
895 return String(c.Properties.Sdk_version)
896}
897
Artur Satayev480e25b2020-04-27 18:53:18 +0100898func (c *Module) MinSdkVersion() string {
899 return String(c.Properties.Min_sdk_version)
900}
901
Dan Albert92fe7402020-07-15 13:33:30 -0700902func (c *Module) SplitPerApiLevel() bool {
Colin Cross1348ce32020-10-01 13:37:16 -0700903 if !c.canUseSdk() {
904 return false
905 }
Dan Albert92fe7402020-07-15 13:33:30 -0700906 if linker, ok := c.linker.(*objectLinker); ok {
907 return linker.isCrt()
908 }
909 return false
910}
911
Colin Crossc511bc52020-04-07 16:50:32 +0000912func (c *Module) AlwaysSdk() bool {
913 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
914}
915
Ivan Lozano183a3212019-10-18 14:18:45 -0700916func (c *Module) CcLibrary() bool {
917 if c.linker != nil {
918 if _, ok := c.linker.(*libraryDecorator); ok {
919 return true
920 }
Colin Crossd48fe732020-09-23 20:37:24 -0700921 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
922 return true
923 }
Ivan Lozano183a3212019-10-18 14:18:45 -0700924 }
925 return false
926}
927
928func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -0700929 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700930 return true
931 }
932 return false
933}
934
Ivan Lozano2b262972019-11-21 12:30:50 -0800935func (c *Module) NonCcVariants() bool {
936 return false
937}
938
Ivan Lozano183a3212019-10-18 14:18:45 -0700939func (c *Module) SetStatic() {
940 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700941 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700942 library.setStatic()
943 return
944 }
945 }
946 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
947}
948
949func (c *Module) SetShared() {
950 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700951 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700952 library.setShared()
953 return
954 }
955 }
956 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
957}
958
959func (c *Module) BuildStaticVariant() bool {
960 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700961 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700962 return library.buildStatic()
963 }
964 }
965 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
966}
967
968func (c *Module) BuildSharedVariant() bool {
969 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700970 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700971 return library.buildShared()
972 }
973 }
974 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
975}
976
977func (c *Module) Module() android.Module {
978 return c
979}
980
Jiyong Parkc20eee32018-09-05 22:36:17 +0900981func (c *Module) OutputFile() android.OptionalPath {
982 return c.outputFile
983}
984
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -0400985func (c *Module) CoverageFiles() android.Paths {
986 if c.linker != nil {
987 if library, ok := c.linker.(libraryInterface); ok {
988 return library.objs().coverageFiles
989 }
990 }
991 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
992}
993
Ivan Lozano183a3212019-10-18 14:18:45 -0700994var _ LinkableInterface = (*Module)(nil)
995
Jiyong Park719b4462019-01-13 00:39:51 +0900996func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900997 if c.linker != nil {
998 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +0900999 }
1000 return nil
1001}
1002
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001003func (c *Module) CoverageOutputFile() android.OptionalPath {
1004 if c.linker != nil {
1005 return c.linker.coverageOutputFilePath()
1006 }
1007 return android.OptionalPath{}
1008}
1009
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001010func (c *Module) RelativeInstallPath() string {
1011 if c.installer != nil {
1012 return c.installer.relativeInstallPath()
1013 }
1014 return ""
1015}
1016
Jooyung Han344d5432019-08-23 11:17:39 +09001017func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001018 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001019}
1020
Colin Cross36242852017-06-23 15:06:31 -07001021func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001022 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -08001023 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001024 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001025 }
1026 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001027 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001028 }
1029 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001030 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001031 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001032 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001033 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001034 }
Colin Cross16b23492016-01-06 14:41:07 -08001035 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001036 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001037 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001038 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001039 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001040 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001041 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001042 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001043 }
Justin Yun8effde42017-06-23 19:24:43 +09001044 if c.vndkdep != nil {
1045 c.AddProperties(c.vndkdep.props()...)
1046 }
Stephen Craneba090d12017-05-09 15:44:35 -07001047 if c.lto != nil {
1048 c.AddProperties(c.lto.props()...)
1049 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001050 if c.pgo != nil {
1051 c.AddProperties(c.pgo.props()...)
1052 }
Colin Crossca860ac2016-01-04 14:34:37 -08001053 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001054 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001055 }
Colin Crossc472d572015-03-17 15:06:21 -07001056
Colin Cross36242852017-06-23 15:06:31 -07001057 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001058 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +09001059 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001060 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001061
Colin Cross36242852017-06-23 15:06:31 -07001062 return c
Colin Crossc472d572015-03-17 15:06:21 -07001063}
1064
Colin Crossb916a382016-07-29 17:28:03 -07001065// Returns true for dependency roots (binaries)
1066// TODO(ccross): also handle dlopenable libraries
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001067func (c *Module) IsDependencyRoot() bool {
Colin Crossb916a382016-07-29 17:28:03 -07001068 if root, ok := c.linker.(interface {
1069 isDependencyRoot() bool
1070 }); ok {
1071 return root.isDependencyRoot()
1072 }
1073 return false
1074}
1075
Justin Yun5f7f7e82019-11-18 19:52:14 +09001076// Returns true if the module is using VNDK libraries instead of the libraries in /system/lib or /system/lib64.
1077// "product" and "vendor" variant modules return true for this function.
1078// When BOARD_VNDK_VERSION is set, vendor variants of "vendor_available: true", "vendor: true",
1079// "soc_specific: true" and more vendor installed modules are included here.
Justin Yun63e9ec72020-10-29 16:49:43 +09001080// When PRODUCT_PRODUCT_VNDK_VERSION is set, product variants of "product_available: true" or
Justin Yun5f7f7e82019-11-18 19:52:14 +09001081// "product_specific: true" modules are included here.
Ivan Lozano52767be2019-10-18 14:49:46 -07001082func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001083 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001084}
1085
Colin Crossc511bc52020-04-07 16:50:32 +00001086func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001087 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1088 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001089}
1090
1091func (c *Module) UseSdk() bool {
1092 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001093 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001094 }
1095 return false
1096}
1097
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001098func (c *Module) isCoverageVariant() bool {
1099 return c.coverage.Properties.IsCoverageVariant
1100}
1101
Colin Cross95f1ca02020-10-29 20:47:22 -07001102func (c *Module) IsNdk(config android.Config) bool {
1103 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001104}
1105
Colin Cross127bb8b2020-12-16 16:46:01 -08001106// isLLndk returns true for both LLNDK (public) and LLNDK-private libs.
1107func (c *Module) IsLlndk() bool {
1108 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001109}
1110
Colin Cross127bb8b2020-12-16 16:46:01 -08001111// IsLlndkPublic returns true only for LLNDK (public) libs.
1112func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001113 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001114}
1115
Colin Cross127bb8b2020-12-16 16:46:01 -08001116// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1117// and does not set llndk.vendor_available: false.
1118func (c *Module) isImplementationForLLNDKPublic() bool {
1119 library, _ := c.library.(*libraryDecorator)
1120 return library != nil && library.hasLLNDKStubs() &&
Justin Yunc0d8c492021-01-07 17:45:31 +09001121 (!Bool(library.Properties.Llndk.Private) ||
Colin Cross127bb8b2020-12-16 16:46:01 -08001122 // TODO(b/170784825): until the LLNDK properties are moved into the cc_library,
1123 // the non-Vendor variants of the cc_library don't know if the corresponding
Justin Yunc0d8c492021-01-07 17:45:31 +09001124 // llndk_library set private: true. Since libft2 is the only private LLNDK
1125 // library, hardcode it during the transition.
Colin Cross127bb8b2020-12-16 16:46:01 -08001126 c.BaseModuleName() != "libft2")
1127}
1128
Justin Yunfd9e8042020-12-23 18:23:14 +09001129// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001130func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001131 // Check if VNDK-core-private or VNDK-SP-private
1132 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001133 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001134 }
1135
1136 // Check if LLNDK-private
1137 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001138 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001139 }
1140
1141 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001142}
1143
Ivan Lozano52767be2019-10-18 14:49:46 -07001144func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001145 if vndkdep := c.vndkdep; vndkdep != nil {
1146 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001147 }
1148 return false
1149}
1150
Yi Kong7e53c572018-02-14 18:16:12 +08001151func (c *Module) isPgoCompile() bool {
1152 if pgo := c.pgo; pgo != nil {
1153 return pgo.Properties.PgoCompile
1154 }
1155 return false
1156}
1157
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001158func (c *Module) isNDKStubLibrary() bool {
1159 if _, ok := c.compiler.(*stubDecorator); ok {
1160 return true
1161 }
1162 return false
1163}
1164
Logan Chienf3511742017-10-31 18:04:35 +08001165func (c *Module) isVndkSp() bool {
1166 if vndkdep := c.vndkdep; vndkdep != nil {
1167 return vndkdep.isVndkSp()
1168 }
1169 return false
1170}
1171
Ivan Lozanof9e21722020-12-02 09:00:51 -05001172func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001173 if vndkdep := c.vndkdep; vndkdep != nil {
1174 return vndkdep.isVndkExt()
1175 }
1176 return false
1177}
1178
Ivan Lozano52767be2019-10-18 14:49:46 -07001179func (c *Module) MustUseVendorVariant() bool {
Jooyung Han097087b2019-10-22 19:32:18 +09001180 return c.isVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001181}
1182
Logan Chienf3511742017-10-31 18:04:35 +08001183func (c *Module) getVndkExtendsModuleName() string {
1184 if vndkdep := c.vndkdep; vndkdep != nil {
1185 return vndkdep.getVndkExtendsModuleName()
1186 }
1187 return ""
1188}
1189
Jiyong Park25fc6a92018-11-18 18:02:45 +09001190func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001191 if lib := c.library; lib != nil {
1192 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001193 }
1194 return false
1195}
1196
1197func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001198 if lib := c.library; lib != nil {
1199 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001200 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001201 return false
1202}
1203
Colin Cross0477b422020-10-13 18:43:54 -07001204// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1205// the implementation. If it is an implementation library it returns its own name.
1206func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1207 name := ctx.OtherModuleName(c)
1208 if versioned, ok := c.linker.(versionedInterface); ok {
1209 name = versioned.implementationModuleName(name)
1210 }
1211 return name
1212}
1213
Martin Stjernholm2856c662020-12-02 15:03:42 +00001214// Similar to ImplementationModuleName, but uses the Make variant of the module
1215// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1216// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1217// under the premise that the prebuilt module overrides its source counterpart
1218// if it is exposed to Make).
1219func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1220 name := c.BaseModuleName()
1221 if versioned, ok := c.linker.(versionedInterface); ok {
1222 name = versioned.implementationModuleName(name)
1223 }
1224 return name
1225}
1226
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001227func (c *Module) bootstrap() bool {
1228 return Bool(c.Properties.Bootstrap)
1229}
1230
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001231func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001232 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1233 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1234 return false
1235 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001236 return c.linker != nil && c.linker.nativeCoverage()
1237}
1238
Inseob Kim8471cda2019-11-15 09:59:12 +09001239func (c *Module) isSnapshotPrebuilt() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09001240 if p, ok := c.linker.(interface{ isSnapshotPrebuilt() bool }); ok {
1241 return p.isSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001242 }
1243 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001244}
1245
Bill Peckham945441c2020-08-31 16:07:58 -07001246func (c *Module) ExcludeFromVendorSnapshot() bool {
1247 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1248}
1249
Jose Galmesf7294582020-11-13 12:07:36 -08001250func (c *Module) ExcludeFromRecoverySnapshot() bool {
1251 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1252}
1253
Jiyong Parkf1194352019-02-25 11:05:47 +09001254func isBionic(name string) bool {
1255 switch name {
Kiyoung Kim4098c7e2020-11-30 14:42:14 +09001256 case "libc", "libm", "libdl", "libdl_android", "linker", "linkerconfig":
Jiyong Parkf1194352019-02-25 11:05:47 +09001257 return true
1258 }
1259 return false
1260}
1261
Martin Stjernholm279de572019-09-10 23:18:20 +01001262func InstallToBootstrap(name string, config android.Config) bool {
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001263 if name == "libclang_rt.hwasan-aarch64-android" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001264 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001265 }
1266 return isBionic(name)
1267}
1268
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001269func (c *Module) XrefCcFiles() android.Paths {
1270 return c.kytheFiles
1271}
1272
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001273func (c *Module) isCfiAssemblySupportEnabled() bool {
1274 return c.sanitize != nil &&
1275 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1276}
1277
Colin Crossca860ac2016-01-04 14:34:37 -08001278type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001279 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001280 moduleContextImpl
1281}
1282
Colin Cross37047f12016-12-13 17:06:13 -08001283type depsContext struct {
1284 android.BottomUpMutatorContext
1285 moduleContextImpl
1286}
1287
Colin Crossca860ac2016-01-04 14:34:37 -08001288type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001289 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001290 moduleContextImpl
1291}
1292
1293type moduleContextImpl struct {
1294 mod *Module
1295 ctx BaseModuleContext
1296}
1297
Colin Crossb98c8b02016-07-29 13:44:28 -07001298func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001299 return ctx.mod.toolchain(ctx.ctx)
1300}
1301
1302func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001303 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001304}
1305
1306func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001307 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001308}
1309
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001310func (ctx *moduleContextImpl) testBinary() bool {
1311 return ctx.mod.testBinary()
1312}
1313
Jiyong Park1d1119f2019-07-29 21:27:18 +09001314func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001315 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001316}
1317
Inseob Kim7f283f42020-06-01 21:53:49 +09001318func (ctx *moduleContextImpl) binary() bool {
1319 return ctx.mod.binary()
1320}
1321
Inseob Kim1042d292020-06-01 23:23:05 +09001322func (ctx *moduleContextImpl) object() bool {
1323 return ctx.mod.object()
1324}
1325
Jooyung Hanccce2f22020-03-07 03:45:53 +09001326func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001327 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001328}
1329
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001330func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001331 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001332}
1333
1334func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001335 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001336 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001337 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001338 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001339 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001340 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001341 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001342 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001343 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001344 }
1345 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001346}
1347
Jiyong Parkb35a8192020-08-10 15:59:36 +09001348func (ctx *moduleContextImpl) minSdkVersion() string {
1349 ver := ctx.mod.MinSdkVersion()
1350 if ver == "apex_inherit" && !ctx.isForPlatform() {
1351 ver = ctx.apexSdkVersion().String()
1352 }
1353 if ver == "apex_inherit" || ver == "" {
1354 ver = ctx.sdkVersion()
1355 }
1356 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1357 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1358 minSdkVersionInt, err2 := strconv.Atoi(ver)
1359 if err == nil && err2 == nil {
1360 if sdkVersionInt < minSdkVersionInt {
1361 return strconv.Itoa(sdkVersionInt)
1362 }
1363 }
1364 return ver
1365}
1366
1367func (ctx *moduleContextImpl) isSdkVariant() bool {
1368 return ctx.mod.IsSdkVariant()
1369}
1370
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001371func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001372 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001373}
Justin Yun8effde42017-06-23 19:24:43 +09001374
Colin Cross95f1ca02020-10-29 20:47:22 -07001375func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1376 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001377}
1378
Colin Cross127bb8b2020-12-16 16:46:01 -08001379func (ctx *moduleContextImpl) IsLlndk() bool {
1380 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001381}
1382
Colin Cross127bb8b2020-12-16 16:46:01 -08001383func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1384 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001385}
1386
Colin Cross127bb8b2020-12-16 16:46:01 -08001387func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1388 return ctx.mod.isImplementationForLLNDKPublic()
1389}
1390
1391func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1392 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001393}
1394
Logan Chienf3511742017-10-31 18:04:35 +08001395func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001396 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001397}
1398
Yi Kong7e53c572018-02-14 18:16:12 +08001399func (ctx *moduleContextImpl) isPgoCompile() bool {
1400 return ctx.mod.isPgoCompile()
1401}
1402
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001403func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1404 return ctx.mod.isNDKStubLibrary()
1405}
1406
Justin Yun8effde42017-06-23 19:24:43 +09001407func (ctx *moduleContextImpl) isVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001408 return ctx.mod.isVndkSp()
1409}
1410
Ivan Lozanof9e21722020-12-02 09:00:51 -05001411func (ctx *moduleContextImpl) IsVndkExt() bool {
1412 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001413}
1414
Vic Yangefd249e2018-11-12 20:19:56 -08001415func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001416 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001417}
1418
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001419func (ctx *moduleContextImpl) selectedStl() string {
1420 if stl := ctx.mod.stl; stl != nil {
1421 return stl.Properties.SelectedStl
1422 }
1423 return ""
1424}
1425
Ivan Lozanobd721262018-11-27 14:33:03 -08001426func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1427 return ctx.mod.linker.useClangLld(actx)
1428}
1429
Colin Crossce75d2c2016-10-06 16:12:58 -07001430func (ctx *moduleContextImpl) baseModuleName() string {
1431 return ctx.mod.ModuleBase.BaseModuleName()
1432}
1433
Logan Chienf3511742017-10-31 18:04:35 +08001434func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1435 return ctx.mod.getVndkExtendsModuleName()
1436}
1437
Logan Chiene274fc92019-12-03 11:18:32 -08001438func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001439 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001440}
1441
Colin Crosse07f2312020-08-13 11:24:56 -07001442func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001443 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001444}
1445
Dan Albertc8060532020-07-22 22:32:17 -07001446func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001447 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001448}
1449
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001450func (ctx *moduleContextImpl) bootstrap() bool {
1451 return ctx.mod.bootstrap()
1452}
1453
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001454func (ctx *moduleContextImpl) nativeCoverage() bool {
1455 return ctx.mod.nativeCoverage()
1456}
1457
Colin Cross56a83212020-09-15 18:30:11 -07001458func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1459 return ctx.mod.DirectlyInAnyApex()
1460}
1461
Colin Cross95b07f22020-12-16 11:06:50 -08001462func (ctx *moduleContextImpl) isPreventInstall() bool {
1463 return ctx.mod.Properties.PreventInstall
1464}
1465
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001466func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1467 return ctx.mod.isCfiAssemblySupportEnabled()
1468}
1469
Colin Cross635c3b02016-05-18 15:37:25 -07001470func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001471 return &Module{
1472 hod: hod,
1473 multilib: multilib,
1474 }
1475}
1476
Colin Cross635c3b02016-05-18 15:37:25 -07001477func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001478 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001479 module.features = []feature{
1480 &tidyFeature{},
1481 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001482 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001483 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001484 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001485 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001486 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001487 module.lto = &lto{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001488 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001489 return module
1490}
1491
Colin Crossce75d2c2016-10-06 16:12:58 -07001492func (c *Module) Prebuilt() *android.Prebuilt {
1493 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1494 return p.prebuilt()
1495 }
1496 return nil
1497}
1498
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001499func (c *Module) IsPrebuilt() bool {
1500 return c.Prebuilt() != nil
1501}
1502
Colin Crossce75d2c2016-10-06 16:12:58 -07001503func (c *Module) Name() string {
1504 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001505 if p, ok := c.linker.(interface {
1506 Name(string) string
1507 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001508 name = p.Name(name)
1509 }
1510 return name
1511}
1512
Alex Light3d673592019-01-18 14:37:31 -08001513func (c *Module) Symlinks() []string {
1514 if p, ok := c.installer.(interface {
1515 symlinkList() []string
1516 }); ok {
1517 return p.symlinkList()
1518 }
1519 return nil
1520}
1521
Roland Levillainf89cd092019-07-29 16:22:59 +01001522func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1523 test, ok := c.linker.(testPerSrc)
1524 return ok && test.isAllTestsVariation()
1525}
1526
Chris Parsons216e10a2020-07-09 17:12:52 -04001527func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001528 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001529 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001530 }); ok {
1531 return p.dataPaths()
1532 }
1533 return nil
1534}
1535
Justin Yun5f7f7e82019-11-18 19:52:14 +09001536func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
1537 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1538 // "current", it will append the VNDK version to the name suffix.
1539 var vndkVersion string
1540 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001541 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001542 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
1543 nameSuffix = productSuffix
1544 } else {
1545 vndkVersion = ctx.DeviceConfig().VndkVersion()
1546 nameSuffix = vendorSuffix
1547 }
1548 if vndkVersion == "current" {
1549 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1550 }
Colin Cross127bb8b2020-12-16 16:46:01 -08001551 if c.Properties.VndkVersion != vndkVersion && c.Properties.VndkVersion != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001552 // add version suffix only if the module is using different vndk version than the
1553 // version in product or vendor partition.
1554 nameSuffix += "." + c.Properties.VndkVersion
1555 }
1556 return nameSuffix
1557}
1558
Colin Cross635c3b02016-05-18 15:37:25 -07001559func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Roland Levillainf2fad972019-06-28 15:41:19 +01001560 // Handle the case of a test module split by `test_per_src` mutator.
Roland Levillainf89cd092019-07-29 16:22:59 +01001561 //
1562 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1563 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1564 // module and return early, as this module does not produce an output file per se.
1565 if c.IsTestPerSrcAllTestsVariation() {
1566 c.outputFile = android.OptionalPath{}
1567 return
Roland Levillainf2fad972019-06-28 15:41:19 +01001568 }
1569
Colin Cross56a83212020-09-15 18:30:11 -07001570 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1571 if !apexInfo.IsForPlatform() {
1572 c.hideApexVariantFromMake = true
1573 }
1574
Ivan Lozanof9e21722020-12-02 09:00:51 -05001575 c.makeLinkType = GetMakeLinkType(actx, c)
Inseob Kim9516ee92019-05-09 10:56:13 +09001576
Inseob Kim64c43952019-08-26 16:52:35 +09001577 c.Properties.SubName = ""
1578
1579 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1580 c.Properties.SubName += nativeBridgeSuffix
1581 }
1582
Colin Cross127bb8b2020-12-16 16:46:01 -08001583 llndk := c.IsLlndk()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001584 _, llndkHeader := c.linker.(*llndkHeadersDecorator)
Justin Yun63e9ec72020-10-29 16:49:43 +09001585 if llndk || llndkHeader || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001586 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1587 // added for product variant only when we have vendor and product variants with core
1588 // variant. The suffix is not added for vendor-only or product-only module.
1589 c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
1590 } else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
Inseob Kim64c43952019-08-26 16:52:35 +09001591 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1592 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
1593 c.Properties.SubName += vendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001594 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
1595 c.Properties.SubName += ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001596 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
1597 c.Properties.SubName += vendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001598 } else if c.InRecovery() && !c.OnlyInRecovery() {
Inseob Kim64c43952019-08-26 16:52:35 +09001599 c.Properties.SubName += recoverySuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001600 } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
Colin Crossc511bc52020-04-07 16:50:32 +00001601 c.Properties.SubName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001602 if c.SplitPerApiLevel() {
1603 c.Properties.SubName += "." + c.SdkVersion()
1604 }
Inseob Kim64c43952019-08-26 16:52:35 +09001605 }
1606
Colin Crossca860ac2016-01-04 14:34:37 -08001607 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001608 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001609 moduleContextImpl: moduleContextImpl{
1610 mod: c,
1611 },
1612 }
1613 ctx.ctx = ctx
1614
Colin Crossf18e1102017-11-16 14:33:08 -08001615 deps := c.depsToPaths(ctx)
1616 if ctx.Failed() {
1617 return
1618 }
1619
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001620 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1621 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1622 }
1623
Colin Crossca860ac2016-01-04 14:34:37 -08001624 flags := Flags{
1625 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001626 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001627 }
Colin Crossca860ac2016-01-04 14:34:37 -08001628 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001629 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001630 }
1631 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001632 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001633 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001634 if c.stl != nil {
1635 flags = c.stl.flags(ctx, flags)
1636 }
Colin Cross16b23492016-01-06 14:41:07 -08001637 if c.sanitize != nil {
1638 flags = c.sanitize.flags(ctx, flags)
1639 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001640 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001641 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001642 }
Stephen Craneba090d12017-05-09 15:44:35 -07001643 if c.lto != nil {
1644 flags = c.lto.flags(ctx, flags)
1645 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001646 if c.pgo != nil {
1647 flags = c.pgo.flags(ctx, flags)
1648 }
Colin Crossca860ac2016-01-04 14:34:37 -08001649 for _, feature := range c.features {
1650 flags = feature.flags(ctx, flags)
1651 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001652 if ctx.Failed() {
1653 return
1654 }
1655
Colin Cross4af21ed2019-11-04 09:37:55 -08001656 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1657 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1658 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001659
Colin Cross4af21ed2019-11-04 09:37:55 -08001660 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001661
1662 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001663 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001664 }
1665 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001666 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001667 }
1668
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001669 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001670 // We need access to all the flags seen by a source file.
1671 if c.sabi != nil {
1672 flags = c.sabi.flags(ctx, flags)
1673 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001674
Colin Cross4af21ed2019-11-04 09:37:55 -08001675 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001676
Colin Crossca860ac2016-01-04 14:34:37 -08001677 // Optimization to reduce size of build.ninja
1678 // Replace the long list of flags for each file with a module-local variable
Colin Cross4af21ed2019-11-04 09:37:55 -08001679 ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
1680 ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
1681 ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
1682 flags.Local.CFlags = []string{"$cflags"}
1683 flags.Local.CppFlags = []string{"$cppflags"}
1684 flags.Local.AsFlags = []string{"$asflags"}
Colin Crossca860ac2016-01-04 14:34:37 -08001685
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001686 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001687 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001688 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001689 if ctx.Failed() {
1690 return
1691 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001692 c.kytheFiles = objs.kytheFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001693 }
1694
Colin Crossca860ac2016-01-04 14:34:37 -08001695 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001696 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001697 if ctx.Failed() {
1698 return
1699 }
Colin Cross635c3b02016-05-18 15:37:25 -07001700 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001701
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09001702 // If a lib is directly included in any of the APEXes or is not available to the
1703 // platform (which is often the case when the stub is provided as a prebuilt),
1704 // unhide the stubs variant having the latest version gets visible to make. In
1705 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
1706 // force anything in the make world to link against the stubs library. (unless it
1707 // is explicitly referenced via .bootstrap suffix or the module is marked with
1708 // 'bootstrap: true').
1709 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Ivan Lozano52767be2019-10-18 14:49:46 -07001710 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001711 c.IsStubs() && !c.InVendorRamdisk() {
Jiyong Parkb0788572018-12-20 22:10:17 +09001712 c.Properties.HideFromMake = false // unhide
1713 // Note: this is still non-installable
1714 }
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001715
Jose Galmes6f843bc2020-12-11 13:36:29 -08001716 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
1717 // RECOVERY_SNAPSHOT_VERSION is current.
1718 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Inseob Kimde5744a2020-12-02 13:14:28 +09001719 if shouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001720 i.collectHeadersForSnapshot(ctx)
1721 }
1722 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001723 }
Colin Cross5049f022015-03-18 13:28:46 -07001724
Colin Crossa9c8c9f2020-12-16 10:20:23 -08001725 if !proptools.BoolDefault(c.Properties.Installable, true) {
1726 // If the module has been specifically configure to not be installed then
1727 // hide from make as otherwise it will break when running inside make
1728 // as the output path to install will not be specified. Not all uninstallable
1729 // modules can be hidden from make as some are needed for resolving make side
1730 // dependencies.
1731 c.HideFromMake()
1732 } else if !c.installable(apexInfo) {
1733 c.SkipInstall()
1734 }
1735
1736 // Still call c.installer.install though, the installs will be stored as PackageSpecs
1737 // to allow using the outputs in a genrule.
1738 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07001739 c.installer.install(ctx, c.outputFile.Path())
1740 if ctx.Failed() {
1741 return
Colin Crossca860ac2016-01-04 14:34:37 -08001742 }
Dan Albertc403f7c2015-03-18 14:01:18 -07001743 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001744}
1745
Colin Cross0ea8ba82019-06-06 14:33:29 -07001746func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001747 if c.cachedToolchain == nil {
Colin Crossb98c8b02016-07-29 13:44:28 -07001748 c.cachedToolchain = config.FindToolchain(ctx.Os(), ctx.Arch())
Colin Cross3f40fa42015-01-30 17:27:36 -08001749 }
Colin Crossca860ac2016-01-04 14:34:37 -08001750 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08001751}
1752
Colin Crossca860ac2016-01-04 14:34:37 -08001753func (c *Module) begin(ctx BaseModuleContext) {
1754 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001755 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07001756 }
Colin Crossca860ac2016-01-04 14:34:37 -08001757 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001758 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001759 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001760 if c.stl != nil {
1761 c.stl.begin(ctx)
1762 }
Colin Cross16b23492016-01-06 14:41:07 -08001763 if c.sanitize != nil {
1764 c.sanitize.begin(ctx)
1765 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001766 if c.coverage != nil {
1767 c.coverage.begin(ctx)
1768 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001769 if c.sabi != nil {
1770 c.sabi.begin(ctx)
1771 }
Justin Yun8effde42017-06-23 19:24:43 +09001772 if c.vndkdep != nil {
1773 c.vndkdep.begin(ctx)
1774 }
Stephen Craneba090d12017-05-09 15:44:35 -07001775 if c.lto != nil {
1776 c.lto.begin(ctx)
1777 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001778 if c.pgo != nil {
1779 c.pgo.begin(ctx)
1780 }
Colin Crossca860ac2016-01-04 14:34:37 -08001781 for _, feature := range c.features {
1782 feature.begin(ctx)
1783 }
Dan Albert92fe7402020-07-15 13:33:30 -07001784 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07001785 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001786 if err != nil {
1787 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07001788 c.Properties.Sdk_version = nil
1789 } else {
1790 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001791 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001792 }
Colin Crossca860ac2016-01-04 14:34:37 -08001793}
1794
Colin Cross37047f12016-12-13 17:06:13 -08001795func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07001796 deps := Deps{}
1797
1798 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001799 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001800 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001801 // Add the PGO dependency (the clang_rt.profile runtime library), which
1802 // sometimes depends on symbols from libgcc, before libgcc gets added
1803 // in linkerDeps().
Pirama Arumuga Nainar49b53d52017-10-04 16:47:29 -07001804 if c.pgo != nil {
1805 deps = c.pgo.deps(ctx, deps)
1806 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001807 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001808 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001809 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001810 if c.stl != nil {
1811 deps = c.stl.deps(ctx, deps)
1812 }
Colin Cross16b23492016-01-06 14:41:07 -08001813 if c.sanitize != nil {
1814 deps = c.sanitize.deps(ctx, deps)
1815 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001816 if c.coverage != nil {
1817 deps = c.coverage.deps(ctx, deps)
1818 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001819 if c.sabi != nil {
1820 deps = c.sabi.deps(ctx, deps)
1821 }
Justin Yun8effde42017-06-23 19:24:43 +09001822 if c.vndkdep != nil {
1823 deps = c.vndkdep.deps(ctx, deps)
1824 }
Stephen Craneba090d12017-05-09 15:44:35 -07001825 if c.lto != nil {
1826 deps = c.lto.deps(ctx, deps)
1827 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001828 for _, feature := range c.features {
1829 deps = feature.deps(ctx, deps)
1830 }
1831
Colin Crossb6715442017-10-24 11:13:31 -07001832 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1833 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1834 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
1835 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1836 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
1837 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08001838 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07001839
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001840 for _, lib := range deps.ReexportSharedLibHeaders {
1841 if !inList(lib, deps.SharedLibs) {
1842 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
1843 }
1844 }
1845
1846 for _, lib := range deps.ReexportStaticLibHeaders {
1847 if !inList(lib, deps.StaticLibs) {
1848 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs: '%s'", lib)
1849 }
1850 }
1851
Colin Cross5950f382016-12-13 12:50:57 -08001852 for _, lib := range deps.ReexportHeaderLibHeaders {
1853 if !inList(lib, deps.HeaderLibs) {
1854 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
1855 }
1856 }
1857
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001858 for _, gen := range deps.ReexportGeneratedHeaders {
1859 if !inList(gen, deps.GeneratedHeaders) {
1860 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
1861 }
1862 }
1863
Colin Crossc99deeb2016-04-11 15:06:20 -07001864 return deps
1865}
1866
Dan Albert7e9d2952016-08-04 13:02:36 -07001867func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08001868 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001869 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001870 moduleContextImpl: moduleContextImpl{
1871 mod: c,
1872 },
1873 }
1874 ctx.ctx = ctx
1875
Colin Crossca860ac2016-01-04 14:34:37 -08001876 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07001877}
1878
Jiyong Park7ed9de32018-10-15 22:25:07 +09001879// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09001880func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001881 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
1882 version := name[sharp+1:]
1883 libname := name[:sharp]
1884 return libname, version
1885 }
1886 return name, ""
1887}
1888
Dan Albert92fe7402020-07-15 13:33:30 -07001889func GetCrtVariations(ctx android.BottomUpMutatorContext,
1890 m LinkableInterface) []blueprint.Variation {
1891 if ctx.Os() != android.Android {
1892 return nil
1893 }
1894 if m.UseSdk() {
1895 return []blueprint.Variation{
1896 {Mutator: "sdk", Variation: "sdk"},
Colin Crossbbc941b2020-09-30 12:27:01 -07001897 {Mutator: "version", Variation: m.SdkVersion()},
Dan Albert92fe7402020-07-15 13:33:30 -07001898 }
1899 }
1900 return []blueprint.Variation{
1901 {Mutator: "sdk", Variation: ""},
1902 }
1903}
1904
Colin Crosse7257d22020-09-24 09:56:18 -07001905func (c *Module) addSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext,
1906 variations []blueprint.Variation, depTag libraryDependencyTag, name, version string, far bool) {
1907
1908 variations = append([]blueprint.Variation(nil), variations...)
1909
Colin Cross3146c5c2020-09-30 15:34:40 -07001910 if version != "" && CanBeOrLinkAgainstVersionVariants(c) {
Colin Crosse7257d22020-09-24 09:56:18 -07001911 // Version is explicitly specified. i.e. libFoo#30
1912 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
1913 depTag.explicitlyVersioned = true
1914 }
Colin Crosse7257d22020-09-24 09:56:18 -07001915
Colin Cross0de8a1e2020-09-18 14:15:30 -07001916 if far {
1917 ctx.AddFarVariationDependencies(variations, depTag, name)
1918 } else {
1919 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07001920 }
1921}
1922
Colin Cross1e676be2016-10-12 14:38:15 -07001923func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09001924 if !c.Enabled() {
1925 return
1926 }
1927
Colin Cross37047f12016-12-13 17:06:13 -08001928 ctx := &depsContext{
1929 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07001930 moduleContextImpl: moduleContextImpl{
1931 mod: c,
1932 },
1933 }
1934 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08001935
Colin Crossc99deeb2016-04-11 15:06:20 -07001936 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001937
Yo Chiang219968c2020-09-22 18:45:04 +08001938 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
1939
Dan Albert914449f2016-06-17 16:45:24 -07001940 variantNdkLibs := []string{}
1941 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07001942 if ctx.Os() == android.Android {
Inseob Kimeec88e12020-01-22 11:11:29 +09001943 // rewriteLibs takes a list of names of shared libraries and scans it for three types
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001944 // of names:
Dan Albert914449f2016-06-17 16:45:24 -07001945 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001946 // 1. Name of an NDK library that refers to a prebuilt module.
1947 // For each of these, it adds the name of the prebuilt module (which will be in
1948 // prebuilts/ndk) to the list of nonvariant libs.
1949 // 2. Name of an NDK library that refers to an ndk_library module.
1950 // For each of these, it adds the name of the ndk_library module to the list of
1951 // variant libs.
1952 // 3. Anything else (so anything that isn't an NDK library).
1953 // It adds these to the nonvariantLibs list.
Dan Albert914449f2016-06-17 16:45:24 -07001954 //
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001955 // The caller can then know to add the variantLibs dependencies differently from the
1956 // nonvariantLibs
Inseob Kim9516ee92019-05-09 10:56:13 +09001957
Inseob Kim9516ee92019-05-09 10:56:13 +09001958 vendorPublicLibraries := vendorPublicLibraries(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001959 vendorSnapshotSharedLibs := vendorSnapshotSharedLibs(actx.Config())
Jose Galmes6f843bc2020-12-11 13:36:29 -08001960 recoverySnapshotSharedLibs := recoverySnapshotSharedLibs(actx.Config())
Inseob Kimeec88e12020-01-22 11:11:29 +09001961
1962 rewriteVendorLibs := func(lib string) string {
Inseob Kimeec88e12020-01-22 11:11:29 +09001963 // only modules with BOARD_VNDK_VERSION uses snapshot.
1964 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
1965 return lib
1966 }
1967
1968 if snapshot, ok := vendorSnapshotSharedLibs.get(lib, actx.Arch().ArchType); ok {
1969 return snapshot
1970 }
1971
1972 return lib
1973 }
1974
1975 rewriteLibs := func(list []string) (nonvariantLibs []string, variantLibs []string) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001976 variantLibs = []string{}
1977 nonvariantLibs = []string{}
Dan Albert914449f2016-06-17 16:45:24 -07001978 for _, entry := range list {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001979 // strip #version suffix out
Jiyong Park73c54ee2019-10-22 20:31:18 +09001980 name, _ := StubsLibNameAndVersion(entry)
Jose Galmes6f843bc2020-12-11 13:36:29 -08001981 if c.InRecovery() {
1982 recoverySnapshotVersion :=
1983 actx.DeviceConfig().RecoverySnapshotVersion()
1984 if recoverySnapshotVersion == "current" ||
1985 recoverySnapshotVersion == "" {
1986 nonvariantLibs = append(nonvariantLibs, name)
1987 } else if snapshot, ok := recoverySnapshotSharedLibs.get(
1988 name, actx.Arch().ArchType); ok {
1989 nonvariantLibs = append(nonvariantLibs, snapshot)
1990 } else {
1991 nonvariantLibs = append(nonvariantLibs, name)
1992 }
1993 } else if ctx.useSdk() && inList(name, *getNDKKnownLibs(ctx.Config())) {
Dan Albertde5aade2020-06-30 12:32:51 -07001994 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Inseob Kimeec88e12020-01-22 11:11:29 +09001995 } else if ctx.useVndk() {
1996 nonvariantLibs = append(nonvariantLibs, rewriteVendorLibs(entry))
Inseob Kim9516ee92019-05-09 10:56:13 +09001997 } else if (ctx.Platform() || ctx.ProductSpecific()) && inList(name, *vendorPublicLibraries) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001998 vendorPublicLib := name + vendorPublicLibrarySuffix
Jiyong Park374510b2018-03-19 18:23:01 +09001999 if actx.OtherModuleExists(vendorPublicLib) {
2000 nonvariantLibs = append(nonvariantLibs, vendorPublicLib)
2001 } else {
2002 // This can happen if vendor_public_library module is defined in a
2003 // namespace that isn't visible to the current module. In that case,
2004 // link to the original library.
Jiyong Park7ed9de32018-10-15 22:25:07 +09002005 nonvariantLibs = append(nonvariantLibs, name)
Jiyong Park374510b2018-03-19 18:23:01 +09002006 }
Dan Albert914449f2016-06-17 16:45:24 -07002007 } else {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002008 // put name#version back
Dan Willemsen7cbf5f82017-03-28 00:08:30 -07002009 nonvariantLibs = append(nonvariantLibs, entry)
Dan Willemsen72d39932016-07-08 23:23:48 -07002010 }
2011 }
Dan Albert914449f2016-06-17 16:45:24 -07002012 return nonvariantLibs, variantLibs
Dan Willemsen72d39932016-07-08 23:23:48 -07002013 }
2014
Inseob Kimeec88e12020-01-22 11:11:29 +09002015 deps.SharedLibs, variantNdkLibs = rewriteLibs(deps.SharedLibs)
2016 deps.LateSharedLibs, variantLateNdkLibs = rewriteLibs(deps.LateSharedLibs)
2017 deps.ReexportSharedLibHeaders, _ = rewriteLibs(deps.ReexportSharedLibHeaders)
2018 if ctx.useVndk() {
2019 for idx, lib := range deps.RuntimeLibs {
2020 deps.RuntimeLibs[idx] = rewriteVendorLibs(lib)
2021 }
2022 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002023 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002024
Inseob Kimeec88e12020-01-22 11:11:29 +09002025 rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string {
2026 // only modules with BOARD_VNDK_VERSION uses snapshot.
2027 if c.VndkVersion() != actx.DeviceConfig().VndkVersion() {
2028 return lib
2029 }
2030
2031 if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
2032 return snapshot
2033 }
2034
2035 return lib
2036 }
2037
Jose Galmes6f843bc2020-12-11 13:36:29 -08002038 snapshotHeaderLibs := vendorSnapshotHeaderLibs(actx.Config())
2039 snapshotStaticLibs := vendorSnapshotStaticLibs(actx.Config())
2040 snapshotObjects := vendorSnapshotObjects(actx.Config())
2041
2042 if c.InRecovery() {
2043 rewriteSnapshotLibs = func(lib string, snapshotMap *snapshotMap) string {
2044 recoverySnapshotVersion :=
2045 actx.DeviceConfig().RecoverySnapshotVersion()
2046 if recoverySnapshotVersion == "current" ||
2047 recoverySnapshotVersion == "" {
2048 return lib
2049 } else if snapshot, ok := snapshotMap.get(lib, actx.Arch().ArchType); ok {
2050 return snapshot
2051 }
2052
2053 return lib
2054 }
2055
2056 snapshotHeaderLibs = recoverySnapshotHeaderLibs(actx.Config())
2057 snapshotStaticLibs = recoverySnapshotStaticLibs(actx.Config())
2058 snapshotObjects = recoverySnapshotObjects(actx.Config())
2059 }
2060
Colin Cross32ec36c2016-12-15 07:39:51 -08002061 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002062 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002063 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002064 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002065 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002066
Jose Galmes6f843bc2020-12-11 13:36:29 -08002067 lib = rewriteSnapshotLibs(lib, snapshotHeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002068
Jiyong Park1ad8e162020-12-01 23:40:09 +09002069 if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002070 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002071 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002072 } else {
2073 actx.AddVariationDependencies(nil, depTag, lib)
2074 }
2075 }
2076
Inseob Kim07def122020-11-23 14:43:02 +09002077 // sysprop_library has to support both C++ and Java. So sysprop_library internally creates one
2078 // C++ implementation library and one Java implementation library. When a module links against
2079 // sysprop_library, the C++ implementation library has to be linked. syspropImplLibraries is a
2080 // map from sysprop_library to implementation library; it will be used in whole_static_libs,
2081 // static_libs, and shared_libs.
Inseob Kimc0907f12019-02-08 21:00:45 +09002082 syspropImplLibraries := syspropImplLibraries(actx.Config())
2083
Jiyong Park5d1598f2019-02-25 22:14:17 +09002084 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002085 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09002086 if impl, ok := syspropImplLibraries[lib]; ok {
2087 lib = impl
2088 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002089
Jose Galmes6f843bc2020-12-11 13:36:29 -08002090 lib = rewriteSnapshotLibs(lib, snapshotStaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002091
Jiyong Park5d1598f2019-02-25 22:14:17 +09002092 actx.AddVariationDependencies([]blueprint.Variation{
2093 {Mutator: "link", Variation: "static"},
2094 }, depTag, lib)
2095 }
2096
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002097 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002098 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002099 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002100 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002101 }
Jiyong Parke3867542020-12-03 17:28:25 +09002102 if inList(lib, deps.ExcludeLibsForApex) {
2103 depTag.excludeInApex = true
2104 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002105
2106 if impl, ok := syspropImplLibraries[lib]; ok {
2107 lib = impl
2108 }
2109
Jose Galmes6f843bc2020-12-11 13:36:29 -08002110 lib = rewriteSnapshotLibs(lib, snapshotStaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002111
Dan Willemsen59339a22018-07-22 21:18:45 -07002112 actx.AddVariationDependencies([]blueprint.Variation{
2113 {Mutator: "link", Variation: "static"},
2114 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002115 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002116
Jooyung Han75568392020-03-20 04:29:24 +09002117 // staticUnwinderDep is treated as staticDep for Q apexes
2118 // so that native libraries/binaries are linked with static unwinder
2119 // because Q libc doesn't have unwinder APIs
2120 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002121 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002122 actx.AddVariationDependencies([]blueprint.Variation{
2123 {Mutator: "link", Variation: "static"},
Jose Galmes6f843bc2020-12-11 13:36:29 -08002124 }, depTag, rewriteSnapshotLibs(staticUnwinder(actx), snapshotStaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002125 }
2126
Inseob Kimeec88e12020-01-22 11:11:29 +09002127 for _, lib := range deps.LateStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002128 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Inseob Kimeec88e12020-01-22 11:11:29 +09002129 actx.AddVariationDependencies([]blueprint.Variation{
2130 {Mutator: "link", Variation: "static"},
Jose Galmes6f843bc2020-12-11 13:36:29 -08002131 }, depTag, rewriteSnapshotLibs(lib, snapshotStaticLibs))
Inseob Kimeec88e12020-01-22 11:11:29 +09002132 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002133
Jiyong Park7ed9de32018-10-15 22:25:07 +09002134 // shared lib names without the #version suffix
2135 var sharedLibNames []string
2136
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002137 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002138 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002139 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002140 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002141 }
Jiyong Parke3867542020-12-03 17:28:25 +09002142 if inList(lib, deps.ExcludeLibsForApex) {
2143 depTag.excludeInApex = true
2144 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002145
2146 if impl, ok := syspropImplLibraries[lib]; ok {
2147 lib = impl
2148 }
2149
Jiyong Park73c54ee2019-10-22 20:31:18 +09002150 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002151 sharedLibNames = append(sharedLibNames, name)
2152
Colin Crosse7257d22020-09-24 09:56:18 -07002153 variations := []blueprint.Variation{
2154 {Mutator: "link", Variation: "shared"},
2155 }
2156 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002157 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002158
Jiyong Park7ed9de32018-10-15 22:25:07 +09002159 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002160 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002161 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2162 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2163 // linking against both the stubs lib and the non-stubs lib at the same time.
2164 continue
2165 }
Colin Cross6e511a92020-07-27 21:26:48 -07002166 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002167 variations := []blueprint.Variation{
2168 {Mutator: "link", Variation: "shared"},
2169 }
2170 c.addSharedLibDependenciesWithVersions(ctx, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002171 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002172
Dan Willemsen59339a22018-07-22 21:18:45 -07002173 actx.AddVariationDependencies([]blueprint.Variation{
2174 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002175 }, dataLibDepTag, deps.DataLibs...)
2176
2177 actx.AddVariationDependencies([]blueprint.Variation{
2178 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002179 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002180
Colin Cross68861832016-07-08 10:41:41 -07002181 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002182
2183 for _, gen := range deps.GeneratedHeaders {
2184 depTag := genHeaderDepTag
2185 if inList(gen, deps.ReexportGeneratedHeaders) {
2186 depTag = genHeaderExportDepTag
2187 }
2188 actx.AddDependency(c, depTag, gen)
2189 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002190
Dan Albert92fe7402020-07-15 13:33:30 -07002191 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002192 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc99deeb2016-04-11 15:06:20 -07002193 if deps.CrtBegin != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002194 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Jose Galmes6f843bc2020-12-11 13:36:29 -08002195 rewriteSnapshotLibs(deps.CrtBegin, snapshotObjects))
Colin Crossca860ac2016-01-04 14:34:37 -08002196 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002197 if deps.CrtEnd != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002198 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Jose Galmes6f843bc2020-12-11 13:36:29 -08002199 rewriteSnapshotLibs(deps.CrtEnd, snapshotObjects))
Colin Cross21b9a242015-03-24 14:15:58 -07002200 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002201 if deps.LinkerFlagsFile != "" {
2202 actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
2203 }
2204 if deps.DynamicLinker != "" {
2205 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002206 }
Dan Albert914449f2016-06-17 16:45:24 -07002207
2208 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002209
2210 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002211 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002212 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002213 {Mutator: "link", Variation: "shared"},
2214 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002215
2216 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002217 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002218 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002219 {Mutator: "link", Variation: "shared"},
2220 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002221
2222 if vndkdep := c.vndkdep; vndkdep != nil {
2223 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002224 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002225 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002226 {Mutator: "link", Variation: "shared"},
2227 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002228 }
2229 }
Colin Cross6362e272015-10-29 15:25:03 -07002230}
Colin Cross21b9a242015-03-24 14:15:58 -07002231
Colin Crosse40b4ea2018-10-02 22:25:58 -07002232func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002233 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2234 c.beginMutator(ctx)
2235 }
2236}
2237
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002238// Whether a module can link to another module, taking into
2239// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002240func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002241 tag blueprint.DependencyTag) {
2242
2243 switch t := tag.(type) {
2244 case dependencyTag:
2245 if t != vndkExtDepTag {
2246 return
2247 }
2248 case libraryDependencyTag:
2249 default:
2250 return
2251 }
2252
Ivan Lozanof9e21722020-12-02 09:00:51 -05002253 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002254 // Host code is not restricted
2255 return
2256 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002257
2258 // VNDK is cc.Module supported only for now.
2259 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002260 // Though allowed dependency is limited by the image mutator,
2261 // each vendor and product module needs to check link-type
2262 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002263 if ccTo, ok := to.(*Module); ok {
2264 if ccFrom.vndkdep != nil {
2265 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2266 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05002267 } else if linkableMod, ok := to.(LinkableInterface); ok {
2268 // Static libraries from other languages can be linked
2269 if !linkableMod.Static() {
2270 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
2271 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002272 } else {
2273 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002274 }
2275 return
2276 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002277 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002278 // Platform code can link to anything
2279 return
2280 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002281 if from.InRamdisk() {
2282 // Ramdisk code is not NDK
2283 return
2284 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002285 if from.InVendorRamdisk() {
2286 // Vendor ramdisk code is not NDK
2287 return
2288 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002289 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002290 // Recovery code is not NDK
2291 return
2292 }
Colin Cross31076b32020-10-23 17:22:06 -07002293 if c, ok := to.(*Module); ok {
2294 if c.ToolchainLibrary() {
2295 // These are always allowed
2296 return
2297 }
2298 if c.NdkPrebuiltStl() {
2299 // These are allowed, but they don't set sdk_version
2300 return
2301 }
2302 if c.StubDecorator() {
2303 // These aren't real libraries, but are the stub shared libraries that are included in
2304 // the NDK.
2305 return
2306 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002307 }
Logan Chien834b9a62019-01-14 15:39:03 +08002308
Ivan Lozano52767be2019-10-18 14:49:46 -07002309 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002310 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2311 // to link to libc++ (non-NDK and without sdk_version).
2312 return
2313 }
2314
Ivan Lozano52767be2019-10-18 14:49:46 -07002315 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002316 // NDK code linking to platform code is never okay.
2317 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002318 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002319 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002320 }
2321
2322 // At this point we know we have two NDK libraries, but we need to
2323 // check that we're not linking against anything built against a higher
2324 // API level, as it is only valid to link against older or equivalent
2325 // APIs.
2326
Inseob Kim01a28722018-04-11 09:48:45 +09002327 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002328 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002329 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002330 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002331 // Current can't be linked against by anything else.
2332 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002333 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002334 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002335 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002336 if err != nil {
2337 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002338 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002339 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002340 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002341 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002342 if err != nil {
2343 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002344 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002345 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002346 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002347
Inseob Kim01a28722018-04-11 09:48:45 +09002348 if toApi > fromApi {
2349 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002350 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002351 }
2352 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002353 }
Dan Albert202fe492017-12-15 13:56:59 -08002354
2355 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002356 fromStl := from.SelectedStl()
2357 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002358 if fromStl == "" || toStl == "" {
2359 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002360 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002361 // We can be permissive with the system "STL" since it is only the C++
2362 // ABI layer, but in the future we should make sure that everyone is
2363 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002364 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002365 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002366 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2367 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002368 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002369}
2370
Jooyung Han479ca172020-10-19 18:51:07 +09002371func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2372 if c, ok := ctx.Module().(*Module); ok {
2373 ctx.VisitDirectDeps(func(dep android.Module) {
2374 depTag := ctx.OtherModuleDependencyTag(dep)
2375 ccDep, ok := dep.(LinkableInterface)
2376 if ok {
2377 checkLinkType(ctx, c, ccDep, depTag)
2378 }
2379 })
2380 }
2381}
2382
Jiyong Park5fb8c102018-04-09 12:03:06 +09002383// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002384// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2385// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002386// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002387func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2388 check := func(child, parent android.Module) bool {
2389 to, ok := child.(*Module)
2390 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002391 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002392 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002393
Jooyung Hana70f0672019-01-18 15:20:43 +09002394 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2395 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002396 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002397
Jiyong Park0474e1f2021-01-14 14:26:06 +09002398 // These dependencies are not excercised at runtime. Tracking these will give us
2399 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002400 depTag := ctx.OtherModuleDependencyTag(child)
2401 if IsHeaderDepTag(depTag) {
2402 return false
2403 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002404 if depTag == staticVariantTag {
2405 return false
2406 }
2407 if depTag == stubImplDepTag {
2408 return false
2409 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002410
Justin Yun63e9ec72020-10-29 16:49:43 +09002411 // Even if target lib has no vendor variant, keep checking dependency
2412 // graph in case it depends on vendor_available or product_available
2413 // but not double_loadable transtively.
2414 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002415 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002416 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002417
Jiyong Park0474e1f2021-01-14 14:26:06 +09002418 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2419 // one.
2420 if Bool(to.VendorProperties.Double_loadable) {
2421 return true
2422 }
2423
2424 if to.isVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002425 return false
2426 }
2427
Jooyung Hana70f0672019-01-18 15:20:43 +09002428 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2429 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002430 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002431 return false
2432 }
2433 if module, ok := ctx.Module().(*Module); ok {
2434 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002435 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002436 ctx.WalkDeps(check)
2437 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002438 }
2439 }
2440}
2441
Colin Cross0de8a1e2020-09-18 14:15:30 -07002442// Returns the highest version which is <= maxSdkVersion.
2443// For example, with maxSdkVersion is 10 and versionList is [9,11]
2444// it returns 9 as string. The list of stubs must be in order from
2445// oldest to newest.
Chris Parsons3c27ca32020-11-20 12:42:07 -05002446func (c *Module) chooseSdkVersion(ctx android.PathContext, stubsInfo []SharedStubLibrary,
2447 maxSdkVersion android.ApiLevel) (SharedStubLibrary, error) {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002448
2449 for i := range stubsInfo {
2450 stubInfo := stubsInfo[len(stubsInfo)-i-1]
2451 var ver android.ApiLevel
2452 if stubInfo.Version == "" {
2453 ver = android.FutureApiLevel
2454 } else {
2455 var err error
2456 ver, err = android.ApiLevelFromUser(ctx, stubInfo.Version)
2457 if err != nil {
Chris Parsons3c27ca32020-11-20 12:42:07 -05002458 return SharedStubLibrary{}, err
Colin Cross0de8a1e2020-09-18 14:15:30 -07002459 }
2460 }
2461 if ver.LessThanOrEqualTo(maxSdkVersion) {
2462 return stubInfo, nil
2463 }
2464 }
2465 var versionList []string
2466 for _, stubInfo := range stubsInfo {
2467 versionList = append(versionList, stubInfo.Version)
2468 }
Chris Parsons3c27ca32020-11-20 12:42:07 -05002469 return SharedStubLibrary{}, fmt.Errorf("not found a version(<=%s) in versionList: %v", maxSdkVersion.String(), versionList)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002470}
2471
Colin Crossc99deeb2016-04-11 15:06:20 -07002472// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002473func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002474 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002475
Colin Cross0de8a1e2020-09-18 14:15:30 -07002476 var directStaticDeps []StaticLibraryInfo
2477 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002478
Colin Cross0de8a1e2020-09-18 14:15:30 -07002479 reexportExporter := func(exporter FlagExporterInfo) {
2480 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2481 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2482 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2483 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2484 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002485 }
2486
Jooyung Hande34d232020-07-23 13:04:15 +09002487 // For the dependency from platform to apex, use the latest stubs
2488 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002489 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2490 if !apexInfo.IsForPlatform() {
2491 c.apexSdkVersion = apexInfo.MinSdkVersion(ctx)
Jooyung Hande34d232020-07-23 13:04:15 +09002492 }
2493
2494 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2495 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2496 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2497 // (b/144430859)
2498 c.apexSdkVersion = android.FutureApiLevel
2499 }
2500
Colin Crossd11fcda2017-10-23 17:59:01 -07002501 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002502 depName := ctx.OtherModuleName(dep)
2503 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002504
Ivan Lozano52767be2019-10-18 14:49:46 -07002505 ccDep, ok := dep.(LinkableInterface)
2506 if !ok {
2507
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002508 // handling for a few module types that aren't cc Module but that are also supported
2509 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002510 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002511 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002512 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2513 genRule.GeneratedSourceFiles()...)
2514 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002515 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002516 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002517 // Support exported headers from a generated_sources dependency
2518 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002519 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002520 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002521 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002522 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002523 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002524 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002525 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002526 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002527 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2528 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002529 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002530 // 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 +09002531 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002532
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002533 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002534 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002535 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002536 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002537 case linkerFlagsDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002538 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002539 files := genRule.GeneratedSourceFiles()
2540 if len(files) == 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002541 depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002542 } else if len(files) > 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002543 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 -07002544 }
2545 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002546 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002547 }
Colin Crossca860ac2016-01-04 14:34:37 -08002548 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002549 return
2550 }
2551
Colin Crossfe17f6f2019-03-28 19:30:56 -07002552 if depTag == android.ProtoPluginDepTag {
2553 return
2554 }
2555
Colin Crossd11fcda2017-10-23 17:59:01 -07002556 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002557 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2558 return
2559 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002560 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002561 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2562 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002563 return
2564 }
2565
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002566 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07002567 // Skip reused objects for stub libraries, they use their own stub object file instead.
2568 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
2569 // version mutator, so the stubs variant is created from the shared variant that
2570 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07002571 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07002572 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2573 objs := staticAnalogue.ReuseObjects
2574 depPaths.Objs = depPaths.Objs.Append(objs)
2575 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2576 reexportExporter(depExporterInfo)
2577 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002578 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002579 }
2580
Colin Cross6e511a92020-07-27 21:26:48 -07002581 linkFile := ccDep.OutputFile()
2582
2583 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2584 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002585 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002586 return
2587 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002588
Jiyong Parke3867542020-12-03 17:28:25 +09002589 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
2590 return
2591 }
2592
Colin Cross0de8a1e2020-09-18 14:15:30 -07002593 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002594
Colin Cross6e511a92020-07-27 21:26:48 -07002595 var ptr *android.Paths
2596 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002597
Colin Cross6e511a92020-07-27 21:26:48 -07002598 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002599
Colin Cross6e511a92020-07-27 21:26:48 -07002600 switch {
2601 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08002602 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
2603 if !ctx.Config().AllowMissingDependencies() {
2604 ctx.ModuleErrorf("module %q is not a header library", depName)
2605 } else {
2606 ctx.AddMissingDependencies([]string{depName})
2607 }
2608 return
2609 }
Colin Cross6e511a92020-07-27 21:26:48 -07002610 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002611 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2612 if !ctx.Config().AllowMissingDependencies() {
2613 ctx.ModuleErrorf("module %q is not a shared library", depName)
2614 } else {
2615 ctx.AddMissingDependencies([]string{depName})
2616 }
2617 return
2618 }
Jiyong Parke3867542020-12-03 17:28:25 +09002619
Colin Cross0de8a1e2020-09-18 14:15:30 -07002620 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
Chris Parsons3c27ca32020-11-20 12:42:07 -05002621 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002622
Chris Parsons3c27ca32020-11-20 12:42:07 -05002623 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002624 useStubs := false
Colin Cross31076b32020-10-23 17:22:06 -07002625
2626 if lib := moduleLibraryInterface(dep); lib.buildStubs() && c.UseVndk() { // LLNDK
Colin Cross0de8a1e2020-09-18 14:15:30 -07002627 if !apexInfo.IsForPlatform() {
2628 // For platform libraries, use current version of LLNDK
2629 // If this is for use_vendor apex we will apply the same rules
2630 // of apex sdk enforcement below to choose right version.
2631 useStubs = true
2632 }
2633 } else if apexInfo.IsForPlatform() {
2634 // If not building for APEX, use stubs only when it is from
2635 // an APEX (and not from platform)
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002636 // However, for host, ramdisk, vendor_ramdisk, recovery or bootstrap modules,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002637 // always link to non-stub variant
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09002638 useStubs = dep.(android.ApexModule).NotInPlatform() && !c.bootstrap()
Colin Cross0de8a1e2020-09-18 14:15:30 -07002639 // Another exception: if this module is bundled with an APEX, then
2640 // it is linked with the non-stub variant of a module in the APEX
2641 // as if this is part of the APEX.
2642 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
2643 for _, apexContents := range testFor.ApexContents {
2644 if apexContents.DirectlyInApex(depName) {
2645 useStubs = false
2646 break
2647 }
2648 }
2649 } else {
2650 // If building for APEX, use stubs when the parent is in any APEX that
2651 // the child is not in.
2652 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
2653 }
2654
2655 // when to use (unspecified) stubs, check min_sdk_version and choose the right one
2656 if useStubs {
2657 sharedLibraryStubsInfo, err :=
Chris Parsons3c27ca32020-11-20 12:42:07 -05002658 c.chooseSdkVersion(ctx, sharedLibraryStubsInfo.SharedStubLibraries, c.apexSdkVersion)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002659 if err != nil {
2660 ctx.OtherModuleErrorf(dep, err.Error())
2661 return
2662 }
2663 sharedLibraryInfo = sharedLibraryStubsInfo.SharedLibraryInfo
2664 depExporterInfo = sharedLibraryStubsInfo.FlagExporterInfo
2665 }
2666 }
2667
Jiyong Park1ad8e162020-12-01 23:40:09 +09002668 // Stubs lib doesn't link to the shared lib dependencies. Don't set
2669 // linkFile, depFile, and ptr.
2670 if c.IsStubs() {
2671 break
2672 }
2673
Colin Cross0de8a1e2020-09-18 14:15:30 -07002674 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2675 depFile = sharedLibraryInfo.TableOfContents
2676
Colin Cross6e511a92020-07-27 21:26:48 -07002677 ptr = &depPaths.SharedLibs
2678 switch libDepTag.Order {
2679 case earlyLibraryDependency:
2680 ptr = &depPaths.EarlySharedLibs
2681 depPtr = &depPaths.EarlySharedLibsDeps
2682 case normalLibraryDependency:
2683 ptr = &depPaths.SharedLibs
2684 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002685 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002686 case lateLibraryDependency:
2687 ptr = &depPaths.LateSharedLibs
2688 depPtr = &depPaths.LateSharedLibsDeps
2689 default:
2690 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002691 }
Colin Cross6e511a92020-07-27 21:26:48 -07002692 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002693 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2694 if !ctx.Config().AllowMissingDependencies() {
2695 ctx.ModuleErrorf("module %q is not a static library", depName)
2696 } else {
2697 ctx.AddMissingDependencies([]string{depName})
2698 }
2699 return
2700 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002701
2702 // Stubs lib doesn't link to the static lib dependencies. Don't set
2703 // linkFile, depFile, and ptr.
2704 if c.IsStubs() {
2705 break
2706 }
2707
Colin Cross0de8a1e2020-09-18 14:15:30 -07002708 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2709 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002710 if libDepTag.wholeStatic {
2711 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002712 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2713 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002714 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002715 // This case normally catches prebuilt static
2716 // libraries, but it can also occur when
2717 // AllowMissingDependencies is on and the
2718 // dependencies has no sources of its own
2719 // but has a whole_static_libs dependency
2720 // on a missing library. We want to depend
2721 // on the .a file so that there is something
2722 // in the dependency tree that contains the
2723 // error rule for the missing transitive
2724 // dependency.
2725 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002726 }
Colin Cross6e511a92020-07-27 21:26:48 -07002727 } else {
2728 switch libDepTag.Order {
2729 case earlyLibraryDependency:
2730 panic(fmt.Errorf("early static libs not suppported"))
2731 case normalLibraryDependency:
2732 // static dependencies will be handled separately so they can be ordered
2733 // using transitive dependencies.
2734 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002735 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002736 case lateLibraryDependency:
2737 ptr = &depPaths.LateStaticLibs
2738 default:
2739 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002740 }
2741 }
2742 }
2743
Colin Cross6e511a92020-07-27 21:26:48 -07002744 if libDepTag.static() && !libDepTag.wholeStatic {
2745 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2746 ctx.ModuleErrorf("module %q not a static library", depName)
2747 return
2748 }
Logan Chien43d34c32017-12-20 01:17:32 +08002749
Colin Cross6e511a92020-07-27 21:26:48 -07002750 // When combining coverage files for shared libraries and executables, coverage files
2751 // in static libraries act as if they were whole static libraries. The same goes for
2752 // source based Abi dump files.
2753 if c, ok := ccDep.(*Module); ok {
2754 staticLib := c.linker.(libraryInterface)
2755 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2756 staticLib.objs().coverageFiles...)
2757 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2758 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002759 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002760 // Handle non-CC modules here
2761 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002762 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002763 }
2764 }
2765
Colin Cross6e511a92020-07-27 21:26:48 -07002766 if ptr != nil {
2767 if !linkFile.Valid() {
2768 if !ctx.Config().AllowMissingDependencies() {
2769 ctx.ModuleErrorf("module %q missing output file", depName)
2770 } else {
2771 ctx.AddMissingDependencies([]string{depName})
2772 }
2773 return
2774 }
2775 *ptr = append(*ptr, linkFile.Path())
2776 }
2777
2778 if depPtr != nil {
2779 dep := depFile
2780 if !dep.Valid() {
2781 dep = linkFile
2782 }
2783 *depPtr = append(*depPtr, dep.Path())
2784 }
2785
Colin Cross0de8a1e2020-09-18 14:15:30 -07002786 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2787 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2788 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2789 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2790
2791 if libDepTag.reexportFlags {
2792 reexportExporter(depExporterInfo)
2793 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2794 // Re-exported shared library headers must be included as well since they can help us with type information
2795 // about template instantiations (instantiated from their headers).
2796 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2797 // scripts.
2798 c.sabi.Properties.ReexportedIncludes = append(
2799 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2800 }
2801
Colin Cross6e511a92020-07-27 21:26:48 -07002802 makeLibName := c.makeLibName(ctx, ccDep, depName) + libDepTag.makeSuffix
2803 switch {
2804 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002805 c.Properties.AndroidMkHeaderLibs = append(
2806 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002807 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07002808 if lib := moduleLibraryInterface(dep); lib != nil {
2809 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002810 // Add the dependency to the APEX(es) providing the library so that
2811 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002812 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
2813 for _, an := range depApexInfo.InApexes {
Colin Cross6e511a92020-07-27 21:26:48 -07002814 c.Properties.ApexesProvidingSharedLibs = append(
2815 c.Properties.ApexesProvidingSharedLibs, an)
2816 }
2817 }
2818 }
2819
2820 // Note: the order of libs in this list is not important because
2821 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002822 c.Properties.AndroidMkSharedLibs = append(
2823 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002824 // Record baseLibName for snapshots.
2825 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, baseLibName(depName))
2826 case libDepTag.static():
2827 if libDepTag.wholeStatic {
2828 c.Properties.AndroidMkWholeStaticLibs = append(
2829 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2830 } else {
2831 c.Properties.AndroidMkStaticLibs = append(
2832 c.Properties.AndroidMkStaticLibs, makeLibName)
2833 }
2834 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002835 } else if !c.IsStubs() {
2836 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
2837
Colin Cross6e511a92020-07-27 21:26:48 -07002838 switch depTag {
2839 case runtimeDepTag:
2840 c.Properties.AndroidMkRuntimeLibs = append(
2841 c.Properties.AndroidMkRuntimeLibs, c.makeLibName(ctx, ccDep, depName)+libDepTag.makeSuffix)
2842 // Record baseLibName for snapshots.
2843 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, baseLibName(depName))
2844 case objDepTag:
2845 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2846 case CrtBeginDepTag:
2847 depPaths.CrtBegin = linkFile
2848 case CrtEndDepTag:
2849 depPaths.CrtEnd = linkFile
2850 case dynamicLinkerDepTag:
2851 depPaths.DynamicLinker = linkFile
2852 }
Jiyong Park27b188b2017-07-18 13:23:39 +09002853 }
Colin Crossca860ac2016-01-04 14:34:37 -08002854 })
2855
Jeff Gaston294356f2017-09-27 17:05:30 -07002856 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07002857 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
2858 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
2859 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07002860
Colin Crossdd84e052017-05-17 13:44:16 -07002861 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07002862 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09002863 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
2864 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09002865 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09002866 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
2867 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07002868 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09002869 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09002870 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002871
2872 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09002873 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002874 }
Colin Crossdd84e052017-05-17 13:44:16 -07002875
Colin Crossca860ac2016-01-04 14:34:37 -08002876 return depPaths
2877}
2878
Colin Cross0de8a1e2020-09-18 14:15:30 -07002879// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
2880// to match the topological order of the dependency tree, including any static analogues of
2881// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
2882// of the transitive dependencies.
2883func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
2884 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
2885 var staticPaths android.Paths
2886 for _, staticDep := range staticDeps {
2887 staticPaths = append(staticPaths, staticDep.StaticLibrary)
2888 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
2889 }
2890 for _, sharedDep := range sharedDeps {
2891 if sharedDep.StaticAnalogue != nil {
2892 transitiveStaticLibsBuilder.Transitive(sharedDep.StaticAnalogue.TransitiveStaticLibrariesForOrdering)
2893 }
2894 }
2895 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
2896
2897 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
2898
2899 // reorder the dependencies based on transitive dependencies
2900 staticPaths = android.FirstUniquePaths(staticPaths)
2901 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
2902
2903 if len(orderedStaticPaths) != len(staticPaths) {
2904 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
2905 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
2906 }
2907
2908 return orderedStaticPaths, transitiveStaticLibs
2909}
2910
Colin Cross6e511a92020-07-27 21:26:48 -07002911// baseLibName trims known prefixes and suffixes
2912func baseLibName(depName string) string {
2913 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
2914 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00002915 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07002916 return libName
2917}
2918
2919func (c *Module) makeLibName(ctx android.ModuleContext, ccDep LinkableInterface, depName string) string {
2920 vendorSuffixModules := vendorSuffixModules(ctx.Config())
Jose Galmes6f843bc2020-12-11 13:36:29 -08002921 recoverySuffixModules := recoverySuffixModules(ctx.Config())
Colin Cross6e511a92020-07-27 21:26:48 -07002922 vendorPublicLibraries := vendorPublicLibraries(ctx.Config())
2923
2924 libName := baseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08002925 ccDepModule, _ := ccDep.(*Module)
2926 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Colin Cross6e511a92020-07-27 21:26:48 -07002927 isVendorPublicLib := inList(libName, *vendorPublicLibraries)
2928 bothVendorAndCoreVariantsExist := ccDep.HasVendorVariant() || isLLndk
2929
2930 if c, ok := ccDep.(*Module); ok {
2931 // Use base module name for snapshots when exporting to Makefile.
2932 if c.isSnapshotPrebuilt() {
2933 baseName := c.BaseModuleName()
2934
2935 if c.IsVndk() {
2936 return baseName + ".vendor"
2937 }
2938
Ivan Lozano3968d8f2020-12-14 11:27:52 -05002939 if c.InVendor() && vendorSuffixModules[baseName] {
Colin Cross6e511a92020-07-27 21:26:48 -07002940 return baseName + ".vendor"
Jose Galmes6f843bc2020-12-11 13:36:29 -08002941 } else if c.InRecovery() && recoverySuffixModules[baseName] {
2942 return baseName + ".recovery"
Colin Cross6e511a92020-07-27 21:26:48 -07002943 } else {
2944 return baseName
2945 }
2946 }
2947 }
2948
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002949 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
2950 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07002951 // The vendor module is a no-vendor-variant VNDK library. Depend on the
2952 // core module instead.
2953 return libName
2954 } else if c.UseVndk() && bothVendorAndCoreVariantsExist {
2955 // The vendor module in Make will have been renamed to not conflict with the core
2956 // module, so update the dependency name here accordingly.
2957 return libName + c.getNameSuffixWithVndkVersion(ctx)
2958 } else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
2959 return libName + vendorPublicLibrarySuffix
2960 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
2961 return libName + ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002962 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
2963 return libName + vendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07002964 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
2965 return libName + recoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05002966 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Colin Cross6e511a92020-07-27 21:26:48 -07002967 return libName + nativeBridgeSuffix
2968 } else {
2969 return libName
2970 }
2971}
2972
Colin Crossca860ac2016-01-04 14:34:37 -08002973func (c *Module) InstallInData() bool {
2974 if c.installer == nil {
2975 return false
2976 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002977 return c.installer.inData()
2978}
2979
2980func (c *Module) InstallInSanitizerDir() bool {
2981 if c.installer == nil {
2982 return false
2983 }
2984 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07002985 return true
2986 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07002987 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08002988}
2989
Yifan Hong1b3348d2020-01-21 15:53:22 -08002990func (c *Module) InstallInRamdisk() bool {
2991 return c.InRamdisk()
2992}
2993
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002994func (c *Module) InstallInVendorRamdisk() bool {
2995 return c.InVendorRamdisk()
2996}
2997
Jiyong Parkf9332f12018-02-01 00:54:12 +09002998func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07002999 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003000}
3001
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003002func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003003 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003004 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003005 return
3006 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003007 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003008}
3009
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003010func (c *Module) HostToolPath() android.OptionalPath {
3011 if c.installer == nil {
3012 return android.OptionalPath{}
3013 }
3014 return c.installer.hostToolPath()
3015}
3016
Nan Zhangd4e641b2017-07-12 12:55:28 -07003017func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3018 return c.outputFile
3019}
3020
Colin Cross41955e82019-05-29 14:40:35 -07003021func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3022 switch tag {
3023 case "":
3024 if c.outputFile.Valid() {
3025 return android.Paths{c.outputFile.Path()}, nil
3026 }
3027 return android.Paths{}, nil
3028 default:
3029 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003030 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003031}
3032
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003033func (c *Module) static() bool {
3034 if static, ok := c.linker.(interface {
3035 static() bool
3036 }); ok {
3037 return static.static()
3038 }
3039 return false
3040}
3041
Jiyong Park379de2f2018-12-19 02:47:14 +09003042func (c *Module) staticBinary() bool {
3043 if static, ok := c.linker.(interface {
3044 staticBinary() bool
3045 }); ok {
3046 return static.staticBinary()
3047 }
3048 return false
3049}
3050
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003051func (c *Module) testBinary() bool {
3052 if test, ok := c.linker.(interface {
3053 testBinary() bool
3054 }); ok {
3055 return test.testBinary()
3056 }
3057 return false
3058}
3059
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003060// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3061func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003062 if h, ok := c.linker.(interface {
3063 header() bool
3064 }); ok {
3065 return h.header()
3066 }
3067 return false
3068}
3069
Inseob Kim7f283f42020-06-01 21:53:49 +09003070func (c *Module) binary() bool {
3071 if b, ok := c.linker.(interface {
3072 binary() bool
3073 }); ok {
3074 return b.binary()
3075 }
3076 return false
3077}
3078
Inseob Kim1042d292020-06-01 23:23:05 +09003079func (c *Module) object() bool {
3080 if o, ok := c.linker.(interface {
3081 object() bool
3082 }); ok {
3083 return o.object()
3084 }
3085 return false
3086}
3087
Ivan Lozanof9e21722020-12-02 09:00:51 -05003088func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003089 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003090 if c.IsLlndk() {
3091 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003092 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003093 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003094 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003095 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003096 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003097 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003098 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003099 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003100 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003101 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003102 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003103 return "native:product"
3104 }
Jooyung Han38002912019-05-16 04:01:54 +09003105 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003106 } else if c.InRamdisk() {
3107 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003108 } else if c.InVendorRamdisk() {
3109 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003110 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003111 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003112 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003113 return "native:ndk:none:none"
3114 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3115 //family, link := getNdkStlFamilyAndLinkType(c)
3116 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003117 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003118 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003119 } else {
3120 return "native:platform"
3121 }
3122}
3123
Jiyong Park9d452992018-10-03 00:38:19 +09003124// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003125// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003126func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003127 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003128 // Stub libs and prebuilt libs in a versioned SDK are not
3129 // installable to APEX even though they are shared libs.
Colin Cross31076b32020-10-23 17:22:06 -07003130 return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01003131 } else if _, ok := c.linker.(testPerSrc); ok {
3132 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003133 }
3134 return false
3135}
3136
Jiyong Parka90ca002019-10-07 15:47:24 +09003137func (c *Module) AvailableFor(what string) bool {
3138 if linker, ok := c.linker.(interface {
3139 availableFor(string) bool
3140 }); ok {
3141 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3142 } else {
3143 return c.ApexModuleBase.AvailableFor(what)
3144 }
3145}
3146
Jiyong Park62304bb2020-04-13 16:19:48 +09003147func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003148 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003149}
3150
Colin Crossaede88c2020-08-11 12:17:01 -07003151func (c *Module) UniqueApexVariations() bool {
3152 if u, ok := c.compiler.(interface {
3153 uniqueApexVariations() bool
3154 }); ok {
3155 return u.uniqueApexVariations()
3156 } else {
3157 return false
3158 }
3159}
3160
Paul Duffin0cb37b92020-03-04 14:52:46 +00003161// Return true if the module is ever installable.
3162func (c *Module) EverInstallable() bool {
3163 return c.installer != nil &&
3164 // Check to see whether the module is actually ever installable.
3165 c.installer.everInstallable()
3166}
3167
Colin Cross56a83212020-09-15 18:30:11 -07003168func (c *Module) installable(apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003169 ret := c.EverInstallable() &&
3170 // Check to see whether the module has been configured to not be installed.
3171 proptools.BoolDefault(c.Properties.Installable, true) &&
3172 !c.Properties.PreventInstall && c.outputFile.Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003173
3174 // The platform variant doesn't need further condition. Apex variants however might not
3175 // be installable because it will likely to be included in the APEX and won't appear
3176 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003177 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003178 return ret
3179 }
3180
3181 // Special case for modules that are configured to be installed to /data, which includes
3182 // test modules. For these modules, both APEX and non-APEX variants are considered as
3183 // installable. This is because even the APEX variants won't be included in the APEX, but
3184 // will anyway be installed to /data/*.
3185 // See b/146995717
3186 if c.InstallInData() {
3187 return ret
3188 }
3189
3190 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003191}
3192
Logan Chien41eabe62019-04-10 13:33:58 +08003193func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3194 if c.linker != nil {
3195 if library, ok := c.linker.(*libraryDecorator); ok {
3196 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3197 }
3198 }
3199}
3200
Jiyong Park45bf82e2020-12-15 22:29:02 +09003201var _ android.ApexModule = (*Module)(nil)
3202
3203// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003204func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003205 depTag := ctx.OtherModuleDependencyTag(dep)
3206 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3207
3208 if cc, ok := dep.(*Module); ok {
3209 if cc.HasStubsVariants() {
3210 if isLibDepTag && libDepTag.shared() {
3211 // dynamic dep to a stubs lib crosses APEX boundary
3212 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003213 }
Colin Cross6e511a92020-07-27 21:26:48 -07003214 if IsRuntimeDepTag(depTag) {
3215 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003216 return false
3217 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003218 }
Colin Crossaac32222020-07-29 12:51:56 -07003219 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003220 // shared_lib dependency from a static lib is considered as crossing
3221 // the APEX boundary because the dependency doesn't actually is
3222 // linked; the dependency is used only during the compilation phase.
3223 return false
3224 }
Jiyong Parke3867542020-12-03 17:28:25 +09003225
3226 if isLibDepTag && libDepTag.excludeInApex {
3227 return false
3228 }
Colin Cross6e511a92020-07-27 21:26:48 -07003229 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003230 if depTag == stubImplDepTag || depTag == llndkStubDepTag {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003231 // We don't track beyond LLNDK or from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003232 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003233 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003234 if depTag == staticVariantTag {
3235 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3236 // actually mean that the static lib (and its dependencies) are copied into the
3237 // APEX.
3238 return false
3239 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003240 return true
3241}
3242
Jiyong Park45bf82e2020-12-15 22:29:02 +09003243// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003244func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3245 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003246 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3247 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3248 return nil
3249 }
3250 // b/154569636: set min_sdk_version correctly for toolchain_libraries
3251 if c.ToolchainLibrary() {
3252 return nil
3253 }
3254 // We don't check for prebuilt modules
3255 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3256 return nil
3257 }
3258 minSdkVersion := c.MinSdkVersion()
3259 if minSdkVersion == "apex_inherit" {
3260 return nil
3261 }
3262 if minSdkVersion == "" {
3263 // JNI libs within APK-in-APEX fall into here
3264 // Those are okay to set sdk_version instead
3265 // We don't have to check if this is a SDK variant because
3266 // non-SDK variant resets sdk_version, which works too.
3267 minSdkVersion = c.SdkVersion()
3268 }
Dan Albertc8060532020-07-22 22:32:17 -07003269 if minSdkVersion == "" {
3270 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3271 }
3272 // Not using nativeApiLevelFromUser because the context here is not
3273 // necessarily a native context.
3274 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003275 if err != nil {
3276 return err
3277 }
Dan Albertc8060532020-07-22 22:32:17 -07003278
3279 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003280 return fmt.Errorf("newer SDK(%v)", ver)
3281 }
3282 return nil
3283}
3284
Colin Cross2ba19d92015-05-07 15:44:20 -07003285//
Colin Crosscfad1192015-11-02 16:43:11 -08003286// Defaults
3287//
Colin Crossca860ac2016-01-04 14:34:37 -08003288type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07003289 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07003290 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09003291 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08003292}
3293
Patrice Arrudac249c712019-03-19 17:00:29 -07003294// cc_defaults provides a set of properties that can be inherited by other cc
3295// modules. A module can use the properties from a cc_defaults using
3296// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3297// merged (when possible) by prepending the default module's values to the
3298// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003299func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003300 return DefaultsFactory()
3301}
3302
Colin Cross36242852017-06-23 15:06:31 -07003303func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003304 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003305
Colin Cross36242852017-06-23 15:06:31 -07003306 module.AddProperties(props...)
3307 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003308 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003309 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003310 &BaseCompilerProperties{},
3311 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003312 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003313 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003314 &StaticProperties{},
3315 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003316 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003317 &BinaryLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003318 &TestProperties{},
3319 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003320 &BenchmarkProperties{},
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -07003321 &FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003322 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003323 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003324 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003325 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003326 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003327 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003328 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003329 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003330 &LTOProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003331 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003332 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003333 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3334 &RustBindgenClangProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003335 )
Colin Crosscfad1192015-11-02 16:43:11 -08003336
Jooyung Hancc372c52019-09-25 15:18:44 +09003337 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003338
3339 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003340}
3341
Jiyong Park2286afd2020-06-16 21:58:53 +09003342func (c *Module) IsSdkVariant() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07003343 return c.Properties.IsSdkVariant || c.AlwaysSdk()
Jiyong Park2286afd2020-06-16 21:58:53 +09003344}
3345
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003346func kytheExtractAllFactory() android.Singleton {
3347 return &kytheExtractAllSingleton{}
3348}
3349
3350type kytheExtractAllSingleton struct {
3351}
3352
3353func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3354 var xrefTargets android.Paths
3355 ctx.VisitAllModules(func(module android.Module) {
3356 if ccModule, ok := module.(xref); ok {
3357 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3358 }
3359 })
3360 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3361 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003362 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003363 }
3364}
3365
Colin Cross06a931b2015-10-28 17:23:31 -07003366var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003367var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003368var BoolPtr = proptools.BoolPtr
3369var String = proptools.String
3370var StringPtr = proptools.StringPtr