blob: f04b6f05418e2d5a5d133412186079031de42d40 [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"
hamzehc0a671f2021-07-22 12:05:08 -070032 "android/soong/fuzz"
Colin Cross5049f022015-03-18 13:28:46 -070033 "android/soong/genrule"
Rob Seymour925aa092021-08-10 20:42:03 +000034 "android/soong/snapshot"
Colin Cross3f40fa42015-01-30 17:27:36 -080035)
36
Colin Cross463a90e2015-06-17 14:20:06 -070037func init() {
Paul Duffin036e7002019-12-19 19:16:28 +000038 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -070039
Paul Duffin036e7002019-12-19 19:16:28 +000040 pctx.Import("android/soong/cc/config")
41}
42
43func RegisterCCBuildComponents(ctx android.RegistrationContext) {
44 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
45
46 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossc511bc52020-04-07 16:50:32 +000047 ctx.BottomUp("sdk", sdkMutator).Parallel()
Inseob Kim64c43952019-08-26 16:52:35 +090048 ctx.BottomUp("vndk", VndkMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070049 ctx.BottomUp("link", LinkageMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +010050 ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
Colin Crossd1f898e2020-08-18 18:35:15 -070051 ctx.BottomUp("version", versionMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070052 ctx.BottomUp("begin", BeginMutator).Parallel()
Inseob Kimac1e9862019-12-09 18:15:47 +090053 ctx.BottomUp("sysprop_cc", SyspropMutator).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070054 })
Colin Cross16b23492016-01-06 14:41:07 -080055
Paul Duffin036e7002019-12-19 19:16:28 +000056 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -040057 for _, san := range Sanitizers {
58 san.registerMutators(ctx)
59 }
Dan Willemsen581341d2017-02-09 16:16:31 -080060
Colin Cross0b908332019-06-19 23:00:20 -070061 ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel()
Jiyong Park379de2f2018-12-19 02:47:14 +090062 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
Ivan Lozano30c5db22018-02-21 15:49:20 -080063
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -080064 ctx.BottomUp("coverage", coverageMutator).Parallel()
Stephen Craneba090d12017-05-09 15:44:35 -070065
Yi Kongeb8efc92021-12-09 18:06:29 +080066 ctx.TopDown("afdo_deps", afdoDepsMutator)
67 ctx.BottomUp("afdo", afdoMutator).Parallel()
68
Stephen Craneba090d12017-05-09 15:44:35 -070069 ctx.TopDown("lto_deps", ltoDepsMutator)
70 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090071
Jooyung Han479ca172020-10-19 18:51:07 +090072 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090073 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070074 })
Colin Crossb98c8b02016-07-29 13:44:28 -070075
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080076 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
77 // sabi mutator needs to be run after apex mutator finishes.
78 ctx.TopDown("sabi_deps", sabiDepsMutator)
79 })
80
Colin Cross57898582020-10-29 18:25:19 -070081 ctx.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070082}
83
Chris Parsonsef6e0cf2020-12-01 18:26:21 -050084// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
85// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
86// edges to these modules.
87// This object is constructed in DepsMutator, by calling to various module delegates to set
88// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
89// dependencies.
90// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
91// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -080092type Deps struct {
93 SharedLibs, LateSharedLibs []string
94 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -080095 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +080096 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -070097
Colin Cross3e5e7782022-06-17 22:17:05 +000098 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
99 // prevent automatically exporting symbols.
100 UnexportedStaticLibs []string
101
Chris Parsons79d66a52020-06-05 17:26:16 -0400102 // Used for data dependencies adjacent to tests
103 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700104 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400105
Yo Chiang219968c2020-09-22 18:45:04 +0800106 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
107 SystemSharedLibs []string
108
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500109 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800110 StaticUnwinderIfLegacy bool
111
Colin Cross5950f382016-12-13 12:50:57 -0800112 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700113
Colin Cross81413472016-04-11 14:37:39 -0700114 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700115
Dan Willemsenb40aab62016-04-20 14:21:14 -0700116 GeneratedSources []string
117 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900118 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700119
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700120 ReexportGeneratedHeaders []string
121
Colin Crossc465efd2021-06-11 18:00:04 -0700122 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700123
124 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700125 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900126
127 // List of libs that need to be excluded for APEX variant
128 ExcludeLibsForApex []string
Colin Crossc472d572015-03-17 15:06:21 -0700129}
130
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500131// PathDeps is a struct containing file paths to dependencies of a module.
132// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
133// It's used to construct flags for various build statements (such as for compiling and linking).
134// It is then passed to module decorator functions responsible for registering build statements
135// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800136type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700137 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900138 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700139 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900140 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700141 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700142 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700143
Colin Cross0de8a1e2020-09-18 14:15:30 -0700144 // Transitive static library dependencies of static libraries for use in ordering.
145 TranstiveStaticLibrariesForOrdering *android.DepSet
146
Colin Cross26c34ed2016-09-30 17:10:16 -0700147 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100148 Objs Objects
149 // Paths to .o files in dependencies that provide them. Note that these lists
150 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800151 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700152 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700153
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100154 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
155 // the libs from all whole_static_lib dependencies.
156 WholeStaticLibsFromPrebuilts android.Paths
157
Colin Cross26c34ed2016-09-30 17:10:16 -0700158 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700159 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900160 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700161
Inseob Kimd110f872019-12-06 13:15:38 +0900162 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000163 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900164 IncludeDirs android.Paths
165 SystemIncludeDirs android.Paths
166 ReexportedDirs android.Paths
167 ReexportedSystemDirs android.Paths
168 ReexportedFlags []string
169 ReexportedGeneratedHeaders android.Paths
170 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700171
Colin Cross26c34ed2016-09-30 17:10:16 -0700172 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700173 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700174
Dan Willemsena0790e32018-10-12 00:24:23 -0700175 // Path to the dynamic linker binary
176 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700177
178 // For Darwin builds, the path to the second architecture's output that should
179 // be combined with this architectures's output into a FAT MachO file.
180 DarwinSecondArchOutput android.OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700181}
182
Colin Cross4af21ed2019-11-04 09:37:55 -0800183// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
184// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
185// command line so they can be overridden by the local module flags).
186type LocalOrGlobalFlags struct {
187 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700188 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800189 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700190 CFlags []string // Flags that apply to C and C++ source files
191 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
192 ConlyFlags []string // Flags that apply to C source files
193 CppFlags []string // Flags that apply to C++ source files
194 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700195 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800196}
197
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500198// Flags contains various types of command line flags (and settings) for use in building build
199// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800200type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500201 // Local flags (which individual modules are responsible for). These may override global flags.
202 Local LocalOrGlobalFlags
203 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800204 Global LocalOrGlobalFlags
205
206 aidlFlags []string // Flags that apply to aidl source files
207 rsFlags []string // Flags that apply to renderscript source files
208 libFlags []string // Flags to add libraries early to the link order
209 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
210 TidyFlags []string // Flags that apply to clang-tidy
211 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700212
Colin Crossc3199482017-03-30 15:03:04 -0700213 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800214 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700215 SystemIncludeFlags []string
216
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800217 Toolchain config.Toolchain
218 Tidy bool // True if ninja .tidy rules should be generated.
219 NeedTidyFiles bool // True if module link should depend on .tidy files
220 GcovCoverage bool // True if coverage files should be generated.
221 SAbiDump bool // True if header abi dumps should be generated.
222 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800223
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500224 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800225 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500226 // The target-device system path to the dynamic linker.
227 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800228
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700229 CFlagsDeps android.Paths // Files depended on by compiler flags
230 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800231
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500232 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700233 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800234
Colin Cross19878da2019-03-28 14:45:07 -0700235 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700236 protoC bool // Whether to use C instead of C++
237 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700238
239 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200240 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700241}
242
Colin Crossca860ac2016-01-04 14:34:37 -0800243// Properties used to compile all C or C++ modules
244type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700245 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800246 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700247
Jiyong Parkb35a8192020-08-10 15:59:36 +0900248 // The API level that this module is built against. The APIs of this API level will be
249 // visible at build time, but use of any APIs newer than min_sdk_version will render the
250 // module unloadable on older devices. In the future it will be possible to weakly-link new
251 // APIs, making the behavior match Java: such modules will load on older devices, but
252 // calling new APIs on devices that do not support them will result in a crash.
253 //
254 // This property has the same behavior as sdk_version does for Java modules. For those
255 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
256 // does for Java code.
257 //
258 // In addition, setting this property causes two variants to be built, one for the platform
259 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800260 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700261
Jiyong Parkb35a8192020-08-10 15:59:36 +0900262 // Minimum OS API level supported by this C or C++ module. This property becomes the value
263 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
264 // this property is also used to ensure that the min_sdk_version of the containing module is
265 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
266 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
267 // min_sdk_version of the containing APEX. When the module
268 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900269 Min_sdk_version *string
270
Colin Crossc511bc52020-04-07 16:50:32 +0000271 // If true, always create an sdk variant and don't create a platform variant.
272 Sdk_variant_only *bool
273
Jiyong Parkde866cb2018-12-07 23:08:36 +0900274 AndroidMkSharedLibs []string `blueprint:"mutated"`
275 AndroidMkStaticLibs []string `blueprint:"mutated"`
276 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
277 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700278 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900279 HideFromMake bool `blueprint:"mutated"`
280 PreventInstall bool `blueprint:"mutated"`
281 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700282
Yo Chiang219968c2020-09-22 18:45:04 +0800283 // Set by DepsMutator.
284 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
285
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200286 // The name of the image this module is built for, suffixed with a '.'
Justin Yun5f7f7e82019-11-18 19:52:14 +0900287 ImageVariationPrefix string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200288
289 // The VNDK version this module is built against. If empty, the module is not
290 // build against the VNDK.
291 VndkVersion string `blueprint:"mutated"`
292
293 // Suffix for the name of Android.mk entries generated by this module
294 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800295
296 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
297 // file
298 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900299
Yifan Hong39143a92020-10-26 12:43:12 -0700300 // Make this module available when building for ramdisk.
301 // On device without a dedicated recovery partition, the module is only
302 // available after switching root into
303 // /first_stage_ramdisk. To expose the module before switching root, install
304 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800305 Ramdisk_available *bool
306
Yifan Hong39143a92020-10-26 12:43:12 -0700307 // Make this module available when building for vendor ramdisk.
308 // On device without a dedicated recovery partition, the module is only
309 // available after switching root into
310 // /first_stage_ramdisk. To expose the module before switching root, install
311 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700312 Vendor_ramdisk_available *bool
313
Jiyong Parkf9332f12018-02-01 00:54:12 +0900314 // Make this module available when building for recovery
315 Recovery_available *bool
316
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200317 // Used by imageMutator, set by ImageMutatorBegin()
318 CoreVariantNeeded bool `blueprint:"mutated"`
319 RamdiskVariantNeeded bool `blueprint:"mutated"`
320 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
321 RecoveryVariantNeeded bool `blueprint:"mutated"`
322
323 // A list of variations for the "image" mutator of the form
324 //<image name> '.' <version char>, for example, 'vendor.S'
325 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900326
327 // Allows this module to use non-APEX version of libraries. Useful
328 // for building binaries that are started before APEXes are activated.
329 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900330
331 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
332 // see soong/cc/config/vndk.go
333 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900334
335 // Used by vendor snapshot to record dependencies from snapshot modules.
336 SnapshotSharedLibs []string `blueprint:"mutated"`
Justin Yun5e035862021-06-29 20:50:37 +0900337 SnapshotStaticLibs []string `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900338 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000339
Colin Cross1bc94122021-10-28 13:25:54 -0700340 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000341
342 // Set by factories of module types that can only be referenced from variants compiled against
343 // the SDK.
344 AlwaysSdk bool `blueprint:"mutated"`
345
346 // Variant is an SDK variant created by sdkMutator
347 IsSdkVariant bool `blueprint:"mutated"`
348 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
349 // variant to have a ".sdk" suffix.
350 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700351
352 // Normally Soong uses the directory structure to decide which modules
353 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800354 // different snapshots (vendor, recovery, etc.), but this property
355 // allows a partner to exclude a module normally thought of as a
356 // framework module from the vendor snapshot.
357 Exclude_from_vendor_snapshot *bool
358
359 // Normally Soong uses the directory structure to decide which modules
360 // should be included (framework) or excluded (non-framework) from the
361 // different snapshots (vendor, recovery, etc.), but this property
362 // allows a partner to exclude a module normally thought of as a
363 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800364 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900365
366 // List of APEXes that this module has private access to for testing purpose. The module
367 // can depend on libraries that are not exported by the APEXes and use private symbols
368 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000369 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800370
371 Target struct {
372 Platform struct {
373 // List of modules required by the core variant.
374 Required []string `android:"arch_variant"`
375
376 // List of modules not required by the core variant.
377 Exclude_required []string `android:"arch_variant"`
378 } `android:"arch_variant"`
379
380 Recovery struct {
381 // List of modules required by the recovery variant.
382 Required []string `android:"arch_variant"`
383
384 // List of modules not required by the recovery variant.
385 Exclude_required []string `android:"arch_variant"`
386 } `android:"arch_variant"`
387 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700388}
389
390type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900391 // whether this module should be allowed to be directly depended by other
392 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900393 // If set to true, two variants will be built separately, one like
394 // normal, and the other limited to the set of libraries and headers
395 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700396 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900397 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700398 // so it shouldn't have any unversioned runtime dependencies, or
399 // make assumptions about the system that may not be true in the
400 // future.
401 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900402 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900403 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900404 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900405 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900406 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700407 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
408 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900409
Justin Yunebcf0c52021-01-08 18:00:19 +0900410 // This is the same as the "vendor_available" except that the install path
411 // of the vendor variant is /odm or /vendor/odm.
412 // By replacing "vendor_available: true" with "odm_available: true", the
413 // module will install its vendor variant to the /odm partition or /vendor/odm.
414 // As the modules with "odm_available: true" still create the vendor variants,
415 // they can link to the other vendor modules as the vendor_available modules do.
416 // Also, the vendor modules can link to odm_available modules.
417 //
418 // It may not be used for VNDK modules.
419 Odm_available *bool
420
Justin Yun63e9ec72020-10-29 16:49:43 +0900421 // whether this module should be allowed to be directly depended by other
422 // modules with `product_specific: true` or `product_available: true`.
423 // If set to true, an additional product variant will be built separately
424 // that is limited to the set of libraries and headers that are exposed to
425 // /product modules.
426 //
427 // The product variant may be used with a different (newer) /system,
428 // so it shouldn't have any unversioned runtime dependencies, or
429 // make assumptions about the system that may not be true in the
430 // future.
431 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900432 // If set to false, this module becomes inaccessible from /product modules.
433 //
434 // Different from the 'vendor_available' property, the modules with
435 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
436 // library without 'product_available' may not be depended on by any other
437 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900438 //
439 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
440 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
441 Product_available *bool
442
Jiyong Park5fb8c102018-04-09 12:03:06 +0900443 // whether this module is capable of being loaded with other instance
444 // (possibly an older version) of the same module in the same process.
445 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
446 // can be double loaded in a vendor process if the library is also a
447 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
448 // explicitly marked as `double_loadable: true` by the owner, or the dependency
449 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
450 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800451
452 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
453 IsLLNDK bool `blueprint:"mutated"`
454
Colin Cross78212242021-01-06 14:51:30 -0800455 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
456 // set and the module is not listed in VndkMustUseVendorVariantList.
457 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
458
459 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
460 IsVNDKCore bool `blueprint:"mutated"`
461
462 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
463 IsVNDKSP bool `blueprint:"mutated"`
464
465 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
466 // module sets the llndk.private property.
467 IsVNDKPrivate bool `blueprint:"mutated"`
468
469 // IsVNDKProduct is set if a VNDK module sets the product_available property.
470 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700471
472 // IsVendorPublicLibrary is set for the core and product variants of a library that has
473 // vendor_public_library stubs.
474 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800475}
476
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500477// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
478// to understanding details about the type of the current module.
479// For example, one might call these functions to determine whether the current module is a static
480// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800481type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800482 static() bool
483 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700484 testBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900485 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900486 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900487 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700488 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900489 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700490 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800491 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900492 minSdkVersion() string
493 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700494 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700495 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800496 IsLlndk() bool
497 IsLlndkPublic() bool
498 isImplementationForLLNDKPublic() bool
499 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900500 isVndk() bool
501 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500502 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700503 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900504 inProduct() bool
505 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800506 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700507 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900508 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700509 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700510 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800511 getVndkExtendsModuleName() string
Yi Kong4ef54592022-02-14 20:00:10 +0800512 isAfdoCompile() bool
Yi Kong7e53c572018-02-14 18:16:12 +0800513 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800514 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800515 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800516 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700517 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700518 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900519 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800520 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700521 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700522 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800523 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800524 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800525 getSharedFlags() *SharedFlags
526}
527
528type SharedFlags struct {
529 numSharedFlags int
530 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800531}
532
533type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700534 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800535 ModuleContextIntf
536}
537
538type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700539 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800540 ModuleContextIntf
541}
542
Colin Cross37047f12016-12-13 17:06:13 -0800543type DepsContext interface {
544 android.BottomUpMutatorContext
545 ModuleContextIntf
546}
547
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500548// feature represents additional (optional) steps to building cc-related modules, such as invocation
549// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800550type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800551 flags(ctx ModuleContext, flags Flags) Flags
552 props() []interface{}
553}
554
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500555// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500556// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800557type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700558 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800559 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800560 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700561 compilerProps() []interface{}
562
Colin Cross76fada02016-07-27 10:31:13 -0700563 appendCflags([]string)
564 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700565 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800566}
567
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500568// linker is the interface for a linker decorator object. Individual module types can provide
569// their own implementation for this decorator, and thus specify custom logic regarding build
570// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800571type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700572 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800573 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700574 linkerFlags(ctx ModuleContext, flags Flags) Flags
575 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800576 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700577
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700578 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700579 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900580 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700581
582 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900583 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000584
585 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000586 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
587}
588
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500589// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000590type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500591 sharedLibs []string
592 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
593 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700594 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800595}
596
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500597// installer is the interface for an installer helper object. This helper is responsible for
598// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800599type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700600 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700601 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000602 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800603 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700604 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700605 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900606 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100607 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900608 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800609}
610
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800611type xref interface {
612 XrefCcFiles() android.Paths
613}
614
Colin Cross6e511a92020-07-27 21:26:48 -0700615type libraryDependencyKind int
616
617const (
618 headerLibraryDependency = iota
619 sharedLibraryDependency
620 staticLibraryDependency
621)
622
623func (k libraryDependencyKind) String() string {
624 switch k {
625 case headerLibraryDependency:
626 return "headerLibraryDependency"
627 case sharedLibraryDependency:
628 return "sharedLibraryDependency"
629 case staticLibraryDependency:
630 return "staticLibraryDependency"
631 default:
632 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
633 }
634}
635
636type libraryDependencyOrder int
637
638const (
639 earlyLibraryDependency = -1
640 normalLibraryDependency = 0
641 lateLibraryDependency = 1
642)
643
644func (o libraryDependencyOrder) String() string {
645 switch o {
646 case earlyLibraryDependency:
647 return "earlyLibraryDependency"
648 case normalLibraryDependency:
649 return "normalLibraryDependency"
650 case lateLibraryDependency:
651 return "lateLibraryDependency"
652 default:
653 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
654 }
655}
656
657// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
658// tags that have a set of predefined tag objects that are reused for each dependency, a
659// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
660// That means that comparing a libraryDependencyTag for equality will only be equal if all
661// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
662// then check individual metadata fields instead.
663type libraryDependencyTag struct {
664 blueprint.BaseDependencyTag
665
666 // These are exported so that fmt.Printf("%#v") can call their String methods.
667 Kind libraryDependencyKind
668 Order libraryDependencyOrder
669
670 wholeStatic bool
671
672 reexportFlags bool
673 explicitlyVersioned bool
674 dataLib bool
675 ndk bool
676
677 staticUnwinder bool
678
679 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900680
Cindy Zhou18417cb2020-12-10 07:12:38 -0800681 // Whether or not this dependency should skip the apex dependency check
682 skipApexAllowedDependenciesCheck bool
683
Jiyong Parke3867542020-12-03 17:28:25 +0900684 // Whether or not this dependency has to be followed for the apex variants
685 excludeInApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000686
687 // If true, don't automatically export symbols from the static library into a shared library.
688 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700689}
690
691// header returns true if the libraryDependencyTag is tagging a header lib dependency.
692func (d libraryDependencyTag) header() bool {
693 return d.Kind == headerLibraryDependency
694}
695
696// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
697func (d libraryDependencyTag) shared() bool {
698 return d.Kind == sharedLibraryDependency
699}
700
701// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
702func (d libraryDependencyTag) static() bool {
703 return d.Kind == staticLibraryDependency
704}
705
Colin Cross65cb3142021-12-10 23:05:02 +0000706func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
707 if d.shared() {
708 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
709 }
710 return nil
711}
712
713var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
714
Colin Crosse9fe2942020-11-10 18:12:15 -0800715// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
716// binaries or other shared libraries are installed as dependencies.
717func (d libraryDependencyTag) InstallDepNeeded() bool {
718 return d.shared()
719}
720
721var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
722
723// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700724// libraryDependencyTag. Each tag object is created globally and reused for multiple
725// dependencies (although since the object contains no references, assigning a tag to a
726// variable and modifying it will not modify the original). Users can compare the tag
727// returned by ctx.OtherModuleDependencyTag against the global original
728type dependencyTag struct {
729 blueprint.BaseDependencyTag
730 name string
731}
732
Colin Crosse9fe2942020-11-10 18:12:15 -0800733// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
734// libraryDependencyTag, but where the dependency needs to be installed when the parent is
735// installed.
736type installDependencyTag struct {
737 blueprint.BaseDependencyTag
738 android.InstallAlwaysNeededDependencyTag
739 name string
740}
741
Colin Crossc99deeb2016-04-11 15:06:20 -0700742var (
Colin Cross6e511a92020-07-27 21:26:48 -0700743 genSourceDepTag = dependencyTag{name: "gen source"}
744 genHeaderDepTag = dependencyTag{name: "gen header"}
745 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
746 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900747 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700748 reuseObjTag = dependencyTag{name: "reuse objects"}
749 staticVariantTag = dependencyTag{name: "static variant"}
750 vndkExtDepTag = dependencyTag{name: "vndk extends"}
751 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700752 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800753 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700754 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700755 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000756 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700757)
758
Roland Levillainf89cd092019-07-29 16:22:59 +0100759func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700760 ccLibDepTag, ok := depTag.(libraryDependencyTag)
761 return ok && ccLibDepTag.shared()
762}
763
764func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
765 ccLibDepTag, ok := depTag.(libraryDependencyTag)
766 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100767}
768
Zach Johnson3df4e632020-11-06 11:56:27 -0800769func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
770 ccLibDepTag, ok := depTag.(libraryDependencyTag)
771 return ok && ccLibDepTag.header()
772}
773
Roland Levillainf89cd092019-07-29 16:22:59 +0100774func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800775 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100776}
777
778func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700779 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100780 return ok && ccDepTag == testPerSrcDepTag
781}
782
Chris Parsonsf874e462022-05-10 13:50:12 -0400783// bazelHandler is the interface for a helper object related to deferring to Bazel for
784// processing a cc module (during Bazel mixed builds). Individual module types should define
785// their own bazel handler if they support being handled by Bazel.
786type BazelHandler interface {
787 // QueueBazelCall invokes request-queueing functions on the BazelContext
788 //so that these requests are handled when Bazel's cquery is invoked.
789 QueueBazelCall(ctx android.BaseModuleContext, label string)
790
791 // ProcessBazelQueryResponse uses information retrieved from Bazel to set properties
792 // on the current module with given label.
793 ProcessBazelQueryResponse(ctx android.ModuleContext, label string)
794}
795
Colin Crossca860ac2016-01-04 14:34:37 -0800796// Module contains the properties and members used by all C/C++ module types, and implements
797// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500798// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
799// interface.
800//
801// To define a C/C++ related module, construct a new Module object and point its delegates to
802// type-specific structs. These delegates will be invoked to register module-specific build
803// statements which may be unique to the module type. For example, module.compiler.compile() should
804// be defined so as to register build statements which are responsible for compiling the module.
805//
806// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
807// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
808// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
809// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800810type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700811 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700812
Jiyong Parkd1063c12019-07-17 20:08:41 +0900813 android.SdkBase
Liz Kammerea6666f2021-02-17 10:17:28 -0500814 android.BazelModuleBase
Colin Crossc472d572015-03-17 15:06:21 -0700815
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700816 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700817 Properties BaseProperties
Colin Crossfa138792015-04-24 17:31:52 -0700818
Colin Crossca860ac2016-01-04 14:34:37 -0800819 // initialize before calling Init
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400820 hod android.HostOrDeviceSupported
821 multilib android.Multilib
822 bazelable bool
Colin Crossc472d572015-03-17 15:06:21 -0700823
Paul Duffina0843f62019-12-13 19:50:38 +0000824 // Allowable SdkMemberTypes of this module type.
825 sdkMemberTypes []android.SdkMemberType
826
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500827 // decorator delegates, initialize before calling Init
828 // these may contain module-specific implementations, and effectively allow for custom
829 // type-specific logic. These members may reference different objects or the same object.
830 // Functions of these decorators will be invoked to initialize and register type-specific
831 // build statements.
Chris Parsons8d6e4332021-02-22 16:13:50 -0500832 compiler compiler
833 linker linker
834 installer installer
Chris Parsonsf874e462022-05-10 13:50:12 -0400835 bazelHandler BazelHandler
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500836
837 features []feature
838 stl *stl
839 sanitize *sanitize
840 coverage *coverage
841 sabi *sabi
842 vndkdep *vndkdep
843 lto *lto
Yi Kongeb8efc92021-12-09 18:06:29 +0800844 afdo *afdo
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500845 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800846
Colin Cross31076b32020-10-23 17:22:06 -0700847 library libraryInterface
848
Colin Cross635c3b02016-05-18 15:37:25 -0700849 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800850
Colin Crossb98c8b02016-07-29 13:44:28 -0700851 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700852
853 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800854
855 // Flags used to compile this module
856 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700857
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800858 // Shared flags among build rules of this module
859 sharedFlags SharedFlags
860
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800861 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700862 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900863
864 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800865 // Kythe (source file indexer) paths for this compilation module
866 kytheFiles android.Paths
Chih-Hung Hsieh80783772021-10-11 16:46:56 -0700867 // Object .o file output paths for this compilation module
868 objFiles android.Paths
869 // Tidy .tidy file output paths for this compilation module
870 tidyFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900871
872 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700873 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700874
875 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700876}
877
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200878func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400879 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
880 if b, ok := c.compiler.(*baseCompiler); ok {
881 hasAidl = b.hasSrcExt(".aidl")
882 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
883 hasProto = b.hasSrcExt(".proto")
884 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
885 hasSysprop = b.hasSrcExt(".sysprop")
886 hasWinMsg = b.hasSrcExt(".mc")
887 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
888 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200889 c.AndroidModuleBase().AddJSONData(d)
890 (*d)["Cc"] = map[string]interface{}{
891 "SdkVersion": c.SdkVersion(),
892 "MinSdkVersion": c.MinSdkVersion(),
893 "VndkVersion": c.VndkVersion(),
894 "ProductSpecific": c.ProductSpecific(),
895 "SocSpecific": c.SocSpecific(),
896 "DeviceSpecific": c.DeviceSpecific(),
897 "InProduct": c.InProduct(),
898 "InVendor": c.InVendor(),
899 "InRamdisk": c.InRamdisk(),
900 "InVendorRamdisk": c.InVendorRamdisk(),
901 "InRecovery": c.InRecovery(),
902 "VendorAvailable": c.VendorAvailable(),
903 "ProductAvailable": c.ProductAvailable(),
904 "RamdiskAvailable": c.RamdiskAvailable(),
905 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
906 "RecoveryAvailable": c.RecoveryAvailable(),
907 "OdmAvailable": c.OdmAvailable(),
908 "InstallInData": c.InstallInData(),
909 "InstallInRamdisk": c.InstallInRamdisk(),
910 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
911 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
912 "InstallInRecovery": c.InstallInRecovery(),
913 "InstallInRoot": c.InstallInRoot(),
914 "IsVndk": c.IsVndk(),
915 "IsVndkExt": c.IsVndkExt(),
916 "IsVndkPrivate": c.IsVndkPrivate(),
917 "IsVndkSp": c.IsVndkSp(),
918 "IsLlndk": c.IsLlndk(),
919 "IsLlndkPublic": c.IsLlndkPublic(),
920 "IsSnapshotLibrary": c.IsSnapshotLibrary(),
921 "IsSnapshotPrebuilt": c.IsSnapshotPrebuilt(),
922 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
923 "ApexSdkVersion": c.apexSdkVersion,
924 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400925 "AidlSrcs": hasAidl,
926 "LexSrcs": hasLex,
927 "ProtoSrcs": hasProto,
928 "RenderscriptSrcs": hasRenderscript,
929 "SyspropSrcs": hasSysprop,
930 "WinMsgSrcs": hasWinMsg,
931 "YaccSrsc": hasYacc,
932 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200933 }
934}
935
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500936func (c *Module) SetPreventInstall() {
937 c.Properties.PreventInstall = true
938}
939
940func (c *Module) SetHideFromMake() {
941 c.Properties.HideFromMake = true
942}
943
Ivan Lozanod7586b62021-04-01 09:49:36 -0400944func (c *Module) HiddenFromMake() bool {
945 return c.Properties.HideFromMake
946}
947
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800948func (c *Module) RequiredModuleNames() []string {
949 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
950 if c.ImageVariation().Variation == android.CoreVariation {
951 required = append(required, c.Properties.Target.Platform.Required...)
952 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
953 } else if c.InRecovery() {
954 required = append(required, c.Properties.Target.Recovery.Required...)
955 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
956 }
957 return android.FirstUniqueStrings(required)
958}
959
Ivan Lozano52767be2019-10-18 14:49:46 -0700960func (c *Module) Toc() android.OptionalPath {
961 if c.linker != nil {
962 if library, ok := c.linker.(libraryInterface); ok {
963 return library.toc()
964 }
965 }
966 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
967}
968
969func (c *Module) ApiLevel() string {
970 if c.linker != nil {
971 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700972 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700973 }
974 }
975 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
976}
977
978func (c *Module) Static() bool {
979 if c.linker != nil {
980 if library, ok := c.linker.(libraryInterface); ok {
981 return library.static()
982 }
983 }
984 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
985}
986
987func (c *Module) Shared() bool {
988 if c.linker != nil {
989 if library, ok := c.linker.(libraryInterface); ok {
990 return library.shared()
991 }
992 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +0200993
Ivan Lozano52767be2019-10-18 14:49:46 -0700994 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
995}
996
997func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +0000998 if c.stl != nil {
999 return c.stl.Properties.SelectedStl
1000 }
1001 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001002}
1003
Ivan Lozano52767be2019-10-18 14:49:46 -07001004func (c *Module) NdkPrebuiltStl() bool {
1005 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1006 return true
1007 }
1008 return false
1009}
1010
1011func (c *Module) StubDecorator() bool {
1012 if _, ok := c.linker.(*stubDecorator); ok {
1013 return true
1014 }
1015 return false
1016}
1017
1018func (c *Module) SdkVersion() string {
1019 return String(c.Properties.Sdk_version)
1020}
1021
Artur Satayev480e25b2020-04-27 18:53:18 +01001022func (c *Module) MinSdkVersion() string {
1023 return String(c.Properties.Min_sdk_version)
1024}
1025
Jiyong Park5df7bd32021-08-25 16:18:46 +09001026func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001027 if linker, ok := c.linker.(*objectLinker); ok {
1028 return linker.isCrt()
1029 }
1030 return false
1031}
1032
Jiyong Park5df7bd32021-08-25 16:18:46 +09001033func (c *Module) SplitPerApiLevel() bool {
1034 return c.canUseSdk() && c.isCrt()
1035}
1036
Colin Crossc511bc52020-04-07 16:50:32 +00001037func (c *Module) AlwaysSdk() bool {
1038 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1039}
1040
Ivan Lozano183a3212019-10-18 14:18:45 -07001041func (c *Module) CcLibrary() bool {
1042 if c.linker != nil {
1043 if _, ok := c.linker.(*libraryDecorator); ok {
1044 return true
1045 }
Colin Crossd48fe732020-09-23 20:37:24 -07001046 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1047 return true
1048 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001049 }
1050 return false
1051}
1052
1053func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001054 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001055 return true
1056 }
1057 return false
1058}
1059
Ivan Lozano2b262972019-11-21 12:30:50 -08001060func (c *Module) NonCcVariants() bool {
1061 return false
1062}
1063
Ivan Lozano183a3212019-10-18 14:18:45 -07001064func (c *Module) SetStatic() {
1065 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001066 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001067 library.setStatic()
1068 return
1069 }
1070 }
1071 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1072}
1073
1074func (c *Module) SetShared() {
1075 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001076 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001077 library.setShared()
1078 return
1079 }
1080 }
1081 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1082}
1083
1084func (c *Module) BuildStaticVariant() bool {
1085 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001086 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001087 return library.buildStatic()
1088 }
1089 }
1090 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1091}
1092
1093func (c *Module) BuildSharedVariant() bool {
1094 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001095 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001096 return library.buildShared()
1097 }
1098 }
1099 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1100}
1101
1102func (c *Module) Module() android.Module {
1103 return c
1104}
1105
Jiyong Parkc20eee32018-09-05 22:36:17 +09001106func (c *Module) OutputFile() android.OptionalPath {
1107 return c.outputFile
1108}
1109
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001110func (c *Module) CoverageFiles() android.Paths {
1111 if c.linker != nil {
1112 if library, ok := c.linker.(libraryInterface); ok {
1113 return library.objs().coverageFiles
1114 }
1115 }
1116 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1117}
1118
Ivan Lozano183a3212019-10-18 14:18:45 -07001119var _ LinkableInterface = (*Module)(nil)
1120
Jiyong Park719b4462019-01-13 00:39:51 +09001121func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001122 if c.linker != nil {
1123 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001124 }
1125 return nil
1126}
1127
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001128func (c *Module) CoverageOutputFile() android.OptionalPath {
1129 if c.linker != nil {
1130 return c.linker.coverageOutputFilePath()
1131 }
1132 return android.OptionalPath{}
1133}
1134
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001135func (c *Module) RelativeInstallPath() string {
1136 if c.installer != nil {
1137 return c.installer.relativeInstallPath()
1138 }
1139 return ""
1140}
1141
Jooyung Han344d5432019-08-23 11:17:39 +09001142func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001143 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001144}
1145
Colin Cross36242852017-06-23 15:06:31 -07001146func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001147 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -08001148 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001149 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001150 }
1151 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001152 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001153 }
1154 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001155 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001156 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001157 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001158 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001159 }
Colin Cross16b23492016-01-06 14:41:07 -08001160 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001161 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001162 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001163 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001164 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001165 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001166 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001167 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001168 }
Justin Yun8effde42017-06-23 19:24:43 +09001169 if c.vndkdep != nil {
1170 c.AddProperties(c.vndkdep.props()...)
1171 }
Stephen Craneba090d12017-05-09 15:44:35 -07001172 if c.lto != nil {
1173 c.AddProperties(c.lto.props()...)
1174 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001175 if c.afdo != nil {
1176 c.AddProperties(c.afdo.props()...)
1177 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001178 if c.pgo != nil {
1179 c.AddProperties(c.pgo.props()...)
1180 }
Colin Crossca860ac2016-01-04 14:34:37 -08001181 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001182 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001183 }
Colin Crossc472d572015-03-17 15:06:21 -07001184
Colin Cross36242852017-06-23 15:06:31 -07001185 android.InitAndroidArchModule(c, c.hod, c.multilib)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001186 if c.bazelable {
1187 android.InitBazelModule(c)
1188 }
Jiyong Park7916bfc2019-09-30 19:13:12 +09001189 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +09001190 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001191 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001192
Colin Cross36242852017-06-23 15:06:31 -07001193 return c
Colin Crossc472d572015-03-17 15:06:21 -07001194}
1195
Ivan Lozano52767be2019-10-18 14:49:46 -07001196func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001197 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001198}
1199
Colin Crossc511bc52020-04-07 16:50:32 +00001200func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001201 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1202 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001203}
1204
1205func (c *Module) UseSdk() bool {
1206 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001207 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001208 }
1209 return false
1210}
1211
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001212func (c *Module) isCoverageVariant() bool {
1213 return c.coverage.Properties.IsCoverageVariant
1214}
1215
Colin Cross95f1ca02020-10-29 20:47:22 -07001216func (c *Module) IsNdk(config android.Config) bool {
1217 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001218}
1219
Colin Cross127bb8b2020-12-16 16:46:01 -08001220func (c *Module) IsLlndk() bool {
1221 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001222}
1223
Colin Cross127bb8b2020-12-16 16:46:01 -08001224func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001225 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001226}
1227
Colin Cross1f3f1302021-04-26 18:37:44 -07001228func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001229 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001230 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001231}
1232
Colin Cross5271fea2021-04-27 13:06:04 -07001233func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1234 lib := moduleLibraryInterface(m)
1235 return lib != nil && (lib.hasVendorPublicLibrary())
1236}
1237
1238// IsVendorPublicLibrary returns true for vendor public libraries.
1239func (c *Module) IsVendorPublicLibrary() bool {
1240 return c.VendorProperties.IsVendorPublicLibrary
1241}
1242
Ivan Lozanof1868af2022-04-12 13:08:36 -04001243func (c *Module) IsVndkPrebuiltLibrary() bool {
1244 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1245 return true
1246 }
1247 return false
1248}
1249
1250func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1251 return c.Properties.SdkAndPlatformVariantVisibleToMake
1252}
1253
Ivan Lozanod7586b62021-04-01 09:49:36 -04001254func (c *Module) HasLlndkStubs() bool {
1255 lib := moduleLibraryInterface(c)
1256 return lib != nil && lib.hasLLNDKStubs()
1257}
1258
1259func (c *Module) StubsVersion() string {
1260 if lib, ok := c.linker.(versionedInterface); ok {
1261 return lib.stubsVersion()
1262 }
1263 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1264}
1265
Colin Cross127bb8b2020-12-16 16:46:01 -08001266// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1267// and does not set llndk.vendor_available: false.
1268func (c *Module) isImplementationForLLNDKPublic() bool {
1269 library, _ := c.library.(*libraryDecorator)
1270 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001271 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001272}
1273
Justin Yunfd9e8042020-12-23 18:23:14 +09001274// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001275func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001276 // Check if VNDK-core-private or VNDK-SP-private
1277 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001278 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001279 }
1280
1281 // Check if LLNDK-private
1282 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001283 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001284 }
1285
1286 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001287}
1288
Ivan Lozano52767be2019-10-18 14:49:46 -07001289func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001290 if vndkdep := c.vndkdep; vndkdep != nil {
1291 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001292 }
1293 return false
1294}
1295
Yi Kong4ef54592022-02-14 20:00:10 +08001296func (c *Module) isAfdoCompile() bool {
1297 if afdo := c.afdo; afdo != nil {
1298 return afdo.Properties.AfdoTarget != nil
1299 }
1300 return false
1301}
1302
Yi Kong7e53c572018-02-14 18:16:12 +08001303func (c *Module) isPgoCompile() bool {
1304 if pgo := c.pgo; pgo != nil {
1305 return pgo.Properties.PgoCompile
1306 }
1307 return false
1308}
1309
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001310func (c *Module) isNDKStubLibrary() bool {
1311 if _, ok := c.compiler.(*stubDecorator); ok {
1312 return true
1313 }
1314 return false
1315}
1316
Ivan Lozanod7586b62021-04-01 09:49:36 -04001317func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001318 if vndkdep := c.vndkdep; vndkdep != nil {
1319 return vndkdep.isVndkSp()
1320 }
1321 return false
1322}
1323
Ivan Lozanof9e21722020-12-02 09:00:51 -05001324func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001325 if vndkdep := c.vndkdep; vndkdep != nil {
1326 return vndkdep.isVndkExt()
1327 }
1328 return false
1329}
1330
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001331func (c *Module) SubName() string {
1332 return c.Properties.SubName
1333}
1334
Ivan Lozano52767be2019-10-18 14:49:46 -07001335func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001336 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001337}
1338
Logan Chienf3511742017-10-31 18:04:35 +08001339func (c *Module) getVndkExtendsModuleName() string {
1340 if vndkdep := c.vndkdep; vndkdep != nil {
1341 return vndkdep.getVndkExtendsModuleName()
1342 }
1343 return ""
1344}
1345
Jiyong Park25fc6a92018-11-18 18:02:45 +09001346func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001347 if lib := c.library; lib != nil {
1348 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001349 }
1350 return false
1351}
1352
1353func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001354 if lib := c.library; lib != nil {
1355 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001356 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001357 return false
1358}
1359
Colin Cross0477b422020-10-13 18:43:54 -07001360// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1361// the implementation. If it is an implementation library it returns its own name.
1362func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1363 name := ctx.OtherModuleName(c)
1364 if versioned, ok := c.linker.(versionedInterface); ok {
1365 name = versioned.implementationModuleName(name)
1366 }
1367 return name
1368}
1369
Martin Stjernholm2856c662020-12-02 15:03:42 +00001370// Similar to ImplementationModuleName, but uses the Make variant of the module
1371// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1372// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1373// under the premise that the prebuilt module overrides its source counterpart
1374// if it is exposed to Make).
1375func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1376 name := c.BaseModuleName()
1377 if versioned, ok := c.linker.(versionedInterface); ok {
1378 name = versioned.implementationModuleName(name)
1379 }
1380 return name
1381}
1382
Jiyong Park7d55b612021-06-11 17:22:09 +09001383func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001384 return Bool(c.Properties.Bootstrap)
1385}
1386
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001387func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001388 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1389 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1390 return false
1391 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001392 return c.linker != nil && c.linker.nativeCoverage()
1393}
1394
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001395func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001396 if p, ok := c.linker.(SnapshotInterface); ok {
1397 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001398 }
1399 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001400}
1401
Bill Peckham945441c2020-08-31 16:07:58 -07001402func (c *Module) ExcludeFromVendorSnapshot() bool {
1403 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1404}
1405
Jose Galmesf7294582020-11-13 12:07:36 -08001406func (c *Module) ExcludeFromRecoverySnapshot() bool {
1407 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1408}
1409
Jiyong Parkf1194352019-02-25 11:05:47 +09001410func isBionic(name string) bool {
1411 switch name {
Kiyoung Kim4098c7e2020-11-30 14:42:14 +09001412 case "libc", "libm", "libdl", "libdl_android", "linker", "linkerconfig":
Jiyong Parkf1194352019-02-25 11:05:47 +09001413 return true
1414 }
1415 return false
1416}
1417
Martin Stjernholm279de572019-09-10 23:18:20 +01001418func InstallToBootstrap(name string, config android.Config) bool {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001419 if name == "libclang_rt.hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001420 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001421 }
1422 return isBionic(name)
1423}
1424
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001425func (c *Module) XrefCcFiles() android.Paths {
1426 return c.kytheFiles
1427}
1428
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001429func (c *Module) isCfiAssemblySupportEnabled() bool {
1430 return c.sanitize != nil &&
1431 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1432}
1433
Inseob Kim800d1142021-06-14 12:03:51 +09001434func (c *Module) InstallInRoot() bool {
1435 return c.installer != nil && c.installer.installInRoot()
1436}
1437
Colin Crossca860ac2016-01-04 14:34:37 -08001438type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001439 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001440 moduleContextImpl
1441}
1442
Colin Cross37047f12016-12-13 17:06:13 -08001443type depsContext struct {
1444 android.BottomUpMutatorContext
1445 moduleContextImpl
1446}
1447
Colin Crossca860ac2016-01-04 14:34:37 -08001448type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001449 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001450 moduleContextImpl
1451}
1452
1453type moduleContextImpl struct {
1454 mod *Module
1455 ctx BaseModuleContext
1456}
1457
Colin Crossb98c8b02016-07-29 13:44:28 -07001458func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001459 return ctx.mod.toolchain(ctx.ctx)
1460}
1461
1462func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001463 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001464}
1465
1466func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001467 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001468}
1469
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001470func (ctx *moduleContextImpl) testBinary() bool {
1471 return ctx.mod.testBinary()
1472}
1473
Jiyong Park1d1119f2019-07-29 21:27:18 +09001474func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001475 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001476}
1477
Inseob Kim7f283f42020-06-01 21:53:49 +09001478func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001479 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001480}
1481
Inseob Kim1042d292020-06-01 23:23:05 +09001482func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001483 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001484}
1485
Jooyung Hanccce2f22020-03-07 03:45:53 +09001486func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001487 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001488}
1489
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001490func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001491 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001492}
1493
1494func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001495 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001496 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001497 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001498 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001499 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001500 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001501 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001502 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001503 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001504 }
1505 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001506}
1507
Jiyong Parkb35a8192020-08-10 15:59:36 +09001508func (ctx *moduleContextImpl) minSdkVersion() string {
1509 ver := ctx.mod.MinSdkVersion()
1510 if ver == "apex_inherit" && !ctx.isForPlatform() {
1511 ver = ctx.apexSdkVersion().String()
1512 }
1513 if ver == "apex_inherit" || ver == "" {
1514 ver = ctx.sdkVersion()
1515 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001516 // For crt objects, the meaning of min_sdk_version is very different from other types of
1517 // module. For them, min_sdk_version defines the oldest version that the build system will
1518 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1519 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1520 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001521 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1522 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1523 // support such an old version. The version is set to the later version in case when the
1524 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1525 // it's for an APEX.
1526 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1527 if ctx.isForPlatform() {
1528 ver = strconv.Itoa(android.FutureApiLevelInt)
1529 } else { // for apex
1530 ver = ctx.apexSdkVersion().String()
1531 if ver == "" { // in case when min_sdk_version was not set by the APEX
1532 ver = ctx.sdkVersion()
1533 }
1534 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001535 }
1536
Jiyong Parkb35a8192020-08-10 15:59:36 +09001537 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1538 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1539 minSdkVersionInt, err2 := strconv.Atoi(ver)
1540 if err == nil && err2 == nil {
1541 if sdkVersionInt < minSdkVersionInt {
1542 return strconv.Itoa(sdkVersionInt)
1543 }
1544 }
1545 return ver
1546}
1547
1548func (ctx *moduleContextImpl) isSdkVariant() bool {
1549 return ctx.mod.IsSdkVariant()
1550}
1551
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001552func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001553 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001554}
Justin Yun8effde42017-06-23 19:24:43 +09001555
Colin Cross95f1ca02020-10-29 20:47:22 -07001556func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1557 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001558}
1559
Colin Cross127bb8b2020-12-16 16:46:01 -08001560func (ctx *moduleContextImpl) IsLlndk() bool {
1561 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001562}
1563
Colin Cross127bb8b2020-12-16 16:46:01 -08001564func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1565 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001566}
1567
Colin Cross127bb8b2020-12-16 16:46:01 -08001568func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1569 return ctx.mod.isImplementationForLLNDKPublic()
1570}
1571
1572func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1573 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001574}
1575
Logan Chienf3511742017-10-31 18:04:35 +08001576func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001577 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001578}
1579
Yi Kong4ef54592022-02-14 20:00:10 +08001580func (ctx *moduleContextImpl) isAfdoCompile() bool {
1581 return ctx.mod.isAfdoCompile()
1582}
1583
Yi Kong7e53c572018-02-14 18:16:12 +08001584func (ctx *moduleContextImpl) isPgoCompile() bool {
1585 return ctx.mod.isPgoCompile()
1586}
1587
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001588func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1589 return ctx.mod.isNDKStubLibrary()
1590}
1591
Justin Yun8effde42017-06-23 19:24:43 +09001592func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001593 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001594}
1595
Ivan Lozanof9e21722020-12-02 09:00:51 -05001596func (ctx *moduleContextImpl) IsVndkExt() bool {
1597 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001598}
1599
Colin Cross5271fea2021-04-27 13:06:04 -07001600func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1601 return ctx.mod.IsVendorPublicLibrary()
1602}
1603
Vic Yangefd249e2018-11-12 20:19:56 -08001604func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001605 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001606}
1607
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001608func (ctx *moduleContextImpl) selectedStl() string {
1609 if stl := ctx.mod.stl; stl != nil {
1610 return stl.Properties.SelectedStl
1611 }
1612 return ""
1613}
1614
Ivan Lozanobd721262018-11-27 14:33:03 -08001615func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1616 return ctx.mod.linker.useClangLld(actx)
1617}
1618
Colin Crossce75d2c2016-10-06 16:12:58 -07001619func (ctx *moduleContextImpl) baseModuleName() string {
1620 return ctx.mod.ModuleBase.BaseModuleName()
1621}
1622
Logan Chienf3511742017-10-31 18:04:35 +08001623func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1624 return ctx.mod.getVndkExtendsModuleName()
1625}
1626
Logan Chiene274fc92019-12-03 11:18:32 -08001627func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001628 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001629}
1630
Colin Crosse07f2312020-08-13 11:24:56 -07001631func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001632 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633}
1634
Dan Albertc8060532020-07-22 22:32:17 -07001635func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001636 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001637}
1638
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001639func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001640 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001641}
1642
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001643func (ctx *moduleContextImpl) nativeCoverage() bool {
1644 return ctx.mod.nativeCoverage()
1645}
1646
Colin Cross56a83212020-09-15 18:30:11 -07001647func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1648 return ctx.mod.DirectlyInAnyApex()
1649}
1650
Colin Cross95b07f22020-12-16 11:06:50 -08001651func (ctx *moduleContextImpl) isPreventInstall() bool {
1652 return ctx.mod.Properties.PreventInstall
1653}
1654
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001655func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1656 shared := &ctx.mod.sharedFlags
1657 if shared.flagsMap == nil {
1658 shared.numSharedFlags = 0
1659 shared.flagsMap = make(map[string]string)
1660 }
1661 return shared
1662}
1663
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001664func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1665 return ctx.mod.isCfiAssemblySupportEnabled()
1666}
1667
Colin Cross635c3b02016-05-18 15:37:25 -07001668func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001669 return &Module{
1670 hod: hod,
1671 multilib: multilib,
1672 }
1673}
1674
Colin Cross635c3b02016-05-18 15:37:25 -07001675func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001676 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001677 module.features = []feature{
1678 &tidyFeature{},
1679 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001680 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001681 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001682 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001683 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001684 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001685 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001686 module.afdo = &afdo{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001687 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001688 return module
1689}
1690
Colin Crossce75d2c2016-10-06 16:12:58 -07001691func (c *Module) Prebuilt() *android.Prebuilt {
1692 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1693 return p.prebuilt()
1694 }
1695 return nil
1696}
1697
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001698func (c *Module) IsPrebuilt() bool {
1699 return c.Prebuilt() != nil
1700}
1701
Colin Crossce75d2c2016-10-06 16:12:58 -07001702func (c *Module) Name() string {
1703 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001704 if p, ok := c.linker.(interface {
1705 Name(string) string
1706 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001707 name = p.Name(name)
1708 }
1709 return name
1710}
1711
Alex Light3d673592019-01-18 14:37:31 -08001712func (c *Module) Symlinks() []string {
1713 if p, ok := c.installer.(interface {
1714 symlinkList() []string
1715 }); ok {
1716 return p.symlinkList()
1717 }
1718 return nil
1719}
1720
Roland Levillainf89cd092019-07-29 16:22:59 +01001721func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1722 test, ok := c.linker.(testPerSrc)
1723 return ok && test.isAllTestsVariation()
1724}
1725
Chris Parsons216e10a2020-07-09 17:12:52 -04001726func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001727 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001728 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001729 }); ok {
1730 return p.dataPaths()
1731 }
1732 return nil
1733}
1734
Ivan Lozanof1868af2022-04-12 13:08:36 -04001735func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001736 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1737 // "current", it will append the VNDK version to the name suffix.
1738 var vndkVersion string
1739 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001740 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001741 if c.ProductSpecific() {
1742 // If the module is product specific with 'product_specific: true',
1743 // do not add a name suffix because it is a base module.
1744 return ""
1745 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001746 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
Matthew Maurer52af5b02021-05-27 10:01:36 -07001747 nameSuffix = ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001748 } else {
1749 vndkVersion = ctx.DeviceConfig().VndkVersion()
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001750 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001751 }
1752 if vndkVersion == "current" {
1753 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1754 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001755 if c.VndkVersion() != vndkVersion && c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001756 // add version suffix only if the module is using different vndk version than the
1757 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001758 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001759 }
1760 return nameSuffix
1761}
1762
Ivan Lozanof1868af2022-04-12 13:08:36 -04001763func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1764 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001765
1766 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001767 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001768 }
1769
Colin Cross127bb8b2020-12-16 16:46:01 -08001770 llndk := c.IsLlndk()
Colin Cross627280f2021-04-26 16:53:58 -07001771 if llndk || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001772 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1773 // added for product variant only when we have vendor and product variants with core
1774 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001775 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001776 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001777 subName += vendorPublicLibrarySuffix
1778 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001779 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1780 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001781 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001782 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001783 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001784 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001785 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001786 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001787 subName += RecoverySuffix
1788 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1789 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001790 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001791 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001792 }
Inseob Kim64c43952019-08-26 16:52:35 +09001793 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001794
1795 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001796}
1797
Chris Parsonsf874e462022-05-10 13:50:12 -04001798var _ android.MixedBuildBuildable = (*Module)(nil)
1799
1800func (c *Module) getBazelModuleLabel(ctx android.BaseModuleContext) string {
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001801 var bazelModuleLabel string
Liz Kammer35ca77e2021-12-22 15:31:40 -05001802 if c.typ() == fullLibrary && c.static() {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001803 // cc_library is a special case in bp2build; two targets are generated -- one for each
1804 // of the shared and static variants. The shared variant keeps the module name, but the
1805 // static variant uses a different suffixed name.
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001806 bazelModuleLabel = bazelLabelForStaticModule(ctx, c)
1807 } else {
1808 bazelModuleLabel = c.GetBazelLabel(ctx, c)
Chris Parsonsf874e462022-05-10 13:50:12 -04001809 }
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001810 labelNoPrebuilt := bazelModuleLabel
1811 if c.IsPrebuilt() {
1812 labelNoPrebuilt = android.RemoveOptionalPrebuiltPrefixFromBazelLabel(bazelModuleLabel)
1813 }
1814 return labelNoPrebuilt
Chris Parsonsf874e462022-05-10 13:50:12 -04001815}
1816
1817func (c *Module) QueueBazelCall(ctx android.BaseModuleContext) {
1818 c.bazelHandler.QueueBazelCall(ctx, c.getBazelModuleLabel(ctx))
1819}
1820
1821func (c *Module) IsMixedBuildSupported(ctx android.BaseModuleContext) bool {
1822 return c.bazelHandler != nil
1823}
1824
1825func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) {
1826 bazelModuleLabel := c.getBazelModuleLabel(ctx)
1827
1828 c.bazelHandler.ProcessBazelQueryResponse(ctx, bazelModuleLabel)
1829
1830 c.Properties.SubName = GetSubnameProperty(ctx, c)
1831 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1832 if !apexInfo.IsForPlatform() {
1833 c.hideApexVariantFromMake = true
Chris Parsons77acf2e2021-12-03 17:27:16 -05001834 }
Liz Kammer35ca77e2021-12-22 15:31:40 -05001835
Chris Parsonsf874e462022-05-10 13:50:12 -04001836 c.makeLinkType = GetMakeLinkType(ctx, c)
1837
1838 mctx := &moduleContext{
1839 ModuleContext: ctx,
1840 moduleContextImpl: moduleContextImpl{
1841 mod: c,
1842 },
Chris Parsons8d6e4332021-02-22 16:13:50 -05001843 }
Chris Parsonsf874e462022-05-10 13:50:12 -04001844 mctx.ctx = mctx
1845
1846 c.maybeInstall(mctx, apexInfo)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001847}
1848
1849func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05001850 // Handle the case of a test module split by `test_per_src` mutator.
1851 //
1852 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1853 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1854 // module and return early, as this module does not produce an output file per se.
1855 if c.IsTestPerSrcAllTestsVariation() {
1856 c.outputFile = android.OptionalPath{}
1857 return
1858 }
1859
Ivan Lozanof1868af2022-04-12 13:08:36 -04001860 c.Properties.SubName = GetSubnameProperty(actx, c)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001861 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1862 if !apexInfo.IsForPlatform() {
1863 c.hideApexVariantFromMake = true
1864 }
1865
Chris Parsonseefc9e62021-04-02 17:36:47 -04001866 c.makeLinkType = GetMakeLinkType(actx, c)
1867
Colin Crossca860ac2016-01-04 14:34:37 -08001868 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001869 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001870 moduleContextImpl: moduleContextImpl{
1871 mod: c,
1872 },
1873 }
1874 ctx.ctx = ctx
1875
Colin Crossf18e1102017-11-16 14:33:08 -08001876 deps := c.depsToPaths(ctx)
1877 if ctx.Failed() {
1878 return
1879 }
1880
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001881 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1882 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1883 }
1884
Colin Crossca860ac2016-01-04 14:34:37 -08001885 flags := Flags{
1886 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001887 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001888 }
Colin Crossca860ac2016-01-04 14:34:37 -08001889 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001890 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001891 }
1892 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001893 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001894 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001895 if c.stl != nil {
1896 flags = c.stl.flags(ctx, flags)
1897 }
Colin Cross16b23492016-01-06 14:41:07 -08001898 if c.sanitize != nil {
1899 flags = c.sanitize.flags(ctx, flags)
1900 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001901 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001902 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001903 }
Stephen Craneba090d12017-05-09 15:44:35 -07001904 if c.lto != nil {
1905 flags = c.lto.flags(ctx, flags)
1906 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001907 if c.afdo != nil {
1908 flags = c.afdo.flags(ctx, flags)
1909 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001910 if c.pgo != nil {
1911 flags = c.pgo.flags(ctx, flags)
1912 }
Colin Crossca860ac2016-01-04 14:34:37 -08001913 for _, feature := range c.features {
1914 flags = feature.flags(ctx, flags)
1915 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001916 if ctx.Failed() {
1917 return
1918 }
1919
Colin Cross4af21ed2019-11-04 09:37:55 -08001920 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1921 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1922 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001923
Colin Cross4af21ed2019-11-04 09:37:55 -08001924 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001925
1926 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001927 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001928 }
1929 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001930 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001931 }
1932
Colin Cross3e5e7782022-06-17 22:17:05 +00001933 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
1934
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001935 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001936 // We need access to all the flags seen by a source file.
1937 if c.sabi != nil {
1938 flags = c.sabi.flags(ctx, flags)
1939 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001940
Colin Cross4af21ed2019-11-04 09:37:55 -08001941 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001942
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001943 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001944 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001945 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001946 if ctx.Failed() {
1947 return
1948 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001949 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07001950 c.objFiles = objs.objFiles
1951 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001952 }
1953
Colin Crossca860ac2016-01-04 14:34:37 -08001954 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001955 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001956 if ctx.Failed() {
1957 return
1958 }
Colin Cross635c3b02016-05-18 15:37:25 -07001959 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001960
Chris Parsons94a0bba2021-06-04 15:03:47 -04001961 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001962
Jose Galmes6f843bc2020-12-11 13:36:29 -08001963 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
1964 // RECOVERY_SNAPSHOT_VERSION is current.
1965 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001966 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001967 i.collectHeadersForSnapshot(ctx)
1968 }
1969 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001970 }
Colin Cross5049f022015-03-18 13:28:46 -07001971
Chris Parsons94a0bba2021-06-04 15:03:47 -04001972 c.maybeInstall(ctx, apexInfo)
1973}
1974
1975func (c *Module) maybeUnhideFromMake() {
1976 // If a lib is directly included in any of the APEXes or is not available to the
1977 // platform (which is often the case when the stub is provided as a prebuilt),
1978 // unhide the stubs variant having the latest version gets visible to make. In
1979 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
1980 // force anything in the make world to link against the stubs library. (unless it
1981 // is explicitly referenced via .bootstrap suffix or the module is marked with
1982 // 'bootstrap: true').
1983 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
1984 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
1985 c.IsStubs() && !c.InVendorRamdisk() {
1986 c.Properties.HideFromMake = false // unhide
1987 // Note: this is still non-installable
1988 }
1989}
1990
1991func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07001992 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08001993 // If the module has been specifically configure to not be installed then
1994 // hide from make as otherwise it will break when running inside make
1995 // as the output path to install will not be specified. Not all uninstallable
1996 // modules can be hidden from make as some are needed for resolving make side
1997 // dependencies.
1998 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001999 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002000 c.SkipInstall()
2001 }
2002
2003 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2004 // to allow using the outputs in a genrule.
2005 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002006 c.installer.install(ctx, c.outputFile.Path())
2007 if ctx.Failed() {
2008 return
Colin Crossca860ac2016-01-04 14:34:37 -08002009 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002010 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002011}
2012
Colin Cross0ea8ba82019-06-06 14:33:29 -07002013func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002014 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002015 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002016 }
Colin Crossca860ac2016-01-04 14:34:37 -08002017 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002018}
2019
Colin Crossca860ac2016-01-04 14:34:37 -08002020func (c *Module) begin(ctx BaseModuleContext) {
2021 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002022 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002023 }
Colin Crossca860ac2016-01-04 14:34:37 -08002024 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002025 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002026 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002027 if c.stl != nil {
2028 c.stl.begin(ctx)
2029 }
Colin Cross16b23492016-01-06 14:41:07 -08002030 if c.sanitize != nil {
2031 c.sanitize.begin(ctx)
2032 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002033 if c.coverage != nil {
2034 c.coverage.begin(ctx)
2035 }
Stephen Craneba090d12017-05-09 15:44:35 -07002036 if c.lto != nil {
2037 c.lto.begin(ctx)
2038 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002039 if c.afdo != nil {
2040 c.afdo.begin(ctx)
2041 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002042 if c.pgo != nil {
2043 c.pgo.begin(ctx)
2044 }
Dan Albert92fe7402020-07-15 13:33:30 -07002045 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002046 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002047 if err != nil {
2048 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002049 c.Properties.Sdk_version = nil
2050 } else {
2051 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002052 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002053 }
Colin Crossca860ac2016-01-04 14:34:37 -08002054}
2055
Colin Cross37047f12016-12-13 17:06:13 -08002056func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002057 deps := Deps{}
2058
2059 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002060 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002061 }
2062 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002063 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002064 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002065 if c.stl != nil {
2066 deps = c.stl.deps(ctx, deps)
2067 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002068 if c.coverage != nil {
2069 deps = c.coverage.deps(ctx, deps)
2070 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002071
Colin Crossb6715442017-10-24 11:13:31 -07002072 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2073 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2074 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2075 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2076 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2077 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002078 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002079
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002080 for _, lib := range deps.ReexportSharedLibHeaders {
2081 if !inList(lib, deps.SharedLibs) {
2082 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2083 }
2084 }
2085
2086 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002087 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2088 ctx.PropertyErrorf("export_static_lib_headers", "Static library not in static_libs or whole_static_libs: '%s'", lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002089 }
2090 }
2091
Colin Cross5950f382016-12-13 12:50:57 -08002092 for _, lib := range deps.ReexportHeaderLibHeaders {
2093 if !inList(lib, deps.HeaderLibs) {
2094 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2095 }
2096 }
2097
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002098 for _, gen := range deps.ReexportGeneratedHeaders {
2099 if !inList(gen, deps.GeneratedHeaders) {
2100 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2101 }
2102 }
2103
Colin Crossc99deeb2016-04-11 15:06:20 -07002104 return deps
2105}
2106
Dan Albert7e9d2952016-08-04 13:02:36 -07002107func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002108 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002109 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002110 moduleContextImpl: moduleContextImpl{
2111 mod: c,
2112 },
2113 }
2114 ctx.ctx = ctx
2115
Colin Crossca860ac2016-01-04 14:34:37 -08002116 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002117}
2118
Jiyong Park7ed9de32018-10-15 22:25:07 +09002119// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002120func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002121 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2122 version := name[sharp+1:]
2123 libname := name[:sharp]
2124 return libname, version
2125 }
2126 return name, ""
2127}
2128
Dan Albert92fe7402020-07-15 13:33:30 -07002129func GetCrtVariations(ctx android.BottomUpMutatorContext,
2130 m LinkableInterface) []blueprint.Variation {
2131 if ctx.Os() != android.Android {
2132 return nil
2133 }
2134 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002135 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2136 minSdkVersion := m.MinSdkVersion()
2137 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2138 minSdkVersion = m.SdkVersion()
2139 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002140 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2141 if err != nil {
2142 ctx.PropertyErrorf("min_sdk_version", err.Error())
2143 }
Dan Albert92fe7402020-07-15 13:33:30 -07002144 return []blueprint.Variation{
2145 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002146 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002147 }
2148 }
2149 return []blueprint.Variation{
2150 {Mutator: "sdk", Variation: ""},
2151 }
2152}
2153
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002154func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2155 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002156
2157 variations = append([]blueprint.Variation(nil), variations...)
2158
Liz Kammer23942242022-04-08 15:41:00 -04002159 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002160 // Version is explicitly specified. i.e. libFoo#30
2161 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002162 if tag, ok := depTag.(libraryDependencyTag); ok {
2163 tag.explicitlyVersioned = true
2164 } else {
2165 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2166 }
Colin Crosse7257d22020-09-24 09:56:18 -07002167 }
Colin Crosse7257d22020-09-24 09:56:18 -07002168
Colin Cross0de8a1e2020-09-18 14:15:30 -07002169 if far {
2170 ctx.AddFarVariationDependencies(variations, depTag, name)
2171 } else {
2172 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002173 }
2174}
2175
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002176func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002177 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002178 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002179 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002180 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2181 // between the modules in the snapshot and the snapshot itself.
2182 var snapshotModule []blueprint.Module
2183 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2184 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2185 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2186 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2187 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002188 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002189 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2190 *snapshotInfo = &snapshot
2191 // republish the snapshot for use in later mutators on this module
2192 actx.SetProvider(SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002193 }
2194 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002195 if *snapshotInfo == nil {
2196 *snapshotInfo = &SnapshotInfo{}
2197 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002198 return **snapshotInfo
2199}
2200
2201func RewriteSnapshotLib(lib string, snapshotMap map[string]string) string {
2202 if snapshot, ok := snapshotMap[lib]; ok {
2203 return snapshot
2204 }
2205
2206 return lib
2207}
2208
2209// RewriteLibs takes a list of names of shared libraries and scans it for three types
2210// of names:
2211//
2212// 1. Name of an NDK library that refers to a prebuilt module.
2213// For each of these, it adds the name of the prebuilt module (which will be in
2214// prebuilts/ndk) to the list of nonvariant libs.
2215// 2. Name of an NDK library that refers to an ndk_library module.
2216// For each of these, it adds the name of the ndk_library module to the list of
2217// variant libs.
2218// 3. Anything else (so anything that isn't an NDK library).
2219// It adds these to the nonvariantLibs list.
2220//
2221// The caller can then know to add the variantLibs dependencies differently from the
2222// nonvariantLibs
2223func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2224 variantLibs = []string{}
2225
2226 nonvariantLibs = []string{}
2227 for _, entry := range list {
2228 // strip #version suffix out
2229 name, _ := StubsLibNameAndVersion(entry)
2230 if c.InRecovery() {
2231 nonvariantLibs = append(nonvariantLibs, RewriteSnapshotLib(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
2232 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2233 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2234 } else if c.UseVndk() {
2235 nonvariantLibs = append(nonvariantLibs, RewriteSnapshotLib(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
2236 } else {
2237 // put name#version back
2238 nonvariantLibs = append(nonvariantLibs, entry)
2239 }
2240 }
2241 return nonvariantLibs, variantLibs
2242}
2243
Colin Cross1e676be2016-10-12 14:38:15 -07002244func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002245 if !c.Enabled() {
2246 return
2247 }
2248
Colin Cross37047f12016-12-13 17:06:13 -08002249 ctx := &depsContext{
2250 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002251 moduleContextImpl: moduleContextImpl{
2252 mod: c,
2253 },
2254 }
2255 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002256
Colin Crossc99deeb2016-04-11 15:06:20 -07002257 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002258
Yo Chiang219968c2020-09-22 18:45:04 +08002259 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2260
Colin Crosse0edaf92021-01-11 17:31:17 -08002261 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002262
Dan Albert914449f2016-06-17 16:45:24 -07002263 variantNdkLibs := []string{}
2264 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002265 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002266 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2267 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2268 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002269
2270 for idx, lib := range deps.RuntimeLibs {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002271 deps.RuntimeLibs[idx] = RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002272 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002273 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002274
Colin Cross32ec36c2016-12-15 07:39:51 -08002275 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002276 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002277 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002278 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002279 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002280
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002281 lib = RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002282
Jiyong Park1ad8e162020-12-01 23:40:09 +09002283 if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002284 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002285 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002286 } else {
2287 actx.AddVariationDependencies(nil, depTag, lib)
2288 }
2289 }
2290
Dan Albertf1d14c72020-07-30 14:32:55 -07002291 if c.isNDKStubLibrary() {
2292 // NDK stubs depend on their implementation because the ABI dumps are
2293 // generated from the implementation library.
2294 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2295 c.ImageVariation(),
2296 blueprint.Variation{Mutator: "link", Variation: "shared"},
2297 ), stubImplementation, c.BaseModuleName())
2298 }
2299
Inseob Kim07def122020-11-23 14:43:02 +09002300 // sysprop_library has to support both C++ and Java. So sysprop_library internally creates one
2301 // C++ implementation library and one Java implementation library. When a module links against
2302 // sysprop_library, the C++ implementation library has to be linked. syspropImplLibraries is a
2303 // map from sysprop_library to implementation library; it will be used in whole_static_libs,
2304 // static_libs, and shared_libs.
Inseob Kimc0907f12019-02-08 21:00:45 +09002305 syspropImplLibraries := syspropImplLibraries(actx.Config())
2306
Jiyong Park5d1598f2019-02-25 22:14:17 +09002307 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002308 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09002309 if impl, ok := syspropImplLibraries[lib]; ok {
2310 lib = impl
2311 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002312
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002313 lib = RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002314
Jiyong Park5d1598f2019-02-25 22:14:17 +09002315 actx.AddVariationDependencies([]blueprint.Variation{
2316 {Mutator: "link", Variation: "static"},
2317 }, depTag, lib)
2318 }
2319
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002320 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002321 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002322 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002323 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002324 }
Jiyong Parke3867542020-12-03 17:28:25 +09002325 if inList(lib, deps.ExcludeLibsForApex) {
2326 depTag.excludeInApex = true
2327 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002328
2329 if impl, ok := syspropImplLibraries[lib]; ok {
2330 lib = impl
2331 }
2332
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002333 lib = RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002334
Dan Willemsen59339a22018-07-22 21:18:45 -07002335 actx.AddVariationDependencies([]blueprint.Variation{
2336 {Mutator: "link", Variation: "static"},
2337 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002338 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002339
Jooyung Han75568392020-03-20 04:29:24 +09002340 // staticUnwinderDep is treated as staticDep for Q apexes
2341 // so that native libraries/binaries are linked with static unwinder
2342 // because Q libc doesn't have unwinder APIs
2343 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002344 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002345 actx.AddVariationDependencies([]blueprint.Variation{
2346 {Mutator: "link", Variation: "static"},
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002347 }, depTag, RewriteSnapshotLib(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002348 }
2349
Jiyong Park7ed9de32018-10-15 22:25:07 +09002350 // shared lib names without the #version suffix
2351 var sharedLibNames []string
2352
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002353 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002354 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002355 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002356 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002357 }
Jiyong Parke3867542020-12-03 17:28:25 +09002358 if inList(lib, deps.ExcludeLibsForApex) {
2359 depTag.excludeInApex = true
2360 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002361
2362 if impl, ok := syspropImplLibraries[lib]; ok {
2363 lib = impl
2364 }
2365
Jiyong Park73c54ee2019-10-22 20:31:18 +09002366 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002367 sharedLibNames = append(sharedLibNames, name)
2368
Colin Crosse7257d22020-09-24 09:56:18 -07002369 variations := []blueprint.Variation{
2370 {Mutator: "link", Variation: "shared"},
2371 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002372 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002373 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002374
Colin Crossfe9acfe2021-06-14 16:13:03 -07002375 for _, lib := range deps.LateStaticLibs {
2376 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2377 actx.AddVariationDependencies([]blueprint.Variation{
2378 {Mutator: "link", Variation: "static"},
2379 }, depTag, RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
2380 }
2381
Colin Cross3e5e7782022-06-17 22:17:05 +00002382 for _, lib := range deps.UnexportedStaticLibs {
2383 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2384 actx.AddVariationDependencies([]blueprint.Variation{
2385 {Mutator: "link", Variation: "static"},
2386 }, depTag, RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
2387 }
2388
Jiyong Park7ed9de32018-10-15 22:25:07 +09002389 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002390 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002391 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2392 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2393 // linking against both the stubs lib and the non-stubs lib at the same time.
2394 continue
2395 }
Colin Cross6e511a92020-07-27 21:26:48 -07002396 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002397 variations := []blueprint.Variation{
2398 {Mutator: "link", Variation: "shared"},
2399 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002400 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002401 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002402
Dan Willemsen59339a22018-07-22 21:18:45 -07002403 actx.AddVariationDependencies([]blueprint.Variation{
2404 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002405 }, dataLibDepTag, deps.DataLibs...)
2406
Colin Crossc8caa062021-09-24 16:50:14 -07002407 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2408
Chris Parsons79d66a52020-06-05 17:26:16 -04002409 actx.AddVariationDependencies([]blueprint.Variation{
2410 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002411 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002412
Colin Cross68861832016-07-08 10:41:41 -07002413 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002414
2415 for _, gen := range deps.GeneratedHeaders {
2416 depTag := genHeaderDepTag
2417 if inList(gen, deps.ReexportGeneratedHeaders) {
2418 depTag = genHeaderExportDepTag
2419 }
2420 actx.AddDependency(c, depTag, gen)
2421 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002422
Dan Albert92fe7402020-07-15 13:33:30 -07002423 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002424 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002425 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002426 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Colin Crossc465efd2021-06-11 18:00:04 -07002427 RewriteSnapshotLib(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002428 }
Colin Crossc465efd2021-06-11 18:00:04 -07002429 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002430 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Colin Crossc465efd2021-06-11 18:00:04 -07002431 RewriteSnapshotLib(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002432 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002433 if deps.DynamicLinker != "" {
2434 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002435 }
Dan Albert914449f2016-06-17 16:45:24 -07002436
2437 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002438
2439 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002440 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002441 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002442 {Mutator: "link", Variation: "shared"},
2443 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002444
2445 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002446 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002447 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002448 {Mutator: "link", Variation: "shared"},
2449 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002450
2451 if vndkdep := c.vndkdep; vndkdep != nil {
2452 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002453 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002454 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002455 {Mutator: "link", Variation: "shared"},
Justin Yun27b95722021-07-28 17:04:44 +09002456 }, vndkExtDepTag, RewriteSnapshotLib(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002457 }
2458 }
Colin Cross6362e272015-10-29 15:25:03 -07002459}
Colin Cross21b9a242015-03-24 14:15:58 -07002460
Colin Crosse40b4ea2018-10-02 22:25:58 -07002461func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002462 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2463 c.beginMutator(ctx)
2464 }
2465}
2466
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002467// Whether a module can link to another module, taking into
2468// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002469func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002470 tag blueprint.DependencyTag) {
2471
2472 switch t := tag.(type) {
2473 case dependencyTag:
2474 if t != vndkExtDepTag {
2475 return
2476 }
2477 case libraryDependencyTag:
2478 default:
2479 return
2480 }
2481
Ivan Lozanof9e21722020-12-02 09:00:51 -05002482 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002483 // Host code is not restricted
2484 return
2485 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002486
2487 // VNDK is cc.Module supported only for now.
2488 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002489 // Though allowed dependency is limited by the image mutator,
2490 // each vendor and product module needs to check link-type
2491 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002492 if ccTo, ok := to.(*Module); ok {
2493 if ccFrom.vndkdep != nil {
2494 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2495 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002496 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002497 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002498 }
2499 return
2500 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002501 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002502 // Platform code can link to anything
2503 return
2504 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002505 if from.InRamdisk() {
2506 // Ramdisk code is not NDK
2507 return
2508 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002509 if from.InVendorRamdisk() {
2510 // Vendor ramdisk code is not NDK
2511 return
2512 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002513 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002514 // Recovery code is not NDK
2515 return
2516 }
Colin Cross31076b32020-10-23 17:22:06 -07002517 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002518 if c.NdkPrebuiltStl() {
2519 // These are allowed, but they don't set sdk_version
2520 return
2521 }
2522 if c.StubDecorator() {
2523 // These aren't real libraries, but are the stub shared libraries that are included in
2524 // the NDK.
2525 return
2526 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002527 }
Logan Chien834b9a62019-01-14 15:39:03 +08002528
Ivan Lozano52767be2019-10-18 14:49:46 -07002529 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002530 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2531 // to link to libc++ (non-NDK and without sdk_version).
2532 return
2533 }
2534
Ivan Lozano52767be2019-10-18 14:49:46 -07002535 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002536 // NDK code linking to platform code is never okay.
2537 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002538 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002539 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002540 }
2541
2542 // At this point we know we have two NDK libraries, but we need to
2543 // check that we're not linking against anything built against a higher
2544 // API level, as it is only valid to link against older or equivalent
2545 // APIs.
2546
Inseob Kim01a28722018-04-11 09:48:45 +09002547 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002548 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002549 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002550 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002551 // Current can't be linked against by anything else.
2552 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002553 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002554 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002555 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002556 if err != nil {
2557 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002558 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002559 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002560 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002561 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002562 if err != nil {
2563 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002564 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002565 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002566 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002567
Inseob Kim01a28722018-04-11 09:48:45 +09002568 if toApi > fromApi {
2569 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002570 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002571 }
2572 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002573 }
Dan Albert202fe492017-12-15 13:56:59 -08002574
2575 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002576 fromStl := from.SelectedStl()
2577 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002578 if fromStl == "" || toStl == "" {
2579 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002580 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002581 // We can be permissive with the system "STL" since it is only the C++
2582 // ABI layer, but in the future we should make sure that everyone is
2583 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002584 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002585 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002586 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2587 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002588 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002589}
2590
Jooyung Han479ca172020-10-19 18:51:07 +09002591func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2592 if c, ok := ctx.Module().(*Module); ok {
2593 ctx.VisitDirectDeps(func(dep android.Module) {
2594 depTag := ctx.OtherModuleDependencyTag(dep)
2595 ccDep, ok := dep.(LinkableInterface)
2596 if ok {
2597 checkLinkType(ctx, c, ccDep, depTag)
2598 }
2599 })
2600 }
2601}
2602
Jiyong Park5fb8c102018-04-09 12:03:06 +09002603// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002604// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2605// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002606// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002607func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2608 check := func(child, parent android.Module) bool {
2609 to, ok := child.(*Module)
2610 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002611 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002612 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002613
Jooyung Hana70f0672019-01-18 15:20:43 +09002614 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2615 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002616 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002617
Jiyong Park0474e1f2021-01-14 14:26:06 +09002618 // These dependencies are not excercised at runtime. Tracking these will give us
2619 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002620 depTag := ctx.OtherModuleDependencyTag(child)
2621 if IsHeaderDepTag(depTag) {
2622 return false
2623 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002624 if depTag == staticVariantTag {
2625 return false
2626 }
2627 if depTag == stubImplDepTag {
2628 return false
2629 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002630
Justin Yun63e9ec72020-10-29 16:49:43 +09002631 // Even if target lib has no vendor variant, keep checking dependency
2632 // graph in case it depends on vendor_available or product_available
2633 // but not double_loadable transtively.
2634 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002635 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002636 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002637
Jiyong Park0474e1f2021-01-14 14:26:06 +09002638 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2639 // one.
2640 if Bool(to.VendorProperties.Double_loadable) {
2641 return true
2642 }
2643
Ivan Lozanod7586b62021-04-01 09:49:36 -04002644 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002645 return false
2646 }
2647
Jooyung Hana70f0672019-01-18 15:20:43 +09002648 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2649 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002650 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002651 return false
2652 }
2653 if module, ok := ctx.Module().(*Module); ok {
2654 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002655 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002656 ctx.WalkDeps(check)
2657 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002658 }
2659 }
2660}
2661
Colin Crossc99deeb2016-04-11 15:06:20 -07002662// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002663func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002664 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002665
Colin Cross0de8a1e2020-09-18 14:15:30 -07002666 var directStaticDeps []StaticLibraryInfo
2667 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002668
Colin Cross0de8a1e2020-09-18 14:15:30 -07002669 reexportExporter := func(exporter FlagExporterInfo) {
2670 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2671 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2672 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2673 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2674 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002675 }
2676
Jooyung Hande34d232020-07-23 13:04:15 +09002677 // For the dependency from platform to apex, use the latest stubs
2678 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002679 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2680 if !apexInfo.IsForPlatform() {
Jiyong Park4eab21d2021-04-15 15:17:54 +09002681 c.apexSdkVersion = apexInfo.MinSdkVersion
Jooyung Hande34d232020-07-23 13:04:15 +09002682 }
2683
2684 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2685 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2686 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2687 // (b/144430859)
2688 c.apexSdkVersion = android.FutureApiLevel
2689 }
2690
Colin Crossd11fcda2017-10-23 17:59:01 -07002691 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002692 depName := ctx.OtherModuleName(dep)
2693 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002694
Dan Willemsen47450072021-10-19 20:24:49 -07002695 if depTag == android.DarwinUniversalVariantTag {
2696 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
2697 return
2698 }
2699
Ivan Lozano52767be2019-10-18 14:49:46 -07002700 ccDep, ok := dep.(LinkableInterface)
2701 if !ok {
2702
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002703 // handling for a few module types that aren't cc Module but that are also supported
2704 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002705 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002706 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002707 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2708 genRule.GeneratedSourceFiles()...)
2709 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002710 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002711 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002712 // Support exported headers from a generated_sources dependency
2713 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002714 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002715 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002716 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002717 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002718 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002719 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002720 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002721 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002722 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2723 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002724 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002725 // 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 +09002726 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002727
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002728 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002729 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002730 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002731 }
Colin Crosscef792e2021-06-11 18:01:26 -07002732 case CrtBeginDepTag:
2733 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
2734 case CrtEndDepTag:
2735 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08002736 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002737 return
2738 }
2739
Colin Crossfe17f6f2019-03-28 19:30:56 -07002740 if depTag == android.ProtoPluginDepTag {
2741 return
2742 }
2743
Colin Crossd11fcda2017-10-23 17:59:01 -07002744 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002745 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2746 return
2747 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002748 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002749 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2750 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002751 return
2752 }
2753
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002754 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07002755 // Skip reused objects for stub libraries, they use their own stub object file instead.
2756 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
2757 // version mutator, so the stubs variant is created from the shared variant that
2758 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07002759 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07002760 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2761 objs := staticAnalogue.ReuseObjects
2762 depPaths.Objs = depPaths.Objs.Append(objs)
2763 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2764 reexportExporter(depExporterInfo)
2765 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002766 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002767 }
2768
Colin Cross6e511a92020-07-27 21:26:48 -07002769 linkFile := ccDep.OutputFile()
2770
2771 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2772 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002773 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002774 return
2775 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002776
Jiyong Parke3867542020-12-03 17:28:25 +09002777 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
2778 return
2779 }
2780
Colin Cross0de8a1e2020-09-18 14:15:30 -07002781 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002782
Colin Cross6e511a92020-07-27 21:26:48 -07002783 var ptr *android.Paths
2784 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002785
Colin Cross6e511a92020-07-27 21:26:48 -07002786 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002787
Colin Cross6e511a92020-07-27 21:26:48 -07002788 switch {
2789 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08002790 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
2791 if !ctx.Config().AllowMissingDependencies() {
2792 ctx.ModuleErrorf("module %q is not a header library", depName)
2793 } else {
2794 ctx.AddMissingDependencies([]string{depName})
2795 }
2796 return
2797 }
Colin Cross6e511a92020-07-27 21:26:48 -07002798 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002799 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2800 if !ctx.Config().AllowMissingDependencies() {
2801 ctx.ModuleErrorf("module %q is not a shared library", depName)
2802 } else {
2803 ctx.AddMissingDependencies([]string{depName})
2804 }
2805 return
2806 }
Jiyong Parke3867542020-12-03 17:28:25 +09002807
Jiyong Park7d55b612021-06-11 17:22:09 +09002808 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
2809 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07002810
Jiyong Park1ad8e162020-12-01 23:40:09 +09002811 // Stubs lib doesn't link to the shared lib dependencies. Don't set
2812 // linkFile, depFile, and ptr.
2813 if c.IsStubs() {
2814 break
2815 }
2816
Colin Cross0de8a1e2020-09-18 14:15:30 -07002817 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2818 depFile = sharedLibraryInfo.TableOfContents
2819
Colin Cross6e511a92020-07-27 21:26:48 -07002820 ptr = &depPaths.SharedLibs
2821 switch libDepTag.Order {
2822 case earlyLibraryDependency:
2823 ptr = &depPaths.EarlySharedLibs
2824 depPtr = &depPaths.EarlySharedLibsDeps
2825 case normalLibraryDependency:
2826 ptr = &depPaths.SharedLibs
2827 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002828 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002829 case lateLibraryDependency:
2830 ptr = &depPaths.LateSharedLibs
2831 depPtr = &depPaths.LateSharedLibsDeps
2832 default:
2833 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002834 }
Colin Cross6e511a92020-07-27 21:26:48 -07002835 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002836 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2837 if !ctx.Config().AllowMissingDependencies() {
2838 ctx.ModuleErrorf("module %q is not a static library", depName)
2839 } else {
2840 ctx.AddMissingDependencies([]string{depName})
2841 }
2842 return
2843 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002844
2845 // Stubs lib doesn't link to the static lib dependencies. Don't set
2846 // linkFile, depFile, and ptr.
2847 if c.IsStubs() {
2848 break
2849 }
2850
Colin Cross0de8a1e2020-09-18 14:15:30 -07002851 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2852 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002853 if libDepTag.wholeStatic {
2854 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002855 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2856 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002857 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002858 // This case normally catches prebuilt static
2859 // libraries, but it can also occur when
2860 // AllowMissingDependencies is on and the
2861 // dependencies has no sources of its own
2862 // but has a whole_static_libs dependency
2863 // on a missing library. We want to depend
2864 // on the .a file so that there is something
2865 // in the dependency tree that contains the
2866 // error rule for the missing transitive
2867 // dependency.
2868 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002869 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08002870 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
2871 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07002872 } else {
2873 switch libDepTag.Order {
2874 case earlyLibraryDependency:
2875 panic(fmt.Errorf("early static libs not suppported"))
2876 case normalLibraryDependency:
2877 // static dependencies will be handled separately so they can be ordered
2878 // using transitive dependencies.
2879 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002880 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002881 case lateLibraryDependency:
2882 ptr = &depPaths.LateStaticLibs
2883 default:
2884 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002885 }
2886 }
Colin Cross3e5e7782022-06-17 22:17:05 +00002887 if libDepTag.unexportedSymbols {
2888 depPaths.LdFlags = append(depPaths.LdFlags,
2889 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
2890 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002891 }
2892
Colin Cross6e511a92020-07-27 21:26:48 -07002893 if libDepTag.static() && !libDepTag.wholeStatic {
2894 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2895 ctx.ModuleErrorf("module %q not a static library", depName)
2896 return
2897 }
Logan Chien43d34c32017-12-20 01:17:32 +08002898
Colin Cross6e511a92020-07-27 21:26:48 -07002899 // When combining coverage files for shared libraries and executables, coverage files
2900 // in static libraries act as if they were whole static libraries. The same goes for
2901 // source based Abi dump files.
2902 if c, ok := ccDep.(*Module); ok {
2903 staticLib := c.linker.(libraryInterface)
2904 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2905 staticLib.objs().coverageFiles...)
2906 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2907 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002908 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002909 // Handle non-CC modules here
2910 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002911 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002912 }
2913 }
2914
Colin Cross6e511a92020-07-27 21:26:48 -07002915 if ptr != nil {
2916 if !linkFile.Valid() {
2917 if !ctx.Config().AllowMissingDependencies() {
2918 ctx.ModuleErrorf("module %q missing output file", depName)
2919 } else {
2920 ctx.AddMissingDependencies([]string{depName})
2921 }
2922 return
2923 }
2924 *ptr = append(*ptr, linkFile.Path())
2925 }
2926
2927 if depPtr != nil {
2928 dep := depFile
2929 if !dep.Valid() {
2930 dep = linkFile
2931 }
2932 *depPtr = append(*depPtr, dep.Path())
2933 }
2934
Colin Cross0de8a1e2020-09-18 14:15:30 -07002935 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2936 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2937 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2938 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2939
2940 if libDepTag.reexportFlags {
2941 reexportExporter(depExporterInfo)
2942 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2943 // Re-exported shared library headers must be included as well since they can help us with type information
2944 // about template instantiations (instantiated from their headers).
2945 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2946 // scripts.
2947 c.sabi.Properties.ReexportedIncludes = append(
2948 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2949 }
2950
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002951 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07002952 switch {
2953 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002954 c.Properties.AndroidMkHeaderLibs = append(
2955 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002956 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07002957 if lib := moduleLibraryInterface(dep); lib != nil {
2958 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002959 // Add the dependency to the APEX(es) providing the library so that
2960 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002961 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09002962 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07002963 c.Properties.ApexesProvidingSharedLibs = append(
2964 c.Properties.ApexesProvidingSharedLibs, an)
2965 }
2966 }
2967 }
2968
2969 // Note: the order of libs in this list is not important because
2970 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002971 c.Properties.AndroidMkSharedLibs = append(
2972 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002973 // Record BaseLibName for snapshots.
2974 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07002975 case libDepTag.static():
2976 if libDepTag.wholeStatic {
2977 c.Properties.AndroidMkWholeStaticLibs = append(
2978 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2979 } else {
2980 c.Properties.AndroidMkStaticLibs = append(
2981 c.Properties.AndroidMkStaticLibs, makeLibName)
2982 }
Justin Yun5e035862021-06-29 20:50:37 +09002983 // Record BaseLibName for snapshots.
2984 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07002985 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002986 } else if !c.IsStubs() {
2987 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
2988
Colin Cross6e511a92020-07-27 21:26:48 -07002989 switch depTag {
2990 case runtimeDepTag:
2991 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002992 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002993 // Record BaseLibName for snapshots.
2994 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07002995 case objDepTag:
2996 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2997 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07002998 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002999 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003000 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003001 case dynamicLinkerDepTag:
3002 depPaths.DynamicLinker = linkFile
3003 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003004 }
Colin Crossca860ac2016-01-04 14:34:37 -08003005 })
3006
Jeff Gaston294356f2017-09-27 17:05:30 -07003007 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003008 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3009 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3010 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003011
Colin Crossdd84e052017-05-17 13:44:16 -07003012 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003013 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003014 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3015 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003016 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003017 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3018 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003019 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003020 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003021 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003022
3023 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003024 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003025 }
Colin Crossdd84e052017-05-17 13:44:16 -07003026
Colin Crossca860ac2016-01-04 14:34:37 -08003027 return depPaths
3028}
3029
Jiyong Park7d55b612021-06-11 17:22:09 +09003030// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3031// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3032// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3033// has different level of updatability. For example, if a library foo in an APEX depends on a
3034// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3035// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3036// same APEX as foo, the non-stub variant of bar is used.
3037func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3038 depName := ctx.OtherModuleName(dep)
3039 depTag := ctx.OtherModuleDependencyTag(dep)
3040 libDepTag, ok := depTag.(libraryDependencyTag)
3041 if !ok || !libDepTag.shared() {
3042 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3043 }
3044
3045 thisModule, ok := ctx.Module().(android.ApexModule)
3046 if !ok {
3047 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3048 }
3049
3050 useVndk := false
3051 bootstrap := false
3052 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3053 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3054 } else {
3055 useVndk = linkable.UseVndk()
3056 bootstrap = linkable.Bootstrap()
3057 }
3058
3059 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
3060 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3061 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
3062 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
3063
3064 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
3065 useStubs := false
3066
3067 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3068 if !apexInfo.IsForPlatform() {
3069 // For platform libraries, use current version of LLNDK
3070 // If this is for use_vendor apex we will apply the same rules
3071 // of apex sdk enforcement below to choose right version.
3072 useStubs = true
3073 }
Jiyong Park9477c262021-06-22 20:23:05 +09003074 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3075 // If not building for APEX or the containing APEX allows the use of
3076 // platform APIs, use stubs only when it is from an APEX (and not from
3077 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3078 // bootstrap modules, always link to non-stub variant
Jiyong Park7d55b612021-06-11 17:22:09 +09003079 useStubs = dep.(android.ApexModule).NotInPlatform() && !bootstrap
3080 if useStubs {
3081 // Another exception: if this module is a test for an APEX, then
3082 // it is linked with the non-stub variant of a module in the APEX
3083 // as if this is part of the APEX.
3084 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
3085 for _, apexContents := range testFor.ApexContents {
3086 if apexContents.DirectlyInApex(depName) {
3087 useStubs = false
3088 break
3089 }
3090 }
3091 }
3092 if useStubs {
3093 // Yet another exception: If this module and the dependency are
3094 // available to the same APEXes then skip stubs between their
3095 // platform variants. This complements the test_for case above,
3096 // which avoids the stubs on a direct APEX library dependency, by
3097 // avoiding stubs for indirect test dependencies as well.
3098 //
3099 // TODO(b/183882457): This doesn't work if the two libraries have
3100 // only partially overlapping apex_available. For that test_for
3101 // modules would need to be split into APEX variants and resolved
3102 // separately for each APEX they have access to.
3103 if android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3104 useStubs = false
3105 }
3106 }
3107 } else {
3108 // If building for APEX, use stubs when the parent is in any APEX that
3109 // the child is not in.
3110 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3111 }
3112
3113 // when to use (unspecified) stubs, use the latest one.
3114 if useStubs {
3115 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3116 toUse := stubs[len(stubs)-1]
3117 sharedLibraryInfo = toUse.SharedLibraryInfo
3118 depExporterInfo = toUse.FlagExporterInfo
3119 }
3120 }
3121 return sharedLibraryInfo, depExporterInfo
3122}
3123
Colin Cross0de8a1e2020-09-18 14:15:30 -07003124// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3125// to match the topological order of the dependency tree, including any static analogues of
3126// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3127// of the transitive dependencies.
3128func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
3129 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
3130 var staticPaths android.Paths
3131 for _, staticDep := range staticDeps {
3132 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3133 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3134 }
3135 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003136 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3137 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003138 }
3139 }
3140 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3141
3142 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3143
3144 // reorder the dependencies based on transitive dependencies
3145 staticPaths = android.FirstUniquePaths(staticPaths)
3146 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3147
3148 if len(orderedStaticPaths) != len(staticPaths) {
3149 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3150 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3151 }
3152
3153 return orderedStaticPaths, transitiveStaticLibs
3154}
3155
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003156// BaseLibName trims known prefixes and suffixes
3157func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003158 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3159 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003160 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003161 return libName
3162}
3163
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003164func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003165 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003166 ccDepModule, _ := ccDep.(*Module)
3167 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003168 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003169
Justin Yuncbca3732021-02-03 19:24:13 +09003170 if ccDepModule != nil {
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003171 // TODO(ivanlozano) Support snapshots for Rust-produced C library variants.
Colin Cross6e511a92020-07-27 21:26:48 -07003172 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003173 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003174 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003175
Ivan Lozanod1dec542021-05-26 15:33:11 -04003176 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003177 }
3178 }
3179
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003180 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3181 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003182 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3183 // core module instead.
3184 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003185 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003186 // The vendor and product modules in Make will have been renamed to not conflict with the
3187 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003188 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003189 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003190 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003191 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003192 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003193 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003194 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003195 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003196 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003197 } else {
3198 return libName
3199 }
3200}
3201
Colin Crossca860ac2016-01-04 14:34:37 -08003202func (c *Module) InstallInData() bool {
3203 if c.installer == nil {
3204 return false
3205 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003206 return c.installer.inData()
3207}
3208
3209func (c *Module) InstallInSanitizerDir() bool {
3210 if c.installer == nil {
3211 return false
3212 }
3213 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003214 return true
3215 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003216 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003217}
3218
Yifan Hong1b3348d2020-01-21 15:53:22 -08003219func (c *Module) InstallInRamdisk() bool {
3220 return c.InRamdisk()
3221}
3222
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003223func (c *Module) InstallInVendorRamdisk() bool {
3224 return c.InVendorRamdisk()
3225}
3226
Jiyong Parkf9332f12018-02-01 00:54:12 +09003227func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003228 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003229}
3230
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003231func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003232 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003233 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003234 return
3235 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003236 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003237}
3238
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003239func (c *Module) HostToolPath() android.OptionalPath {
3240 if c.installer == nil {
3241 return android.OptionalPath{}
3242 }
3243 return c.installer.hostToolPath()
3244}
3245
Nan Zhangd4e641b2017-07-12 12:55:28 -07003246func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3247 return c.outputFile
3248}
3249
Colin Cross41955e82019-05-29 14:40:35 -07003250func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3251 switch tag {
3252 case "":
3253 if c.outputFile.Valid() {
3254 return android.Paths{c.outputFile.Path()}, nil
3255 }
3256 return android.Paths{}, nil
3257 default:
3258 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003259 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003260}
3261
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003262func (c *Module) static() bool {
3263 if static, ok := c.linker.(interface {
3264 static() bool
3265 }); ok {
3266 return static.static()
3267 }
3268 return false
3269}
3270
Jiyong Park379de2f2018-12-19 02:47:14 +09003271func (c *Module) staticBinary() bool {
3272 if static, ok := c.linker.(interface {
3273 staticBinary() bool
3274 }); ok {
3275 return static.staticBinary()
3276 }
3277 return false
3278}
3279
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003280func (c *Module) testBinary() bool {
3281 if test, ok := c.linker.(interface {
3282 testBinary() bool
3283 }); ok {
3284 return test.testBinary()
3285 }
3286 return false
3287}
3288
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003289func (c *Module) benchmarkBinary() bool {
3290 if b, ok := c.linker.(interface {
3291 benchmarkBinary() bool
3292 }); ok {
3293 return b.benchmarkBinary()
3294 }
3295 return false
3296}
3297
3298func (c *Module) fuzzBinary() bool {
3299 if f, ok := c.linker.(interface {
3300 fuzzBinary() bool
3301 }); ok {
3302 return f.fuzzBinary()
3303 }
3304 return false
3305}
3306
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003307// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3308func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003309 if h, ok := c.linker.(interface {
3310 header() bool
3311 }); ok {
3312 return h.header()
3313 }
3314 return false
3315}
3316
Ivan Lozanod7586b62021-04-01 09:49:36 -04003317func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003318 if b, ok := c.linker.(interface {
3319 binary() bool
3320 }); ok {
3321 return b.binary()
3322 }
3323 return false
3324}
3325
Justin Yun5e035862021-06-29 20:50:37 +09003326func (c *Module) StaticExecutable() bool {
3327 if b, ok := c.linker.(*binaryDecorator); ok {
3328 return b.static()
3329 }
3330 return false
3331}
3332
Ivan Lozanod7586b62021-04-01 09:49:36 -04003333func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003334 if o, ok := c.linker.(interface {
3335 object() bool
3336 }); ok {
3337 return o.object()
3338 }
3339 return false
3340}
3341
Ivan Lozanof9e21722020-12-02 09:00:51 -05003342func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003343 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003344 if c.IsLlndk() {
3345 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003346 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003347 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003348 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003349 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003350 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003351 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003352 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003353 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003354 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003355 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003356 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003357 return "native:product"
3358 }
Jooyung Han38002912019-05-16 04:01:54 +09003359 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003360 } else if c.InRamdisk() {
3361 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003362 } else if c.InVendorRamdisk() {
3363 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003364 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003365 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003366 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003367 return "native:ndk:none:none"
3368 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3369 //family, link := getNdkStlFamilyAndLinkType(c)
3370 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003371 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003372 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003373 } else {
3374 return "native:platform"
3375 }
3376}
3377
Jiyong Park9d452992018-10-03 00:38:19 +09003378// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003379// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003380func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003381 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003382 // Stub libs and prebuilt libs in a versioned SDK are not
3383 // installable to APEX even though they are shared libs.
Colin Cross31076b32020-10-23 17:22:06 -07003384 return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01003385 } else if _, ok := c.linker.(testPerSrc); ok {
3386 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003387 }
3388 return false
3389}
3390
Jiyong Parka90ca002019-10-07 15:47:24 +09003391func (c *Module) AvailableFor(what string) bool {
3392 if linker, ok := c.linker.(interface {
3393 availableFor(string) bool
3394 }); ok {
3395 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3396 } else {
3397 return c.ApexModuleBase.AvailableFor(what)
3398 }
3399}
3400
Jiyong Park62304bb2020-04-13 16:19:48 +09003401func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003402 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003403}
3404
Paul Duffin0cb37b92020-03-04 14:52:46 +00003405func (c *Module) EverInstallable() bool {
3406 return c.installer != nil &&
3407 // Check to see whether the module is actually ever installable.
3408 c.installer.everInstallable()
3409}
3410
Ivan Lozanod7586b62021-04-01 09:49:36 -04003411func (c *Module) PreventInstall() bool {
3412 return c.Properties.PreventInstall
3413}
3414
3415func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003416 if c.library != nil {
3417 if i := c.library.installable(); i != nil {
3418 return i
3419 }
3420 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003421 return c.Properties.Installable
3422}
3423
3424func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003425 ret := c.EverInstallable() &&
3426 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003427 proptools.BoolDefault(c.Installable(), true) &&
3428 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003429
3430 // The platform variant doesn't need further condition. Apex variants however might not
3431 // be installable because it will likely to be included in the APEX and won't appear
3432 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003433 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003434 return ret
3435 }
3436
3437 // Special case for modules that are configured to be installed to /data, which includes
3438 // test modules. For these modules, both APEX and non-APEX variants are considered as
3439 // installable. This is because even the APEX variants won't be included in the APEX, but
3440 // will anyway be installed to /data/*.
3441 // See b/146995717
3442 if c.InstallInData() {
3443 return ret
3444 }
3445
3446 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003447}
3448
Logan Chien41eabe62019-04-10 13:33:58 +08003449func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3450 if c.linker != nil {
3451 if library, ok := c.linker.(*libraryDecorator); ok {
3452 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3453 }
3454 }
3455}
3456
Jiyong Park45bf82e2020-12-15 22:29:02 +09003457var _ android.ApexModule = (*Module)(nil)
3458
3459// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003460func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003461 depTag := ctx.OtherModuleDependencyTag(dep)
3462 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3463
3464 if cc, ok := dep.(*Module); ok {
3465 if cc.HasStubsVariants() {
3466 if isLibDepTag && libDepTag.shared() {
3467 // dynamic dep to a stubs lib crosses APEX boundary
3468 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003469 }
Colin Cross6e511a92020-07-27 21:26:48 -07003470 if IsRuntimeDepTag(depTag) {
3471 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003472 return false
3473 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003474 }
Zhijun Heec285872021-04-24 10:47:08 -07003475 if cc.IsLlndk() {
3476 return false
3477 }
Colin Crossaac32222020-07-29 12:51:56 -07003478 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003479 // shared_lib dependency from a static lib is considered as crossing
3480 // the APEX boundary because the dependency doesn't actually is
3481 // linked; the dependency is used only during the compilation phase.
3482 return false
3483 }
Jiyong Parke3867542020-12-03 17:28:25 +09003484
3485 if isLibDepTag && libDepTag.excludeInApex {
3486 return false
3487 }
Colin Cross6e511a92020-07-27 21:26:48 -07003488 }
Colin Crossc1b36442021-05-06 13:42:48 -07003489 if depTag == stubImplDepTag {
3490 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003491 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003492 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003493 if depTag == staticVariantTag {
3494 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3495 // actually mean that the static lib (and its dependencies) are copied into the
3496 // APEX.
3497 return false
3498 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003499 return true
3500}
3501
Jiyong Park45bf82e2020-12-15 22:29:02 +09003502// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003503func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3504 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003505 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3506 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3507 return nil
3508 }
Jooyung Han749dc692020-04-15 11:03:39 +09003509 // We don't check for prebuilt modules
3510 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3511 return nil
3512 }
3513 minSdkVersion := c.MinSdkVersion()
3514 if minSdkVersion == "apex_inherit" {
3515 return nil
3516 }
3517 if minSdkVersion == "" {
3518 // JNI libs within APK-in-APEX fall into here
3519 // Those are okay to set sdk_version instead
3520 // We don't have to check if this is a SDK variant because
3521 // non-SDK variant resets sdk_version, which works too.
3522 minSdkVersion = c.SdkVersion()
3523 }
Dan Albertc8060532020-07-22 22:32:17 -07003524 if minSdkVersion == "" {
3525 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3526 }
3527 // Not using nativeApiLevelFromUser because the context here is not
3528 // necessarily a native context.
3529 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003530 if err != nil {
3531 return err
3532 }
Dan Albertc8060532020-07-22 22:32:17 -07003533
3534 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003535 return fmt.Errorf("newer SDK(%v)", ver)
3536 }
3537 return nil
3538}
3539
Paul Duffinb5769c12021-05-12 16:16:51 +01003540// Implements android.ApexModule
3541func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3542 // stub libraries and native bridge libraries are always available to platform
3543 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3544}
3545
Jooyung Han91f92032022-02-04 12:36:33 +09003546// Overrides android.ApexModuleBase.UniqueApexVariations
3547func (c *Module) UniqueApexVariations() bool {
3548 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
3549 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
3550 // variation of the VNDK lib because APEX variations are merged/grouped.
3551 return c.UseVndk() && c.IsVndk()
3552}
3553
Rob Seymour925aa092021-08-10 20:42:03 +00003554var _ snapshot.RelativeInstallPath = (*Module)(nil)
3555
Liz Kammer35ca77e2021-12-22 15:31:40 -05003556type moduleType int
3557
3558const (
3559 unknownType moduleType = iota
3560 binary
3561 object
3562 fullLibrary
3563 staticLibrary
3564 sharedLibrary
3565 headerLibrary
3566)
3567
3568func (c *Module) typ() moduleType {
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003569 if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003570 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003571 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003572 return object
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003573 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05003574 static := false
3575 shared := false
3576 if library, ok := c.linker.(*libraryDecorator); ok {
3577 static = library.MutatedProperties.BuildStatic
3578 shared = library.MutatedProperties.BuildShared
3579 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
3580 static = library.MutatedProperties.BuildStatic
3581 shared = library.MutatedProperties.BuildShared
3582 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003583 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003584 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003585 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003586 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003587 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003588 return staticLibrary
3589 }
3590 return sharedLibrary
3591 }
3592 return unknownType
3593}
3594
3595// ConvertWithBp2build converts Module to Bazel for bp2build.
3596func (c *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
3597 prebuilt := c.IsPrebuilt()
3598 switch c.typ() {
3599 case binary:
3600 if !prebuilt {
3601 binaryBp2build(ctx, c, ctx.ModuleType())
3602 }
3603 case object:
3604 if !prebuilt {
3605 objectBp2Build(ctx, c)
3606 }
3607 case fullLibrary:
3608 if !prebuilt {
3609 libraryBp2Build(ctx, c)
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00003610 } else {
3611 prebuiltLibraryBp2Build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05003612 }
3613 case headerLibrary:
3614 libraryHeadersBp2Build(ctx, c)
3615 case staticLibrary:
Liz Kammer35ca77e2021-12-22 15:31:40 -05003616 if prebuilt {
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00003617 prebuiltLibraryStaticBp2Build(ctx, c, false)
Liz Kammer35ca77e2021-12-22 15:31:40 -05003618 } else {
3619 sharedOrStaticLibraryBp2Build(ctx, c, true)
3620 }
3621 case sharedLibrary:
3622 if prebuilt {
3623 prebuiltLibrarySharedBp2Build(ctx, c)
3624 } else {
3625 sharedOrStaticLibraryBp2Build(ctx, c, false)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003626 }
3627 }
3628}
3629
Colin Cross2ba19d92015-05-07 15:44:20 -07003630//
Colin Crosscfad1192015-11-02 16:43:11 -08003631// Defaults
3632//
Colin Crossca860ac2016-01-04 14:34:37 -08003633type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07003634 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07003635 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09003636 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08003637}
3638
Patrice Arrudac249c712019-03-19 17:00:29 -07003639// cc_defaults provides a set of properties that can be inherited by other cc
3640// modules. A module can use the properties from a cc_defaults using
3641// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3642// merged (when possible) by prepending the default module's values to the
3643// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003644func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003645 return DefaultsFactory()
3646}
3647
Colin Cross36242852017-06-23 15:06:31 -07003648func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003649 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003650
Colin Cross36242852017-06-23 15:06:31 -07003651 module.AddProperties(props...)
3652 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003653 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003654 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003655 &BaseCompilerProperties{},
3656 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003657 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003658 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003659 &StaticProperties{},
3660 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003661 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003662 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00003663 &TestLinkerProperties{},
3664 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003665 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003666 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07003667 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003668 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003669 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003670 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003671 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003672 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003673 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003674 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003675 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003676 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08003677 &AfdoProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003678 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003679 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003680 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3681 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07003682 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003683 )
Colin Crosscfad1192015-11-02 16:43:11 -08003684
Jooyung Hancc372c52019-09-25 15:18:44 +09003685 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003686
3687 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003688}
3689
Jiyong Park2286afd2020-06-16 21:58:53 +09003690func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02003691 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09003692}
3693
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003694func kytheExtractAllFactory() android.Singleton {
3695 return &kytheExtractAllSingleton{}
3696}
3697
3698type kytheExtractAllSingleton struct {
3699}
3700
3701func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3702 var xrefTargets android.Paths
3703 ctx.VisitAllModules(func(module android.Module) {
3704 if ccModule, ok := module.(xref); ok {
3705 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3706 }
3707 })
3708 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3709 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003710 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003711 }
3712}
3713
Colin Cross06a931b2015-10-28 17:23:31 -07003714var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003715var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003716var BoolPtr = proptools.BoolPtr
3717var String = proptools.String
3718var StringPtr = proptools.StringPtr