blob: 29a5fe10b56acd2f9c76b45512a1ebe0d3064528 [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"
Kiyoung Kim487689e2022-07-26 09:48:22 +090034 "android/soong/multitree"
Rob Seymour925aa092021-08-10 20:42:03 +000035 "android/soong/snapshot"
Colin Cross3f40fa42015-01-30 17:27:36 -080036)
37
Colin Cross463a90e2015-06-17 14:20:06 -070038func init() {
Paul Duffin036e7002019-12-19 19:16:28 +000039 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -070040
Paul Duffin036e7002019-12-19 19:16:28 +000041 pctx.Import("android/soong/cc/config")
42}
43
44func RegisterCCBuildComponents(ctx android.RegistrationContext) {
45 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
46
47 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossc511bc52020-04-07 16:50:32 +000048 ctx.BottomUp("sdk", sdkMutator).Parallel()
Inseob Kim64c43952019-08-26 16:52:35 +090049 ctx.BottomUp("vndk", VndkMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070050 ctx.BottomUp("link", LinkageMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +010051 ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
Colin Crossd1f898e2020-08-18 18:35:15 -070052 ctx.BottomUp("version", versionMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070053 ctx.BottomUp("begin", BeginMutator).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
Cory Barkera1da26f2022-06-07 20:12:06 +000064 ctx.TopDown("fuzz_deps", fuzzMutatorDeps)
Cory Barkera1da26f2022-06-07 20:12:06 +000065
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -080066 ctx.BottomUp("coverage", coverageMutator).Parallel()
Stephen Craneba090d12017-05-09 15:44:35 -070067
Yi Kongeb8efc92021-12-09 18:06:29 +080068 ctx.TopDown("afdo_deps", afdoDepsMutator)
69 ctx.BottomUp("afdo", afdoMutator).Parallel()
70
Stephen Craneba090d12017-05-09 15:44:35 -070071 ctx.TopDown("lto_deps", ltoDepsMutator)
72 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090073
Jooyung Han479ca172020-10-19 18:51:07 +090074 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090075 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070076 })
Colin Crossb98c8b02016-07-29 13:44:28 -070077
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080078 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
79 // sabi mutator needs to be run after apex mutator finishes.
80 ctx.TopDown("sabi_deps", sabiDepsMutator)
81 })
82
Colin Cross57898582020-10-29 18:25:19 -070083 ctx.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070084}
85
Chris Parsonsef6e0cf2020-12-01 18:26:21 -050086// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
87// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
88// edges to these modules.
89// This object is constructed in DepsMutator, by calling to various module delegates to set
90// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
91// dependencies.
92// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
93// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -080094type Deps struct {
95 SharedLibs, LateSharedLibs []string
96 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -080097 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +080098 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -070099
Colin Cross3e5e7782022-06-17 22:17:05 +0000100 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
101 // prevent automatically exporting symbols.
102 UnexportedStaticLibs []string
103
Chris Parsons79d66a52020-06-05 17:26:16 -0400104 // Used for data dependencies adjacent to tests
105 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700106 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400107
Yo Chiang219968c2020-09-22 18:45:04 +0800108 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
109 SystemSharedLibs []string
110
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500111 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800112 StaticUnwinderIfLegacy bool
113
Colin Cross5950f382016-12-13 12:50:57 -0800114 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700115
Colin Cross81413472016-04-11 14:37:39 -0700116 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700117
Dan Willemsenb40aab62016-04-20 14:21:14 -0700118 GeneratedSources []string
119 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900120 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700121
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700122 ReexportGeneratedHeaders []string
123
Colin Crossc465efd2021-06-11 18:00:04 -0700124 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700125
126 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700127 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900128
129 // List of libs that need to be excluded for APEX variant
130 ExcludeLibsForApex []string
Colin Crossc472d572015-03-17 15:06:21 -0700131}
132
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500133// PathDeps is a struct containing file paths to dependencies of a module.
134// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
135// It's used to construct flags for various build statements (such as for compiling and linking).
136// It is then passed to module decorator functions responsible for registering build statements
137// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800138type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700139 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900140 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700141 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900142 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700143 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700144 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700145
Colin Cross0de8a1e2020-09-18 14:15:30 -0700146 // Transitive static library dependencies of static libraries for use in ordering.
147 TranstiveStaticLibrariesForOrdering *android.DepSet
148
Colin Cross26c34ed2016-09-30 17:10:16 -0700149 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100150 Objs Objects
151 // Paths to .o files in dependencies that provide them. Note that these lists
152 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800153 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700154 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700155
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100156 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
157 // the libs from all whole_static_lib dependencies.
158 WholeStaticLibsFromPrebuilts android.Paths
159
Colin Cross26c34ed2016-09-30 17:10:16 -0700160 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700161 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900162 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700163
Inseob Kimd110f872019-12-06 13:15:38 +0900164 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000165 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900166 IncludeDirs android.Paths
167 SystemIncludeDirs android.Paths
168 ReexportedDirs android.Paths
169 ReexportedSystemDirs android.Paths
170 ReexportedFlags []string
171 ReexportedGeneratedHeaders android.Paths
172 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700173
Colin Cross26c34ed2016-09-30 17:10:16 -0700174 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700175 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700176
Dan Willemsena0790e32018-10-12 00:24:23 -0700177 // Path to the dynamic linker binary
178 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700179
180 // For Darwin builds, the path to the second architecture's output that should
181 // be combined with this architectures's output into a FAT MachO file.
182 DarwinSecondArchOutput android.OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700183}
184
Colin Cross4af21ed2019-11-04 09:37:55 -0800185// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
186// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
187// command line so they can be overridden by the local module flags).
188type LocalOrGlobalFlags struct {
189 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700190 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800191 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700192 CFlags []string // Flags that apply to C and C++ source files
193 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
194 ConlyFlags []string // Flags that apply to C source files
195 CppFlags []string // Flags that apply to C++ source files
196 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700197 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800198}
199
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500200// Flags contains various types of command line flags (and settings) for use in building build
201// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800202type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500203 // Local flags (which individual modules are responsible for). These may override global flags.
204 Local LocalOrGlobalFlags
205 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800206 Global LocalOrGlobalFlags
207
208 aidlFlags []string // Flags that apply to aidl source files
209 rsFlags []string // Flags that apply to renderscript source files
210 libFlags []string // Flags to add libraries early to the link order
211 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
212 TidyFlags []string // Flags that apply to clang-tidy
213 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700214
Colin Crossc3199482017-03-30 15:03:04 -0700215 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800216 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700217 SystemIncludeFlags []string
218
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800219 Toolchain config.Toolchain
220 Tidy bool // True if ninja .tidy rules should be generated.
221 NeedTidyFiles bool // True if module link should depend on .tidy files
222 GcovCoverage bool // True if coverage files should be generated.
223 SAbiDump bool // True if header abi dumps should be generated.
224 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800225
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500226 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800227 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500228 // The target-device system path to the dynamic linker.
229 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800230
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700231 CFlagsDeps android.Paths // Files depended on by compiler flags
232 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800233
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500234 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700235 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800236
Colin Cross19878da2019-03-28 14:45:07 -0700237 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700238 protoC bool // Whether to use C instead of C++
239 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700240
241 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200242 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700243}
244
Colin Crossca860ac2016-01-04 14:34:37 -0800245// Properties used to compile all C or C++ modules
246type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700247 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800248 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700249
Jiyong Parkb35a8192020-08-10 15:59:36 +0900250 // The API level that this module is built against. The APIs of this API level will be
251 // visible at build time, but use of any APIs newer than min_sdk_version will render the
252 // module unloadable on older devices. In the future it will be possible to weakly-link new
253 // APIs, making the behavior match Java: such modules will load on older devices, but
254 // calling new APIs on devices that do not support them will result in a crash.
255 //
256 // This property has the same behavior as sdk_version does for Java modules. For those
257 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
258 // does for Java code.
259 //
260 // In addition, setting this property causes two variants to be built, one for the platform
261 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800262 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700263
Jiyong Parkb35a8192020-08-10 15:59:36 +0900264 // Minimum OS API level supported by this C or C++ module. This property becomes the value
265 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
266 // this property is also used to ensure that the min_sdk_version of the containing module is
267 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
268 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
269 // min_sdk_version of the containing APEX. When the module
270 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900271 Min_sdk_version *string
272
Colin Crossc511bc52020-04-07 16:50:32 +0000273 // If true, always create an sdk variant and don't create a platform variant.
274 Sdk_variant_only *bool
275
Jiyong Parkde866cb2018-12-07 23:08:36 +0900276 AndroidMkSharedLibs []string `blueprint:"mutated"`
277 AndroidMkStaticLibs []string `blueprint:"mutated"`
278 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
279 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700280 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900281 HideFromMake bool `blueprint:"mutated"`
282 PreventInstall bool `blueprint:"mutated"`
283 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700284
Yo Chiang219968c2020-09-22 18:45:04 +0800285 // Set by DepsMutator.
286 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
287
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200288 // The name of the image this module is built for, suffixed with a '.'
Justin Yun5f7f7e82019-11-18 19:52:14 +0900289 ImageVariationPrefix string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200290
291 // The VNDK version this module is built against. If empty, the module is not
292 // build against the VNDK.
293 VndkVersion string `blueprint:"mutated"`
294
295 // Suffix for the name of Android.mk entries generated by this module
296 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800297
298 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
299 // file
300 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900301
Yifan Hong39143a92020-10-26 12:43:12 -0700302 // Make this module available when building for ramdisk.
303 // On device without a dedicated recovery partition, the module is only
304 // available after switching root into
305 // /first_stage_ramdisk. To expose the module before switching root, install
306 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800307 Ramdisk_available *bool
308
Yifan Hong39143a92020-10-26 12:43:12 -0700309 // Make this module available when building for vendor ramdisk.
310 // On device without a dedicated recovery partition, the module is only
311 // available after switching root into
312 // /first_stage_ramdisk. To expose the module before switching root, install
313 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700314 Vendor_ramdisk_available *bool
315
Jiyong Parkf9332f12018-02-01 00:54:12 +0900316 // Make this module available when building for recovery
317 Recovery_available *bool
318
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200319 // Used by imageMutator, set by ImageMutatorBegin()
320 CoreVariantNeeded bool `blueprint:"mutated"`
321 RamdiskVariantNeeded bool `blueprint:"mutated"`
322 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
323 RecoveryVariantNeeded bool `blueprint:"mutated"`
324
325 // A list of variations for the "image" mutator of the form
326 //<image name> '.' <version char>, for example, 'vendor.S'
327 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900328
329 // Allows this module to use non-APEX version of libraries. Useful
330 // for building binaries that are started before APEXes are activated.
331 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900332
333 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
334 // see soong/cc/config/vndk.go
335 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900336
337 // Used by vendor snapshot to record dependencies from snapshot modules.
338 SnapshotSharedLibs []string `blueprint:"mutated"`
Justin Yun5e035862021-06-29 20:50:37 +0900339 SnapshotStaticLibs []string `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900340 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000341
Colin Cross1bc94122021-10-28 13:25:54 -0700342 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000343
344 // Set by factories of module types that can only be referenced from variants compiled against
345 // the SDK.
346 AlwaysSdk bool `blueprint:"mutated"`
347
348 // Variant is an SDK variant created by sdkMutator
349 IsSdkVariant bool `blueprint:"mutated"`
350 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
351 // variant to have a ".sdk" suffix.
352 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700353
354 // Normally Soong uses the directory structure to decide which modules
355 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800356 // different snapshots (vendor, recovery, etc.), but this property
357 // allows a partner to exclude a module normally thought of as a
358 // framework module from the vendor snapshot.
359 Exclude_from_vendor_snapshot *bool
360
361 // Normally Soong uses the directory structure to decide which modules
362 // should be included (framework) or excluded (non-framework) from the
363 // different snapshots (vendor, recovery, etc.), but this property
364 // allows a partner to exclude a module normally thought of as a
365 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800366 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900367
368 // List of APEXes that this module has private access to for testing purpose. The module
369 // can depend on libraries that are not exported by the APEXes and use private symbols
370 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000371 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800372
373 Target struct {
374 Platform struct {
375 // List of modules required by the core variant.
376 Required []string `android:"arch_variant"`
377
378 // List of modules not required by the core variant.
379 Exclude_required []string `android:"arch_variant"`
380 } `android:"arch_variant"`
381
382 Recovery struct {
383 // List of modules required by the recovery variant.
384 Required []string `android:"arch_variant"`
385
386 // List of modules not required by the recovery variant.
387 Exclude_required []string `android:"arch_variant"`
388 } `android:"arch_variant"`
389 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700390}
391
392type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900393 // whether this module should be allowed to be directly depended by other
394 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900395 // If set to true, two variants will be built separately, one like
396 // normal, and the other limited to the set of libraries and headers
397 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700398 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900399 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700400 // so it shouldn't have any unversioned runtime dependencies, or
401 // make assumptions about the system that may not be true in the
402 // future.
403 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900404 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900405 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900406 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900407 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900408 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700409 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
410 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900411
Justin Yunebcf0c52021-01-08 18:00:19 +0900412 // This is the same as the "vendor_available" except that the install path
413 // of the vendor variant is /odm or /vendor/odm.
414 // By replacing "vendor_available: true" with "odm_available: true", the
415 // module will install its vendor variant to the /odm partition or /vendor/odm.
416 // As the modules with "odm_available: true" still create the vendor variants,
417 // they can link to the other vendor modules as the vendor_available modules do.
418 // Also, the vendor modules can link to odm_available modules.
419 //
420 // It may not be used for VNDK modules.
421 Odm_available *bool
422
Justin Yun63e9ec72020-10-29 16:49:43 +0900423 // whether this module should be allowed to be directly depended by other
424 // modules with `product_specific: true` or `product_available: true`.
425 // If set to true, an additional product variant will be built separately
426 // that is limited to the set of libraries and headers that are exposed to
427 // /product modules.
428 //
429 // The product variant may be used with a different (newer) /system,
430 // so it shouldn't have any unversioned runtime dependencies, or
431 // make assumptions about the system that may not be true in the
432 // future.
433 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900434 // If set to false, this module becomes inaccessible from /product modules.
435 //
436 // Different from the 'vendor_available' property, the modules with
437 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
438 // library without 'product_available' may not be depended on by any other
439 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900440 //
441 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
442 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
443 Product_available *bool
444
Jiyong Park5fb8c102018-04-09 12:03:06 +0900445 // whether this module is capable of being loaded with other instance
446 // (possibly an older version) of the same module in the same process.
447 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
448 // can be double loaded in a vendor process if the library is also a
449 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
450 // explicitly marked as `double_loadable: true` by the owner, or the dependency
451 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
452 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800453
454 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
455 IsLLNDK bool `blueprint:"mutated"`
456
Colin Cross78212242021-01-06 14:51:30 -0800457 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
458 // set and the module is not listed in VndkMustUseVendorVariantList.
459 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
460
461 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
462 IsVNDKCore bool `blueprint:"mutated"`
463
464 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
465 IsVNDKSP bool `blueprint:"mutated"`
466
467 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
468 // module sets the llndk.private property.
469 IsVNDKPrivate bool `blueprint:"mutated"`
470
471 // IsVNDKProduct is set if a VNDK module sets the product_available property.
472 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700473
474 // IsVendorPublicLibrary is set for the core and product variants of a library that has
475 // vendor_public_library stubs.
476 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800477}
478
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500479// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
480// to understanding details about the type of the current module.
481// For example, one might call these functions to determine whether the current module is a static
482// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800483type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800484 static() bool
485 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700486 testBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900487 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900488 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900489 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700490 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900491 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700492 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800493 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900494 minSdkVersion() string
495 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700496 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700497 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800498 IsLlndk() bool
499 IsLlndkPublic() bool
500 isImplementationForLLNDKPublic() bool
501 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900502 isVndk() bool
503 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500504 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700505 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900506 inProduct() bool
507 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800508 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700509 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900510 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700511 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700512 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800513 getVndkExtendsModuleName() string
Yi Kong4ef54592022-02-14 20:00:10 +0800514 isAfdoCompile() bool
Yi Kong7e53c572018-02-14 18:16:12 +0800515 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800516 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800517 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800518 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700519 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700520 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900521 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800522 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700523 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700524 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800525 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800526 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800527 getSharedFlags() *SharedFlags
528}
529
530type SharedFlags struct {
531 numSharedFlags int
532 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800533}
534
535type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700536 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800537 ModuleContextIntf
538}
539
540type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700541 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800542 ModuleContextIntf
543}
544
Colin Cross37047f12016-12-13 17:06:13 -0800545type DepsContext interface {
546 android.BottomUpMutatorContext
547 ModuleContextIntf
548}
549
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500550// feature represents additional (optional) steps to building cc-related modules, such as invocation
551// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800552type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800553 flags(ctx ModuleContext, flags Flags) Flags
554 props() []interface{}
555}
556
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500557// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500558// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800559type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700560 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800561 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800562 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700563 compilerProps() []interface{}
564
Colin Cross76fada02016-07-27 10:31:13 -0700565 appendCflags([]string)
566 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700567 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800568}
569
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500570// linker is the interface for a linker decorator object. Individual module types can provide
571// their own implementation for this decorator, and thus specify custom logic regarding build
572// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800573type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700574 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800575 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700576 linkerFlags(ctx ModuleContext, flags Flags) Flags
577 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800578 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700579
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700580 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700581 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900582 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700583
584 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900585 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000586
587 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000588 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
589}
590
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500591// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000592type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500593 sharedLibs []string
594 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
595 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700596 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800597}
598
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500599// installer is the interface for an installer helper object. This helper is responsible for
600// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800601type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700602 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700603 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000604 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800605 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700606 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700607 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900608 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100609 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900610 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800611}
612
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800613type xref interface {
614 XrefCcFiles() android.Paths
615}
616
Colin Cross6e511a92020-07-27 21:26:48 -0700617type libraryDependencyKind int
618
619const (
620 headerLibraryDependency = iota
621 sharedLibraryDependency
622 staticLibraryDependency
623)
624
625func (k libraryDependencyKind) String() string {
626 switch k {
627 case headerLibraryDependency:
628 return "headerLibraryDependency"
629 case sharedLibraryDependency:
630 return "sharedLibraryDependency"
631 case staticLibraryDependency:
632 return "staticLibraryDependency"
633 default:
634 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
635 }
636}
637
638type libraryDependencyOrder int
639
640const (
641 earlyLibraryDependency = -1
642 normalLibraryDependency = 0
643 lateLibraryDependency = 1
644)
645
646func (o libraryDependencyOrder) String() string {
647 switch o {
648 case earlyLibraryDependency:
649 return "earlyLibraryDependency"
650 case normalLibraryDependency:
651 return "normalLibraryDependency"
652 case lateLibraryDependency:
653 return "lateLibraryDependency"
654 default:
655 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
656 }
657}
658
659// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
660// tags that have a set of predefined tag objects that are reused for each dependency, a
661// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
662// That means that comparing a libraryDependencyTag for equality will only be equal if all
663// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
664// then check individual metadata fields instead.
665type libraryDependencyTag struct {
666 blueprint.BaseDependencyTag
667
668 // These are exported so that fmt.Printf("%#v") can call their String methods.
669 Kind libraryDependencyKind
670 Order libraryDependencyOrder
671
672 wholeStatic bool
673
674 reexportFlags bool
675 explicitlyVersioned bool
676 dataLib bool
677 ndk bool
678
679 staticUnwinder bool
680
681 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900682
Cindy Zhou18417cb2020-12-10 07:12:38 -0800683 // Whether or not this dependency should skip the apex dependency check
684 skipApexAllowedDependenciesCheck bool
685
Jiyong Parke3867542020-12-03 17:28:25 +0900686 // Whether or not this dependency has to be followed for the apex variants
687 excludeInApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000688
689 // If true, don't automatically export symbols from the static library into a shared library.
690 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700691}
692
693// header returns true if the libraryDependencyTag is tagging a header lib dependency.
694func (d libraryDependencyTag) header() bool {
695 return d.Kind == headerLibraryDependency
696}
697
698// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
699func (d libraryDependencyTag) shared() bool {
700 return d.Kind == sharedLibraryDependency
701}
702
703// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
704func (d libraryDependencyTag) static() bool {
705 return d.Kind == staticLibraryDependency
706}
707
Colin Cross65cb3142021-12-10 23:05:02 +0000708func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
709 if d.shared() {
710 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
711 }
712 return nil
713}
714
715var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
716
Colin Crosse9fe2942020-11-10 18:12:15 -0800717// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
718// binaries or other shared libraries are installed as dependencies.
719func (d libraryDependencyTag) InstallDepNeeded() bool {
720 return d.shared()
721}
722
723var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
724
725// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700726// libraryDependencyTag. Each tag object is created globally and reused for multiple
727// dependencies (although since the object contains no references, assigning a tag to a
728// variable and modifying it will not modify the original). Users can compare the tag
729// returned by ctx.OtherModuleDependencyTag against the global original
730type dependencyTag struct {
731 blueprint.BaseDependencyTag
732 name string
733}
734
Colin Crosse9fe2942020-11-10 18:12:15 -0800735// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
736// libraryDependencyTag, but where the dependency needs to be installed when the parent is
737// installed.
738type installDependencyTag struct {
739 blueprint.BaseDependencyTag
740 android.InstallAlwaysNeededDependencyTag
741 name string
742}
743
Colin Crossc99deeb2016-04-11 15:06:20 -0700744var (
Colin Cross6e511a92020-07-27 21:26:48 -0700745 genSourceDepTag = dependencyTag{name: "gen source"}
746 genHeaderDepTag = dependencyTag{name: "gen header"}
747 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
748 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900749 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700750 reuseObjTag = dependencyTag{name: "reuse objects"}
751 staticVariantTag = dependencyTag{name: "static variant"}
752 vndkExtDepTag = dependencyTag{name: "vndk extends"}
753 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700754 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800755 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700756 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700757 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000758 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700759)
760
Roland Levillainf89cd092019-07-29 16:22:59 +0100761func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700762 ccLibDepTag, ok := depTag.(libraryDependencyTag)
763 return ok && ccLibDepTag.shared()
764}
765
766func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
767 ccLibDepTag, ok := depTag.(libraryDependencyTag)
768 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100769}
770
Zach Johnson3df4e632020-11-06 11:56:27 -0800771func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
772 ccLibDepTag, ok := depTag.(libraryDependencyTag)
773 return ok && ccLibDepTag.header()
774}
775
Roland Levillainf89cd092019-07-29 16:22:59 +0100776func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800777 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100778}
779
780func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700781 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100782 return ok && ccDepTag == testPerSrcDepTag
783}
784
Chris Parsonsf874e462022-05-10 13:50:12 -0400785// bazelHandler is the interface for a helper object related to deferring to Bazel for
786// processing a cc module (during Bazel mixed builds). Individual module types should define
787// their own bazel handler if they support being handled by Bazel.
788type BazelHandler interface {
789 // QueueBazelCall invokes request-queueing functions on the BazelContext
790 //so that these requests are handled when Bazel's cquery is invoked.
791 QueueBazelCall(ctx android.BaseModuleContext, label string)
792
793 // ProcessBazelQueryResponse uses information retrieved from Bazel to set properties
794 // on the current module with given label.
795 ProcessBazelQueryResponse(ctx android.ModuleContext, label string)
796}
797
Colin Crossca860ac2016-01-04 14:34:37 -0800798// Module contains the properties and members used by all C/C++ module types, and implements
799// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500800// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
801// interface.
802//
803// To define a C/C++ related module, construct a new Module object and point its delegates to
804// type-specific structs. These delegates will be invoked to register module-specific build
805// statements which may be unique to the module type. For example, module.compiler.compile() should
806// be defined so as to register build statements which are responsible for compiling the module.
807//
808// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
809// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
810// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
811// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800812type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700813 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700814
Jiyong Parkd1063c12019-07-17 20:08:41 +0900815 android.SdkBase
Liz Kammerea6666f2021-02-17 10:17:28 -0500816 android.BazelModuleBase
Colin Crossc472d572015-03-17 15:06:21 -0700817
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700818 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700819 Properties BaseProperties
Colin Crossfa138792015-04-24 17:31:52 -0700820
Colin Crossca860ac2016-01-04 14:34:37 -0800821 // initialize before calling Init
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400822 hod android.HostOrDeviceSupported
823 multilib android.Multilib
824 bazelable bool
Colin Crossc472d572015-03-17 15:06:21 -0700825
Paul Duffina0843f62019-12-13 19:50:38 +0000826 // Allowable SdkMemberTypes of this module type.
827 sdkMemberTypes []android.SdkMemberType
828
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500829 // decorator delegates, initialize before calling Init
830 // these may contain module-specific implementations, and effectively allow for custom
831 // type-specific logic. These members may reference different objects or the same object.
832 // Functions of these decorators will be invoked to initialize and register type-specific
833 // build statements.
Chris Parsons8d6e4332021-02-22 16:13:50 -0500834 compiler compiler
835 linker linker
836 installer installer
Chris Parsonsf874e462022-05-10 13:50:12 -0400837 bazelHandler BazelHandler
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500838
839 features []feature
840 stl *stl
841 sanitize *sanitize
842 coverage *coverage
Cory Barkera1da26f2022-06-07 20:12:06 +0000843 fuzzer *fuzzer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500844 sabi *sabi
845 vndkdep *vndkdep
846 lto *lto
Yi Kongeb8efc92021-12-09 18:06:29 +0800847 afdo *afdo
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500848 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800849
Colin Cross31076b32020-10-23 17:22:06 -0700850 library libraryInterface
851
Colin Cross635c3b02016-05-18 15:37:25 -0700852 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800853
Colin Crossb98c8b02016-07-29 13:44:28 -0700854 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700855
856 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800857
858 // Flags used to compile this module
859 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700860
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800861 // Shared flags among build rules of this module
862 sharedFlags SharedFlags
863
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800864 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700865 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900866
867 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800868 // Kythe (source file indexer) paths for this compilation module
869 kytheFiles android.Paths
Chih-Hung Hsieh80783772021-10-11 16:46:56 -0700870 // Object .o file output paths for this compilation module
871 objFiles android.Paths
872 // Tidy .tidy file output paths for this compilation module
873 tidyFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900874
875 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700876 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700877
878 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700879}
880
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200881func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400882 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
883 if b, ok := c.compiler.(*baseCompiler); ok {
884 hasAidl = b.hasSrcExt(".aidl")
885 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
886 hasProto = b.hasSrcExt(".proto")
887 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
888 hasSysprop = b.hasSrcExt(".sysprop")
889 hasWinMsg = b.hasSrcExt(".mc")
890 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
891 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200892 c.AndroidModuleBase().AddJSONData(d)
893 (*d)["Cc"] = map[string]interface{}{
894 "SdkVersion": c.SdkVersion(),
895 "MinSdkVersion": c.MinSdkVersion(),
896 "VndkVersion": c.VndkVersion(),
897 "ProductSpecific": c.ProductSpecific(),
898 "SocSpecific": c.SocSpecific(),
899 "DeviceSpecific": c.DeviceSpecific(),
900 "InProduct": c.InProduct(),
901 "InVendor": c.InVendor(),
902 "InRamdisk": c.InRamdisk(),
903 "InVendorRamdisk": c.InVendorRamdisk(),
904 "InRecovery": c.InRecovery(),
905 "VendorAvailable": c.VendorAvailable(),
906 "ProductAvailable": c.ProductAvailable(),
907 "RamdiskAvailable": c.RamdiskAvailable(),
908 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
909 "RecoveryAvailable": c.RecoveryAvailable(),
910 "OdmAvailable": c.OdmAvailable(),
911 "InstallInData": c.InstallInData(),
912 "InstallInRamdisk": c.InstallInRamdisk(),
913 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
914 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
915 "InstallInRecovery": c.InstallInRecovery(),
916 "InstallInRoot": c.InstallInRoot(),
917 "IsVndk": c.IsVndk(),
918 "IsVndkExt": c.IsVndkExt(),
919 "IsVndkPrivate": c.IsVndkPrivate(),
920 "IsVndkSp": c.IsVndkSp(),
921 "IsLlndk": c.IsLlndk(),
922 "IsLlndkPublic": c.IsLlndkPublic(),
923 "IsSnapshotLibrary": c.IsSnapshotLibrary(),
924 "IsSnapshotPrebuilt": c.IsSnapshotPrebuilt(),
925 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
926 "ApexSdkVersion": c.apexSdkVersion,
927 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400928 "AidlSrcs": hasAidl,
929 "LexSrcs": hasLex,
930 "ProtoSrcs": hasProto,
931 "RenderscriptSrcs": hasRenderscript,
932 "SyspropSrcs": hasSysprop,
933 "WinMsgSrcs": hasWinMsg,
934 "YaccSrsc": hasYacc,
935 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200936 }
937}
938
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500939func (c *Module) SetPreventInstall() {
940 c.Properties.PreventInstall = true
941}
942
943func (c *Module) SetHideFromMake() {
944 c.Properties.HideFromMake = true
945}
946
Ivan Lozanod7586b62021-04-01 09:49:36 -0400947func (c *Module) HiddenFromMake() bool {
948 return c.Properties.HideFromMake
949}
950
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800951func (c *Module) RequiredModuleNames() []string {
952 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
953 if c.ImageVariation().Variation == android.CoreVariation {
954 required = append(required, c.Properties.Target.Platform.Required...)
955 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
956 } else if c.InRecovery() {
957 required = append(required, c.Properties.Target.Recovery.Required...)
958 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
959 }
960 return android.FirstUniqueStrings(required)
961}
962
Ivan Lozano52767be2019-10-18 14:49:46 -0700963func (c *Module) Toc() android.OptionalPath {
964 if c.linker != nil {
965 if library, ok := c.linker.(libraryInterface); ok {
966 return library.toc()
967 }
968 }
969 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
970}
971
972func (c *Module) ApiLevel() string {
973 if c.linker != nil {
974 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700975 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700976 }
977 }
978 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
979}
980
981func (c *Module) Static() bool {
982 if c.linker != nil {
983 if library, ok := c.linker.(libraryInterface); ok {
984 return library.static()
985 }
986 }
987 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
988}
989
990func (c *Module) Shared() bool {
991 if c.linker != nil {
992 if library, ok := c.linker.(libraryInterface); ok {
993 return library.shared()
994 }
995 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +0200996
Ivan Lozano52767be2019-10-18 14:49:46 -0700997 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
998}
999
1000func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001001 if c.stl != nil {
1002 return c.stl.Properties.SelectedStl
1003 }
1004 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001005}
1006
Ivan Lozano52767be2019-10-18 14:49:46 -07001007func (c *Module) NdkPrebuiltStl() bool {
1008 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1009 return true
1010 }
1011 return false
1012}
1013
1014func (c *Module) StubDecorator() bool {
1015 if _, ok := c.linker.(*stubDecorator); ok {
1016 return true
1017 }
1018 return false
1019}
1020
1021func (c *Module) SdkVersion() string {
1022 return String(c.Properties.Sdk_version)
1023}
1024
Artur Satayev480e25b2020-04-27 18:53:18 +01001025func (c *Module) MinSdkVersion() string {
1026 return String(c.Properties.Min_sdk_version)
1027}
1028
Jiyong Park5df7bd32021-08-25 16:18:46 +09001029func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001030 if linker, ok := c.linker.(*objectLinker); ok {
1031 return linker.isCrt()
1032 }
1033 return false
1034}
1035
Jiyong Park5df7bd32021-08-25 16:18:46 +09001036func (c *Module) SplitPerApiLevel() bool {
1037 return c.canUseSdk() && c.isCrt()
1038}
1039
Colin Crossc511bc52020-04-07 16:50:32 +00001040func (c *Module) AlwaysSdk() bool {
1041 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1042}
1043
Ivan Lozano183a3212019-10-18 14:18:45 -07001044func (c *Module) CcLibrary() bool {
1045 if c.linker != nil {
1046 if _, ok := c.linker.(*libraryDecorator); ok {
1047 return true
1048 }
Colin Crossd48fe732020-09-23 20:37:24 -07001049 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1050 return true
1051 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001052 }
1053 return false
1054}
1055
1056func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001057 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001058 return true
1059 }
1060 return false
1061}
1062
Ivan Lozano2b262972019-11-21 12:30:50 -08001063func (c *Module) NonCcVariants() bool {
1064 return false
1065}
1066
Ivan Lozano183a3212019-10-18 14:18:45 -07001067func (c *Module) SetStatic() {
1068 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001069 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001070 library.setStatic()
1071 return
1072 }
1073 }
1074 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1075}
1076
1077func (c *Module) SetShared() {
1078 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001079 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001080 library.setShared()
1081 return
1082 }
1083 }
1084 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1085}
1086
1087func (c *Module) BuildStaticVariant() bool {
1088 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001089 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001090 return library.buildStatic()
1091 }
1092 }
1093 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1094}
1095
1096func (c *Module) BuildSharedVariant() bool {
1097 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001098 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001099 return library.buildShared()
1100 }
1101 }
1102 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1103}
1104
1105func (c *Module) Module() android.Module {
1106 return c
1107}
1108
Jiyong Parkc20eee32018-09-05 22:36:17 +09001109func (c *Module) OutputFile() android.OptionalPath {
1110 return c.outputFile
1111}
1112
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001113func (c *Module) CoverageFiles() android.Paths {
1114 if c.linker != nil {
1115 if library, ok := c.linker.(libraryInterface); ok {
1116 return library.objs().coverageFiles
1117 }
1118 }
1119 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1120}
1121
Ivan Lozano183a3212019-10-18 14:18:45 -07001122var _ LinkableInterface = (*Module)(nil)
1123
Jiyong Park719b4462019-01-13 00:39:51 +09001124func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001125 if c.linker != nil {
1126 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001127 }
1128 return nil
1129}
1130
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001131func (c *Module) CoverageOutputFile() android.OptionalPath {
1132 if c.linker != nil {
1133 return c.linker.coverageOutputFilePath()
1134 }
1135 return android.OptionalPath{}
1136}
1137
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001138func (c *Module) RelativeInstallPath() string {
1139 if c.installer != nil {
1140 return c.installer.relativeInstallPath()
1141 }
1142 return ""
1143}
1144
Jooyung Han344d5432019-08-23 11:17:39 +09001145func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001146 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001147}
1148
Colin Cross36242852017-06-23 15:06:31 -07001149func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001150 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -08001151 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001152 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001153 }
1154 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001155 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001156 }
1157 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001158 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001159 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001160 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001161 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001162 }
Colin Cross16b23492016-01-06 14:41:07 -08001163 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001164 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001165 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001166 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001167 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001168 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001169 if c.fuzzer != nil {
1170 c.AddProperties(c.fuzzer.props()...)
1171 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001172 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001173 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001174 }
Justin Yun8effde42017-06-23 19:24:43 +09001175 if c.vndkdep != nil {
1176 c.AddProperties(c.vndkdep.props()...)
1177 }
Stephen Craneba090d12017-05-09 15:44:35 -07001178 if c.lto != nil {
1179 c.AddProperties(c.lto.props()...)
1180 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001181 if c.afdo != nil {
1182 c.AddProperties(c.afdo.props()...)
1183 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001184 if c.pgo != nil {
1185 c.AddProperties(c.pgo.props()...)
1186 }
Colin Crossca860ac2016-01-04 14:34:37 -08001187 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001188 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001189 }
Colin Crossc472d572015-03-17 15:06:21 -07001190
Colin Cross36242852017-06-23 15:06:31 -07001191 android.InitAndroidArchModule(c, c.hod, c.multilib)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001192 if c.bazelable {
1193 android.InitBazelModule(c)
1194 }
Jiyong Park7916bfc2019-09-30 19:13:12 +09001195 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +09001196 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001197 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001198
Colin Cross36242852017-06-23 15:06:31 -07001199 return c
Colin Crossc472d572015-03-17 15:06:21 -07001200}
1201
Ivan Lozano52767be2019-10-18 14:49:46 -07001202func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001203 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001204}
1205
Colin Crossc511bc52020-04-07 16:50:32 +00001206func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001207 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1208 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001209}
1210
1211func (c *Module) UseSdk() bool {
1212 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001213 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001214 }
1215 return false
1216}
1217
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001218func (c *Module) isCoverageVariant() bool {
1219 return c.coverage.Properties.IsCoverageVariant
1220}
1221
Colin Cross95f1ca02020-10-29 20:47:22 -07001222func (c *Module) IsNdk(config android.Config) bool {
1223 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001224}
1225
Colin Cross127bb8b2020-12-16 16:46:01 -08001226func (c *Module) IsLlndk() bool {
1227 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001228}
1229
Colin Cross127bb8b2020-12-16 16:46:01 -08001230func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001231 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001232}
1233
Colin Cross1f3f1302021-04-26 18:37:44 -07001234func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001235 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001236 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001237}
1238
Colin Cross5271fea2021-04-27 13:06:04 -07001239func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1240 lib := moduleLibraryInterface(m)
1241 return lib != nil && (lib.hasVendorPublicLibrary())
1242}
1243
1244// IsVendorPublicLibrary returns true for vendor public libraries.
1245func (c *Module) IsVendorPublicLibrary() bool {
1246 return c.VendorProperties.IsVendorPublicLibrary
1247}
1248
Ivan Lozanof1868af2022-04-12 13:08:36 -04001249func (c *Module) IsVndkPrebuiltLibrary() bool {
1250 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1251 return true
1252 }
1253 return false
1254}
1255
1256func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1257 return c.Properties.SdkAndPlatformVariantVisibleToMake
1258}
1259
Ivan Lozanod7586b62021-04-01 09:49:36 -04001260func (c *Module) HasLlndkStubs() bool {
1261 lib := moduleLibraryInterface(c)
1262 return lib != nil && lib.hasLLNDKStubs()
1263}
1264
1265func (c *Module) StubsVersion() string {
1266 if lib, ok := c.linker.(versionedInterface); ok {
1267 return lib.stubsVersion()
1268 }
1269 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1270}
1271
Colin Cross127bb8b2020-12-16 16:46:01 -08001272// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1273// and does not set llndk.vendor_available: false.
1274func (c *Module) isImplementationForLLNDKPublic() bool {
1275 library, _ := c.library.(*libraryDecorator)
1276 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001277 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001278}
1279
Justin Yunfd9e8042020-12-23 18:23:14 +09001280// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001281func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001282 // Check if VNDK-core-private or VNDK-SP-private
1283 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001284 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001285 }
1286
1287 // Check if LLNDK-private
1288 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001289 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001290 }
1291
1292 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001293}
1294
Ivan Lozano52767be2019-10-18 14:49:46 -07001295func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001296 if vndkdep := c.vndkdep; vndkdep != nil {
1297 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001298 }
1299 return false
1300}
1301
Yi Kong4ef54592022-02-14 20:00:10 +08001302func (c *Module) isAfdoCompile() bool {
1303 if afdo := c.afdo; afdo != nil {
1304 return afdo.Properties.AfdoTarget != nil
1305 }
1306 return false
1307}
1308
Yi Kong7e53c572018-02-14 18:16:12 +08001309func (c *Module) isPgoCompile() bool {
1310 if pgo := c.pgo; pgo != nil {
1311 return pgo.Properties.PgoCompile
1312 }
1313 return false
1314}
1315
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001316func (c *Module) isNDKStubLibrary() bool {
1317 if _, ok := c.compiler.(*stubDecorator); ok {
1318 return true
1319 }
1320 return false
1321}
1322
Ivan Lozanod7586b62021-04-01 09:49:36 -04001323func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001324 if vndkdep := c.vndkdep; vndkdep != nil {
1325 return vndkdep.isVndkSp()
1326 }
1327 return false
1328}
1329
Ivan Lozanof9e21722020-12-02 09:00:51 -05001330func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001331 if vndkdep := c.vndkdep; vndkdep != nil {
1332 return vndkdep.isVndkExt()
1333 }
1334 return false
1335}
1336
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001337func (c *Module) SubName() string {
1338 return c.Properties.SubName
1339}
1340
Ivan Lozano52767be2019-10-18 14:49:46 -07001341func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001342 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001343}
1344
Logan Chienf3511742017-10-31 18:04:35 +08001345func (c *Module) getVndkExtendsModuleName() string {
1346 if vndkdep := c.vndkdep; vndkdep != nil {
1347 return vndkdep.getVndkExtendsModuleName()
1348 }
1349 return ""
1350}
1351
Jiyong Park25fc6a92018-11-18 18:02:45 +09001352func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001353 if lib := c.library; lib != nil {
1354 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001355 }
1356 return false
1357}
1358
1359func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001360 if lib := c.library; lib != nil {
1361 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001362 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001363 return false
1364}
1365
Colin Cross0477b422020-10-13 18:43:54 -07001366// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1367// the implementation. If it is an implementation library it returns its own name.
1368func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1369 name := ctx.OtherModuleName(c)
1370 if versioned, ok := c.linker.(versionedInterface); ok {
1371 name = versioned.implementationModuleName(name)
1372 }
1373 return name
1374}
1375
Martin Stjernholm2856c662020-12-02 15:03:42 +00001376// Similar to ImplementationModuleName, but uses the Make variant of the module
1377// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1378// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1379// under the premise that the prebuilt module overrides its source counterpart
1380// if it is exposed to Make).
1381func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1382 name := c.BaseModuleName()
1383 if versioned, ok := c.linker.(versionedInterface); ok {
1384 name = versioned.implementationModuleName(name)
1385 }
1386 return name
1387}
1388
Jiyong Park7d55b612021-06-11 17:22:09 +09001389func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001390 return Bool(c.Properties.Bootstrap)
1391}
1392
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001393func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001394 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1395 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1396 return false
1397 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001398 return c.linker != nil && c.linker.nativeCoverage()
1399}
1400
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001401func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001402 if p, ok := c.linker.(SnapshotInterface); ok {
1403 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001404 }
1405 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001406}
1407
Bill Peckham945441c2020-08-31 16:07:58 -07001408func (c *Module) ExcludeFromVendorSnapshot() bool {
1409 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1410}
1411
Jose Galmesf7294582020-11-13 12:07:36 -08001412func (c *Module) ExcludeFromRecoverySnapshot() bool {
1413 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1414}
1415
Jiyong Parkf1194352019-02-25 11:05:47 +09001416func isBionic(name string) bool {
1417 switch name {
Kiyoung Kim4098c7e2020-11-30 14:42:14 +09001418 case "libc", "libm", "libdl", "libdl_android", "linker", "linkerconfig":
Jiyong Parkf1194352019-02-25 11:05:47 +09001419 return true
1420 }
1421 return false
1422}
1423
Martin Stjernholm279de572019-09-10 23:18:20 +01001424func InstallToBootstrap(name string, config android.Config) bool {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001425 if name == "libclang_rt.hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001426 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001427 }
1428 return isBionic(name)
1429}
1430
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001431func (c *Module) XrefCcFiles() android.Paths {
1432 return c.kytheFiles
1433}
1434
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001435func (c *Module) isCfiAssemblySupportEnabled() bool {
1436 return c.sanitize != nil &&
1437 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1438}
1439
Inseob Kim800d1142021-06-14 12:03:51 +09001440func (c *Module) InstallInRoot() bool {
1441 return c.installer != nil && c.installer.installInRoot()
1442}
1443
Colin Crossca860ac2016-01-04 14:34:37 -08001444type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001445 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001446 moduleContextImpl
1447}
1448
Colin Cross37047f12016-12-13 17:06:13 -08001449type depsContext struct {
1450 android.BottomUpMutatorContext
1451 moduleContextImpl
1452}
1453
Colin Crossca860ac2016-01-04 14:34:37 -08001454type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001455 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001456 moduleContextImpl
1457}
1458
1459type moduleContextImpl struct {
1460 mod *Module
1461 ctx BaseModuleContext
1462}
1463
Colin Crossb98c8b02016-07-29 13:44:28 -07001464func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001465 return ctx.mod.toolchain(ctx.ctx)
1466}
1467
1468func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001469 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001470}
1471
1472func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001473 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001474}
1475
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001476func (ctx *moduleContextImpl) testBinary() bool {
1477 return ctx.mod.testBinary()
1478}
1479
Jiyong Park1d1119f2019-07-29 21:27:18 +09001480func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001481 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001482}
1483
Inseob Kim7f283f42020-06-01 21:53:49 +09001484func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001485 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001486}
1487
Inseob Kim1042d292020-06-01 23:23:05 +09001488func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001489 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001490}
1491
Jooyung Hanccce2f22020-03-07 03:45:53 +09001492func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001493 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001494}
1495
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001496func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001497 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001498}
1499
1500func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001501 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001502 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001503 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001504 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001505 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001506 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001507 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001508 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001509 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001510 }
1511 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001512}
1513
Jiyong Parkb35a8192020-08-10 15:59:36 +09001514func (ctx *moduleContextImpl) minSdkVersion() string {
1515 ver := ctx.mod.MinSdkVersion()
1516 if ver == "apex_inherit" && !ctx.isForPlatform() {
1517 ver = ctx.apexSdkVersion().String()
1518 }
1519 if ver == "apex_inherit" || ver == "" {
1520 ver = ctx.sdkVersion()
1521 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001522 // For crt objects, the meaning of min_sdk_version is very different from other types of
1523 // module. For them, min_sdk_version defines the oldest version that the build system will
1524 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1525 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1526 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001527 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1528 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1529 // support such an old version. The version is set to the later version in case when the
1530 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1531 // it's for an APEX.
1532 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1533 if ctx.isForPlatform() {
1534 ver = strconv.Itoa(android.FutureApiLevelInt)
1535 } else { // for apex
1536 ver = ctx.apexSdkVersion().String()
1537 if ver == "" { // in case when min_sdk_version was not set by the APEX
1538 ver = ctx.sdkVersion()
1539 }
1540 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001541 }
1542
Jiyong Parkb35a8192020-08-10 15:59:36 +09001543 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1544 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1545 minSdkVersionInt, err2 := strconv.Atoi(ver)
1546 if err == nil && err2 == nil {
1547 if sdkVersionInt < minSdkVersionInt {
1548 return strconv.Itoa(sdkVersionInt)
1549 }
1550 }
1551 return ver
1552}
1553
1554func (ctx *moduleContextImpl) isSdkVariant() bool {
1555 return ctx.mod.IsSdkVariant()
1556}
1557
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001558func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001559 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001560}
Justin Yun8effde42017-06-23 19:24:43 +09001561
Colin Cross95f1ca02020-10-29 20:47:22 -07001562func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1563 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001564}
1565
Colin Cross127bb8b2020-12-16 16:46:01 -08001566func (ctx *moduleContextImpl) IsLlndk() bool {
1567 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001568}
1569
Colin Cross127bb8b2020-12-16 16:46:01 -08001570func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1571 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001572}
1573
Colin Cross127bb8b2020-12-16 16:46:01 -08001574func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1575 return ctx.mod.isImplementationForLLNDKPublic()
1576}
1577
1578func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1579 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001580}
1581
Logan Chienf3511742017-10-31 18:04:35 +08001582func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001583 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001584}
1585
Yi Kong4ef54592022-02-14 20:00:10 +08001586func (ctx *moduleContextImpl) isAfdoCompile() bool {
1587 return ctx.mod.isAfdoCompile()
1588}
1589
Yi Kong7e53c572018-02-14 18:16:12 +08001590func (ctx *moduleContextImpl) isPgoCompile() bool {
1591 return ctx.mod.isPgoCompile()
1592}
1593
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001594func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1595 return ctx.mod.isNDKStubLibrary()
1596}
1597
Justin Yun8effde42017-06-23 19:24:43 +09001598func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001599 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001600}
1601
Ivan Lozanof9e21722020-12-02 09:00:51 -05001602func (ctx *moduleContextImpl) IsVndkExt() bool {
1603 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001604}
1605
Colin Cross5271fea2021-04-27 13:06:04 -07001606func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1607 return ctx.mod.IsVendorPublicLibrary()
1608}
1609
Vic Yangefd249e2018-11-12 20:19:56 -08001610func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001611 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001612}
1613
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001614func (ctx *moduleContextImpl) selectedStl() string {
1615 if stl := ctx.mod.stl; stl != nil {
1616 return stl.Properties.SelectedStl
1617 }
1618 return ""
1619}
1620
Ivan Lozanobd721262018-11-27 14:33:03 -08001621func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1622 return ctx.mod.linker.useClangLld(actx)
1623}
1624
Colin Crossce75d2c2016-10-06 16:12:58 -07001625func (ctx *moduleContextImpl) baseModuleName() string {
1626 return ctx.mod.ModuleBase.BaseModuleName()
1627}
1628
Logan Chienf3511742017-10-31 18:04:35 +08001629func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1630 return ctx.mod.getVndkExtendsModuleName()
1631}
1632
Logan Chiene274fc92019-12-03 11:18:32 -08001633func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001634 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001635}
1636
Colin Crosse07f2312020-08-13 11:24:56 -07001637func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001638 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001639}
1640
Dan Albertc8060532020-07-22 22:32:17 -07001641func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001642 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001643}
1644
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001645func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001646 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001647}
1648
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001649func (ctx *moduleContextImpl) nativeCoverage() bool {
1650 return ctx.mod.nativeCoverage()
1651}
1652
Colin Cross56a83212020-09-15 18:30:11 -07001653func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1654 return ctx.mod.DirectlyInAnyApex()
1655}
1656
Colin Cross95b07f22020-12-16 11:06:50 -08001657func (ctx *moduleContextImpl) isPreventInstall() bool {
1658 return ctx.mod.Properties.PreventInstall
1659}
1660
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001661func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1662 shared := &ctx.mod.sharedFlags
1663 if shared.flagsMap == nil {
1664 shared.numSharedFlags = 0
1665 shared.flagsMap = make(map[string]string)
1666 }
1667 return shared
1668}
1669
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001670func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1671 return ctx.mod.isCfiAssemblySupportEnabled()
1672}
1673
Colin Cross635c3b02016-05-18 15:37:25 -07001674func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001675 return &Module{
1676 hod: hod,
1677 multilib: multilib,
1678 }
1679}
1680
Colin Cross635c3b02016-05-18 15:37:25 -07001681func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001682 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001683 module.features = []feature{
1684 &tidyFeature{},
1685 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001686 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001687 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001688 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001689 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001690 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001691 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001692 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001693 module.afdo = &afdo{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001694 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001695 return module
1696}
1697
Colin Crossce75d2c2016-10-06 16:12:58 -07001698func (c *Module) Prebuilt() *android.Prebuilt {
1699 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1700 return p.prebuilt()
1701 }
1702 return nil
1703}
1704
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001705func (c *Module) IsPrebuilt() bool {
1706 return c.Prebuilt() != nil
1707}
1708
Colin Crossce75d2c2016-10-06 16:12:58 -07001709func (c *Module) Name() string {
1710 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001711 if p, ok := c.linker.(interface {
1712 Name(string) string
1713 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001714 name = p.Name(name)
1715 }
1716 return name
1717}
1718
Alex Light3d673592019-01-18 14:37:31 -08001719func (c *Module) Symlinks() []string {
1720 if p, ok := c.installer.(interface {
1721 symlinkList() []string
1722 }); ok {
1723 return p.symlinkList()
1724 }
1725 return nil
1726}
1727
Roland Levillainf89cd092019-07-29 16:22:59 +01001728func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1729 test, ok := c.linker.(testPerSrc)
1730 return ok && test.isAllTestsVariation()
1731}
1732
Chris Parsons216e10a2020-07-09 17:12:52 -04001733func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001734 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001735 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001736 }); ok {
1737 return p.dataPaths()
1738 }
1739 return nil
1740}
1741
Ivan Lozanof1868af2022-04-12 13:08:36 -04001742func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001743 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1744 // "current", it will append the VNDK version to the name suffix.
1745 var vndkVersion string
1746 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001747 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001748 if c.ProductSpecific() {
1749 // If the module is product specific with 'product_specific: true',
1750 // do not add a name suffix because it is a base module.
1751 return ""
1752 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001753 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
Matthew Maurer52af5b02021-05-27 10:01:36 -07001754 nameSuffix = ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001755 } else {
1756 vndkVersion = ctx.DeviceConfig().VndkVersion()
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001757 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001758 }
1759 if vndkVersion == "current" {
1760 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1761 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001762 if c.VndkVersion() != vndkVersion && c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001763 // add version suffix only if the module is using different vndk version than the
1764 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001765 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001766 }
1767 return nameSuffix
1768}
1769
Ivan Lozanof1868af2022-04-12 13:08:36 -04001770func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1771 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001772
1773 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001774 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001775 }
1776
Colin Cross127bb8b2020-12-16 16:46:01 -08001777 llndk := c.IsLlndk()
Colin Cross627280f2021-04-26 16:53:58 -07001778 if llndk || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001779 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1780 // added for product variant only when we have vendor and product variants with core
1781 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001782 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001783 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001784 subName += vendorPublicLibrarySuffix
1785 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001786 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1787 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001788 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001789 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001790 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001791 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001792 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001793 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001794 subName += RecoverySuffix
1795 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1796 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001797 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001798 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001799 }
Inseob Kim64c43952019-08-26 16:52:35 +09001800 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001801
1802 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001803}
1804
Chris Parsonsf874e462022-05-10 13:50:12 -04001805var _ android.MixedBuildBuildable = (*Module)(nil)
1806
1807func (c *Module) getBazelModuleLabel(ctx android.BaseModuleContext) string {
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001808 var bazelModuleLabel string
Liz Kammer35ca77e2021-12-22 15:31:40 -05001809 if c.typ() == fullLibrary && c.static() {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001810 // cc_library is a special case in bp2build; two targets are generated -- one for each
1811 // of the shared and static variants. The shared variant keeps the module name, but the
1812 // static variant uses a different suffixed name.
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001813 bazelModuleLabel = bazelLabelForStaticModule(ctx, c)
1814 } else {
1815 bazelModuleLabel = c.GetBazelLabel(ctx, c)
Chris Parsonsf874e462022-05-10 13:50:12 -04001816 }
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001817 labelNoPrebuilt := bazelModuleLabel
1818 if c.IsPrebuilt() {
1819 labelNoPrebuilt = android.RemoveOptionalPrebuiltPrefixFromBazelLabel(bazelModuleLabel)
1820 }
1821 return labelNoPrebuilt
Chris Parsonsf874e462022-05-10 13:50:12 -04001822}
1823
1824func (c *Module) QueueBazelCall(ctx android.BaseModuleContext) {
1825 c.bazelHandler.QueueBazelCall(ctx, c.getBazelModuleLabel(ctx))
1826}
1827
1828func (c *Module) IsMixedBuildSupported(ctx android.BaseModuleContext) bool {
1829 return c.bazelHandler != nil
1830}
1831
1832func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) {
1833 bazelModuleLabel := c.getBazelModuleLabel(ctx)
1834
1835 c.bazelHandler.ProcessBazelQueryResponse(ctx, bazelModuleLabel)
1836
1837 c.Properties.SubName = GetSubnameProperty(ctx, c)
1838 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1839 if !apexInfo.IsForPlatform() {
1840 c.hideApexVariantFromMake = true
Chris Parsons77acf2e2021-12-03 17:27:16 -05001841 }
Liz Kammer35ca77e2021-12-22 15:31:40 -05001842
Chris Parsonsf874e462022-05-10 13:50:12 -04001843 c.makeLinkType = GetMakeLinkType(ctx, c)
1844
1845 mctx := &moduleContext{
1846 ModuleContext: ctx,
1847 moduleContextImpl: moduleContextImpl{
1848 mod: c,
1849 },
Chris Parsons8d6e4332021-02-22 16:13:50 -05001850 }
Chris Parsonsf874e462022-05-10 13:50:12 -04001851 mctx.ctx = mctx
1852
1853 c.maybeInstall(mctx, apexInfo)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001854}
1855
1856func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05001857 // Handle the case of a test module split by `test_per_src` mutator.
1858 //
1859 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1860 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1861 // module and return early, as this module does not produce an output file per se.
1862 if c.IsTestPerSrcAllTestsVariation() {
1863 c.outputFile = android.OptionalPath{}
1864 return
1865 }
1866
Ivan Lozanof1868af2022-04-12 13:08:36 -04001867 c.Properties.SubName = GetSubnameProperty(actx, c)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001868 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1869 if !apexInfo.IsForPlatform() {
1870 c.hideApexVariantFromMake = true
1871 }
1872
Chris Parsonseefc9e62021-04-02 17:36:47 -04001873 c.makeLinkType = GetMakeLinkType(actx, c)
1874
Colin Crossca860ac2016-01-04 14:34:37 -08001875 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001876 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001877 moduleContextImpl: moduleContextImpl{
1878 mod: c,
1879 },
1880 }
1881 ctx.ctx = ctx
1882
Colin Crossf18e1102017-11-16 14:33:08 -08001883 deps := c.depsToPaths(ctx)
1884 if ctx.Failed() {
1885 return
1886 }
1887
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001888 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1889 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1890 }
1891
Colin Crossca860ac2016-01-04 14:34:37 -08001892 flags := Flags{
1893 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001894 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001895 }
Colin Crossca860ac2016-01-04 14:34:37 -08001896 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001897 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001898 }
1899 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001900 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001901 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001902 if c.stl != nil {
1903 flags = c.stl.flags(ctx, flags)
1904 }
Colin Cross16b23492016-01-06 14:41:07 -08001905 if c.sanitize != nil {
1906 flags = c.sanitize.flags(ctx, flags)
1907 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001908 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001909 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001910 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001911 if c.fuzzer != nil {
1912 flags = c.fuzzer.flags(ctx, flags)
1913 }
Stephen Craneba090d12017-05-09 15:44:35 -07001914 if c.lto != nil {
1915 flags = c.lto.flags(ctx, flags)
1916 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001917 if c.afdo != nil {
1918 flags = c.afdo.flags(ctx, flags)
1919 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001920 if c.pgo != nil {
1921 flags = c.pgo.flags(ctx, flags)
1922 }
Colin Crossca860ac2016-01-04 14:34:37 -08001923 for _, feature := range c.features {
1924 flags = feature.flags(ctx, flags)
1925 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001926 if ctx.Failed() {
1927 return
1928 }
1929
Colin Cross4af21ed2019-11-04 09:37:55 -08001930 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1931 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1932 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001933
Colin Cross4af21ed2019-11-04 09:37:55 -08001934 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001935
1936 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001937 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001938 }
1939 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001940 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001941 }
1942
Colin Cross3e5e7782022-06-17 22:17:05 +00001943 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
1944
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001945 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001946 // We need access to all the flags seen by a source file.
1947 if c.sabi != nil {
1948 flags = c.sabi.flags(ctx, flags)
1949 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001950
Colin Cross4af21ed2019-11-04 09:37:55 -08001951 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001952
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001953 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001954 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001955 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001956 if ctx.Failed() {
1957 return
1958 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001959 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07001960 c.objFiles = objs.objFiles
1961 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001962 }
1963
Colin Crossca860ac2016-01-04 14:34:37 -08001964 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001965 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001966 if ctx.Failed() {
1967 return
1968 }
Colin Cross635c3b02016-05-18 15:37:25 -07001969 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001970
Chris Parsons94a0bba2021-06-04 15:03:47 -04001971 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001972
Jose Galmes6f843bc2020-12-11 13:36:29 -08001973 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
1974 // RECOVERY_SNAPSHOT_VERSION is current.
1975 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001976 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001977 i.collectHeadersForSnapshot(ctx)
1978 }
1979 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001980 }
Colin Cross5049f022015-03-18 13:28:46 -07001981
Chris Parsons94a0bba2021-06-04 15:03:47 -04001982 c.maybeInstall(ctx, apexInfo)
1983}
1984
1985func (c *Module) maybeUnhideFromMake() {
1986 // If a lib is directly included in any of the APEXes or is not available to the
1987 // platform (which is often the case when the stub is provided as a prebuilt),
1988 // unhide the stubs variant having the latest version gets visible to make. In
1989 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
1990 // force anything in the make world to link against the stubs library. (unless it
1991 // is explicitly referenced via .bootstrap suffix or the module is marked with
1992 // 'bootstrap: true').
1993 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
1994 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
1995 c.IsStubs() && !c.InVendorRamdisk() {
1996 c.Properties.HideFromMake = false // unhide
1997 // Note: this is still non-installable
1998 }
1999}
2000
2001func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002002 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002003 // If the module has been specifically configure to not be installed then
2004 // hide from make as otherwise it will break when running inside make
2005 // as the output path to install will not be specified. Not all uninstallable
2006 // modules can be hidden from make as some are needed for resolving make side
2007 // dependencies.
2008 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002009 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002010 c.SkipInstall()
2011 }
2012
2013 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2014 // to allow using the outputs in a genrule.
2015 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002016 c.installer.install(ctx, c.outputFile.Path())
2017 if ctx.Failed() {
2018 return
Colin Crossca860ac2016-01-04 14:34:37 -08002019 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002020 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002021}
2022
Colin Cross0ea8ba82019-06-06 14:33:29 -07002023func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002024 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002025 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002026 }
Colin Crossca860ac2016-01-04 14:34:37 -08002027 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002028}
2029
Colin Crossca860ac2016-01-04 14:34:37 -08002030func (c *Module) begin(ctx BaseModuleContext) {
2031 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002032 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002033 }
Colin Crossca860ac2016-01-04 14:34:37 -08002034 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002035 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002036 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002037 if c.stl != nil {
2038 c.stl.begin(ctx)
2039 }
Colin Cross16b23492016-01-06 14:41:07 -08002040 if c.sanitize != nil {
2041 c.sanitize.begin(ctx)
2042 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002043 if c.coverage != nil {
2044 c.coverage.begin(ctx)
2045 }
Stephen Craneba090d12017-05-09 15:44:35 -07002046 if c.lto != nil {
2047 c.lto.begin(ctx)
2048 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002049 if c.afdo != nil {
2050 c.afdo.begin(ctx)
2051 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002052 if c.pgo != nil {
2053 c.pgo.begin(ctx)
2054 }
Dan Albert92fe7402020-07-15 13:33:30 -07002055 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002056 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002057 if err != nil {
2058 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002059 c.Properties.Sdk_version = nil
2060 } else {
2061 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002062 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002063 }
Colin Crossca860ac2016-01-04 14:34:37 -08002064}
2065
Colin Cross37047f12016-12-13 17:06:13 -08002066func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002067 deps := Deps{}
2068
2069 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002070 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002071 }
2072 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002073 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002074 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002075 if c.stl != nil {
2076 deps = c.stl.deps(ctx, deps)
2077 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002078 if c.coverage != nil {
2079 deps = c.coverage.deps(ctx, deps)
2080 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002081
Colin Crossb6715442017-10-24 11:13:31 -07002082 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2083 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2084 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2085 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2086 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2087 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002088 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002089
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002090 for _, lib := range deps.ReexportSharedLibHeaders {
2091 if !inList(lib, deps.SharedLibs) {
2092 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2093 }
2094 }
2095
2096 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002097 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2098 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 -07002099 }
2100 }
2101
Colin Cross5950f382016-12-13 12:50:57 -08002102 for _, lib := range deps.ReexportHeaderLibHeaders {
2103 if !inList(lib, deps.HeaderLibs) {
2104 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2105 }
2106 }
2107
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002108 for _, gen := range deps.ReexportGeneratedHeaders {
2109 if !inList(gen, deps.GeneratedHeaders) {
2110 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2111 }
2112 }
2113
Colin Crossc99deeb2016-04-11 15:06:20 -07002114 return deps
2115}
2116
Dan Albert7e9d2952016-08-04 13:02:36 -07002117func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002118 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002119 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002120 moduleContextImpl: moduleContextImpl{
2121 mod: c,
2122 },
2123 }
2124 ctx.ctx = ctx
2125
Colin Crossca860ac2016-01-04 14:34:37 -08002126 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002127}
2128
Jiyong Park7ed9de32018-10-15 22:25:07 +09002129// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002130func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002131 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2132 version := name[sharp+1:]
2133 libname := name[:sharp]
2134 return libname, version
2135 }
2136 return name, ""
2137}
2138
Dan Albert92fe7402020-07-15 13:33:30 -07002139func GetCrtVariations(ctx android.BottomUpMutatorContext,
2140 m LinkableInterface) []blueprint.Variation {
2141 if ctx.Os() != android.Android {
2142 return nil
2143 }
2144 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002145 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2146 minSdkVersion := m.MinSdkVersion()
2147 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2148 minSdkVersion = m.SdkVersion()
2149 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002150 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2151 if err != nil {
2152 ctx.PropertyErrorf("min_sdk_version", err.Error())
2153 }
Dan Albert92fe7402020-07-15 13:33:30 -07002154 return []blueprint.Variation{
2155 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002156 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002157 }
2158 }
2159 return []blueprint.Variation{
2160 {Mutator: "sdk", Variation: ""},
2161 }
2162}
2163
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002164func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2165 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002166
2167 variations = append([]blueprint.Variation(nil), variations...)
2168
Liz Kammer23942242022-04-08 15:41:00 -04002169 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002170 // Version is explicitly specified. i.e. libFoo#30
2171 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002172 if tag, ok := depTag.(libraryDependencyTag); ok {
2173 tag.explicitlyVersioned = true
2174 } else {
2175 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2176 }
Colin Crosse7257d22020-09-24 09:56:18 -07002177 }
Colin Crosse7257d22020-09-24 09:56:18 -07002178
Colin Cross0de8a1e2020-09-18 14:15:30 -07002179 if far {
2180 ctx.AddFarVariationDependencies(variations, depTag, name)
2181 } else {
2182 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002183 }
2184}
2185
Kiyoung Kim487689e2022-07-26 09:48:22 +09002186func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2187 apiImportInfo := multitree.ApiImportInfo{}
2188
2189 if c.Device() {
2190 var apiImportModule []blueprint.Module
2191 if actx.OtherModuleExists("api_imports") {
2192 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2193 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
2194 apiInfo := actx.OtherModuleProvider(apiImportModule[0], multitree.ApiImportsProvider).(multitree.ApiImportInfo)
2195 apiImportInfo = apiInfo
2196 actx.SetProvider(multitree.ApiImportsProvider, apiInfo)
2197 }
2198 }
2199 }
2200
2201 return apiImportInfo
2202}
2203
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002204func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002205 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002206 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002207 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002208 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2209 // between the modules in the snapshot and the snapshot itself.
2210 var snapshotModule []blueprint.Module
2211 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2212 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2213 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2214 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2215 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002216 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002217 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2218 *snapshotInfo = &snapshot
2219 // republish the snapshot for use in later mutators on this module
2220 actx.SetProvider(SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002221 }
2222 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002223 if *snapshotInfo == nil {
2224 *snapshotInfo = &SnapshotInfo{}
2225 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002226 return **snapshotInfo
2227}
2228
Kiyoung Kim487689e2022-07-26 09:48:22 +09002229func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2230 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002231 return snapshot
2232 }
2233
2234 return lib
2235}
2236
2237// RewriteLibs takes a list of names of shared libraries and scans it for three types
2238// of names:
2239//
2240// 1. Name of an NDK library that refers to a prebuilt module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002241//
2242// For each of these, it adds the name of the prebuilt module (which will be in
2243// prebuilts/ndk) to the list of nonvariant libs.
2244//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002245// 2. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002246//
2247// For each of these, it adds the name of the ndk_library module to the list of
2248// variant libs.
2249//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002250// 3. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002251//
2252// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002253//
2254// The caller can then know to add the variantLibs dependencies differently from the
2255// nonvariantLibs
2256func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2257 variantLibs = []string{}
2258
2259 nonvariantLibs = []string{}
2260 for _, entry := range list {
2261 // strip #version suffix out
2262 name, _ := StubsLibNameAndVersion(entry)
2263 if c.InRecovery() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002264 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002265 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2266 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2267 } else if c.UseVndk() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002268 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002269 } else {
2270 // put name#version back
2271 nonvariantLibs = append(nonvariantLibs, entry)
2272 }
2273 }
2274 return nonvariantLibs, variantLibs
2275}
2276
Kiyoung Kim487689e2022-07-26 09:48:22 +09002277func updateDepsWithApiImports(deps Deps, apiImports multitree.ApiImportInfo) Deps {
2278 for idx, lib := range deps.SharedLibs {
2279 deps.SharedLibs[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
2280 }
2281
2282 for idx, lib := range deps.LateSharedLibs {
2283 deps.LateSharedLibs[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
2284 }
2285
2286 for idx, lib := range deps.RuntimeLibs {
2287 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
2288 }
2289
2290 for idx, lib := range deps.HeaderLibs {
2291 deps.HeaderLibs[idx] = GetReplaceModuleName(lib, apiImports.HeaderLibs)
2292 }
2293 return deps
2294}
2295
Colin Cross1e676be2016-10-12 14:38:15 -07002296func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002297 if !c.Enabled() {
2298 return
2299 }
2300
Colin Cross37047f12016-12-13 17:06:13 -08002301 ctx := &depsContext{
2302 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002303 moduleContextImpl: moduleContextImpl{
2304 mod: c,
2305 },
2306 }
2307 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002308
Colin Crossc99deeb2016-04-11 15:06:20 -07002309 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002310
Kiyoung Kim487689e2022-07-26 09:48:22 +09002311 apiImportInfo := GetApiImports(c, actx)
2312 deps = updateDepsWithApiImports(deps, apiImportInfo)
2313
Yo Chiang219968c2020-09-22 18:45:04 +08002314 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2315
Colin Crosse0edaf92021-01-11 17:31:17 -08002316 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002317
Dan Albert914449f2016-06-17 16:45:24 -07002318 variantNdkLibs := []string{}
2319 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002320 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002321 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2322 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2323 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002324
2325 for idx, lib := range deps.RuntimeLibs {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002326 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002327 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002328 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002329
Colin Cross32ec36c2016-12-15 07:39:51 -08002330 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002331 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002332 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002333 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002334 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002335
Kiyoung Kim487689e2022-07-26 09:48:22 +09002336 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002337
Jiyong Park1ad8e162020-12-01 23:40:09 +09002338 if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002339 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002340 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002341 } else {
2342 actx.AddVariationDependencies(nil, depTag, lib)
2343 }
2344 }
2345
Dan Albertf1d14c72020-07-30 14:32:55 -07002346 if c.isNDKStubLibrary() {
2347 // NDK stubs depend on their implementation because the ABI dumps are
2348 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002349 apiImportName := c.BaseModuleName() + multitree.GetApiImportSuffix()
2350
2351 // If original library exists as imported API, set dependency on the imported library
2352 if actx.OtherModuleExists(apiImportName) {
2353 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2354 c.ImageVariation(),
2355 blueprint.Variation{Mutator: "link", Variation: "shared"},
2356 ), stubImplementation, apiImportName)
2357 } else {
2358 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2359 c.ImageVariation(),
2360 blueprint.Variation{Mutator: "link", Variation: "shared"},
2361 ), stubImplementation, c.BaseModuleName())
2362 }
Dan Albertf1d14c72020-07-30 14:32:55 -07002363 }
2364
Jiyong Park5d1598f2019-02-25 22:14:17 +09002365 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002366 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002367
Kiyoung Kim487689e2022-07-26 09:48:22 +09002368 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002369
Jiyong Park5d1598f2019-02-25 22:14:17 +09002370 actx.AddVariationDependencies([]blueprint.Variation{
2371 {Mutator: "link", Variation: "static"},
2372 }, depTag, lib)
2373 }
2374
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002375 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002376 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002377 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002378 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002379 }
Jiyong Parke3867542020-12-03 17:28:25 +09002380 if inList(lib, deps.ExcludeLibsForApex) {
2381 depTag.excludeInApex = true
2382 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002383
Kiyoung Kim487689e2022-07-26 09:48:22 +09002384 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002385
Dan Willemsen59339a22018-07-22 21:18:45 -07002386 actx.AddVariationDependencies([]blueprint.Variation{
2387 {Mutator: "link", Variation: "static"},
2388 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002389 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002390
Jooyung Han75568392020-03-20 04:29:24 +09002391 // staticUnwinderDep is treated as staticDep for Q apexes
2392 // so that native libraries/binaries are linked with static unwinder
2393 // because Q libc doesn't have unwinder APIs
2394 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002395 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002396 actx.AddVariationDependencies([]blueprint.Variation{
2397 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002398 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002399 }
2400
Jiyong Park7ed9de32018-10-15 22:25:07 +09002401 // shared lib names without the #version suffix
2402 var sharedLibNames []string
2403
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002404 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002405 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002406 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002407 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002408 }
Jiyong Parke3867542020-12-03 17:28:25 +09002409 if inList(lib, deps.ExcludeLibsForApex) {
2410 depTag.excludeInApex = true
2411 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002412
Jiyong Park73c54ee2019-10-22 20:31:18 +09002413 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002414 sharedLibNames = append(sharedLibNames, name)
2415
Colin Crosse7257d22020-09-24 09:56:18 -07002416 variations := []blueprint.Variation{
2417 {Mutator: "link", Variation: "shared"},
2418 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002419 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002420 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002421
Colin Crossfe9acfe2021-06-14 16:13:03 -07002422 for _, lib := range deps.LateStaticLibs {
2423 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2424 actx.AddVariationDependencies([]blueprint.Variation{
2425 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002426 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Crossfe9acfe2021-06-14 16:13:03 -07002427 }
2428
Colin Cross3e5e7782022-06-17 22:17:05 +00002429 for _, lib := range deps.UnexportedStaticLibs {
2430 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2431 actx.AddVariationDependencies([]blueprint.Variation{
2432 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002433 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Cross3e5e7782022-06-17 22:17:05 +00002434 }
2435
Jiyong Park7ed9de32018-10-15 22:25:07 +09002436 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002437 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002438 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2439 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2440 // linking against both the stubs lib and the non-stubs lib at the same time.
2441 continue
2442 }
Colin Cross6e511a92020-07-27 21:26:48 -07002443 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002444 variations := []blueprint.Variation{
2445 {Mutator: "link", Variation: "shared"},
2446 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002447 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002448 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002449
Dan Willemsen59339a22018-07-22 21:18:45 -07002450 actx.AddVariationDependencies([]blueprint.Variation{
2451 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002452 }, dataLibDepTag, deps.DataLibs...)
2453
Colin Crossc8caa062021-09-24 16:50:14 -07002454 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2455
Chris Parsons79d66a52020-06-05 17:26:16 -04002456 actx.AddVariationDependencies([]blueprint.Variation{
2457 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002458 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002459
Colin Cross68861832016-07-08 10:41:41 -07002460 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002461
2462 for _, gen := range deps.GeneratedHeaders {
2463 depTag := genHeaderDepTag
2464 if inList(gen, deps.ReexportGeneratedHeaders) {
2465 depTag = genHeaderExportDepTag
2466 }
2467 actx.AddDependency(c, depTag, gen)
2468 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002469
Dan Albert92fe7402020-07-15 13:33:30 -07002470 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002471 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002472 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002473 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002474 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002475 }
Colin Crossc465efd2021-06-11 18:00:04 -07002476 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002477 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002478 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002479 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002480 if deps.DynamicLinker != "" {
2481 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002482 }
Dan Albert914449f2016-06-17 16:45:24 -07002483
2484 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002485
2486 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002487 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002488 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002489 {Mutator: "link", Variation: "shared"},
2490 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002491
2492 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002493 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002494 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002495 {Mutator: "link", Variation: "shared"},
2496 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002497
2498 if vndkdep := c.vndkdep; vndkdep != nil {
2499 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002500 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002501 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002502 {Mutator: "link", Variation: "shared"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002503 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002504 }
2505 }
Colin Cross6362e272015-10-29 15:25:03 -07002506}
Colin Cross21b9a242015-03-24 14:15:58 -07002507
Colin Crosse40b4ea2018-10-02 22:25:58 -07002508func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002509 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2510 c.beginMutator(ctx)
2511 }
2512}
2513
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002514// Whether a module can link to another module, taking into
2515// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002516func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002517 tag blueprint.DependencyTag) {
2518
2519 switch t := tag.(type) {
2520 case dependencyTag:
2521 if t != vndkExtDepTag {
2522 return
2523 }
2524 case libraryDependencyTag:
2525 default:
2526 return
2527 }
2528
Ivan Lozanof9e21722020-12-02 09:00:51 -05002529 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002530 // Host code is not restricted
2531 return
2532 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002533
2534 // VNDK is cc.Module supported only for now.
2535 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002536 // Though allowed dependency is limited by the image mutator,
2537 // each vendor and product module needs to check link-type
2538 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002539 if ccTo, ok := to.(*Module); ok {
2540 if ccFrom.vndkdep != nil {
2541 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2542 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002543 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002544 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002545 }
2546 return
2547 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002548 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002549 // Platform code can link to anything
2550 return
2551 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002552 if from.InRamdisk() {
2553 // Ramdisk code is not NDK
2554 return
2555 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002556 if from.InVendorRamdisk() {
2557 // Vendor ramdisk code is not NDK
2558 return
2559 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002560 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002561 // Recovery code is not NDK
2562 return
2563 }
Colin Cross31076b32020-10-23 17:22:06 -07002564 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002565 if c.NdkPrebuiltStl() {
2566 // These are allowed, but they don't set sdk_version
2567 return
2568 }
2569 if c.StubDecorator() {
2570 // These aren't real libraries, but are the stub shared libraries that are included in
2571 // the NDK.
2572 return
2573 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002574 }
Logan Chien834b9a62019-01-14 15:39:03 +08002575
Ivan Lozano52767be2019-10-18 14:49:46 -07002576 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002577 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2578 // to link to libc++ (non-NDK and without sdk_version).
2579 return
2580 }
2581
Ivan Lozano52767be2019-10-18 14:49:46 -07002582 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002583 // NDK code linking to platform code is never okay.
2584 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002585 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002586 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002587 }
2588
2589 // At this point we know we have two NDK libraries, but we need to
2590 // check that we're not linking against anything built against a higher
2591 // API level, as it is only valid to link against older or equivalent
2592 // APIs.
2593
Inseob Kim01a28722018-04-11 09:48:45 +09002594 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002595 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002596 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002597 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002598 // Current can't be linked against by anything else.
2599 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002600 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002601 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002602 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002603 if err != nil {
2604 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002605 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002606 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002607 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002608 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002609 if err != nil {
2610 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002611 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002612 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002613 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002614
Inseob Kim01a28722018-04-11 09:48:45 +09002615 if toApi > fromApi {
2616 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002617 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002618 }
2619 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002620 }
Dan Albert202fe492017-12-15 13:56:59 -08002621
2622 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002623 fromStl := from.SelectedStl()
2624 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002625 if fromStl == "" || toStl == "" {
2626 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002627 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002628 // We can be permissive with the system "STL" since it is only the C++
2629 // ABI layer, but in the future we should make sure that everyone is
2630 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002631 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002632 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002633 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2634 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002635 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002636}
2637
Jooyung Han479ca172020-10-19 18:51:07 +09002638func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2639 if c, ok := ctx.Module().(*Module); ok {
2640 ctx.VisitDirectDeps(func(dep android.Module) {
2641 depTag := ctx.OtherModuleDependencyTag(dep)
2642 ccDep, ok := dep.(LinkableInterface)
2643 if ok {
2644 checkLinkType(ctx, c, ccDep, depTag)
2645 }
2646 })
2647 }
2648}
2649
Jiyong Park5fb8c102018-04-09 12:03:06 +09002650// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002651// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2652// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002653// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002654func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2655 check := func(child, parent android.Module) bool {
2656 to, ok := child.(*Module)
2657 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002658 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002659 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002660
Jooyung Hana70f0672019-01-18 15:20:43 +09002661 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2662 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002663 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002664
Jiyong Park0474e1f2021-01-14 14:26:06 +09002665 // These dependencies are not excercised at runtime. Tracking these will give us
2666 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002667 depTag := ctx.OtherModuleDependencyTag(child)
2668 if IsHeaderDepTag(depTag) {
2669 return false
2670 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002671 if depTag == staticVariantTag {
2672 return false
2673 }
2674 if depTag == stubImplDepTag {
2675 return false
2676 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002677
Justin Yun63e9ec72020-10-29 16:49:43 +09002678 // Even if target lib has no vendor variant, keep checking dependency
2679 // graph in case it depends on vendor_available or product_available
2680 // but not double_loadable transtively.
2681 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002682 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002683 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002684
Jiyong Park0474e1f2021-01-14 14:26:06 +09002685 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2686 // one.
2687 if Bool(to.VendorProperties.Double_loadable) {
2688 return true
2689 }
2690
Ivan Lozanod7586b62021-04-01 09:49:36 -04002691 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002692 return false
2693 }
2694
Jooyung Hana70f0672019-01-18 15:20:43 +09002695 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2696 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002697 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002698 return false
2699 }
2700 if module, ok := ctx.Module().(*Module); ok {
2701 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002702 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002703 ctx.WalkDeps(check)
2704 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002705 }
2706 }
2707}
2708
Colin Crossc99deeb2016-04-11 15:06:20 -07002709// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002710func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002711 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002712
Colin Cross0de8a1e2020-09-18 14:15:30 -07002713 var directStaticDeps []StaticLibraryInfo
2714 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002715
Colin Cross0de8a1e2020-09-18 14:15:30 -07002716 reexportExporter := func(exporter FlagExporterInfo) {
2717 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2718 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2719 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2720 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2721 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002722 }
2723
Jooyung Hande34d232020-07-23 13:04:15 +09002724 // For the dependency from platform to apex, use the latest stubs
2725 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002726 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2727 if !apexInfo.IsForPlatform() {
Jiyong Park4eab21d2021-04-15 15:17:54 +09002728 c.apexSdkVersion = apexInfo.MinSdkVersion
Jooyung Hande34d232020-07-23 13:04:15 +09002729 }
2730
2731 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2732 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2733 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2734 // (b/144430859)
2735 c.apexSdkVersion = android.FutureApiLevel
2736 }
2737
Colin Crossd11fcda2017-10-23 17:59:01 -07002738 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002739 depName := ctx.OtherModuleName(dep)
2740 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002741
Dan Willemsen47450072021-10-19 20:24:49 -07002742 if depTag == android.DarwinUniversalVariantTag {
2743 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
2744 return
2745 }
2746
Ivan Lozano52767be2019-10-18 14:49:46 -07002747 ccDep, ok := dep.(LinkableInterface)
2748 if !ok {
2749
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002750 // handling for a few module types that aren't cc Module but that are also supported
2751 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002752 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002753 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002754 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2755 genRule.GeneratedSourceFiles()...)
2756 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002757 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002758 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002759 // Support exported headers from a generated_sources dependency
2760 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002761 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002762 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002763 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002764 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002765 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002766 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002767 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002768 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002769 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2770 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002771 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002772 // 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 +09002773 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002774
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002775 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002776 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002777 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002778 }
Colin Crosscef792e2021-06-11 18:01:26 -07002779 case CrtBeginDepTag:
2780 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
2781 case CrtEndDepTag:
2782 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08002783 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002784 return
2785 }
2786
Colin Crossfe17f6f2019-03-28 19:30:56 -07002787 if depTag == android.ProtoPluginDepTag {
2788 return
2789 }
2790
Colin Crossd11fcda2017-10-23 17:59:01 -07002791 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002792 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2793 return
2794 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002795 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002796 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2797 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002798 return
2799 }
2800
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002801 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07002802 // Skip reused objects for stub libraries, they use their own stub object file instead.
2803 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
2804 // version mutator, so the stubs variant is created from the shared variant that
2805 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07002806 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07002807 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2808 objs := staticAnalogue.ReuseObjects
2809 depPaths.Objs = depPaths.Objs.Append(objs)
2810 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2811 reexportExporter(depExporterInfo)
2812 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002813 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002814 }
2815
Colin Cross6e511a92020-07-27 21:26:48 -07002816 linkFile := ccDep.OutputFile()
2817
2818 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2819 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002820 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002821 return
2822 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002823
Jiyong Parke3867542020-12-03 17:28:25 +09002824 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
2825 return
2826 }
2827
Colin Cross0de8a1e2020-09-18 14:15:30 -07002828 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002829
Colin Cross6e511a92020-07-27 21:26:48 -07002830 var ptr *android.Paths
2831 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002832
Colin Cross6e511a92020-07-27 21:26:48 -07002833 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002834
Colin Cross6e511a92020-07-27 21:26:48 -07002835 switch {
2836 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08002837 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
2838 if !ctx.Config().AllowMissingDependencies() {
2839 ctx.ModuleErrorf("module %q is not a header library", depName)
2840 } else {
2841 ctx.AddMissingDependencies([]string{depName})
2842 }
2843 return
2844 }
Colin Cross6e511a92020-07-27 21:26:48 -07002845 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002846 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2847 if !ctx.Config().AllowMissingDependencies() {
2848 ctx.ModuleErrorf("module %q is not a shared library", depName)
2849 } else {
2850 ctx.AddMissingDependencies([]string{depName})
2851 }
2852 return
2853 }
Jiyong Parke3867542020-12-03 17:28:25 +09002854
Jiyong Park7d55b612021-06-11 17:22:09 +09002855 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
2856 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07002857
Jiyong Park1ad8e162020-12-01 23:40:09 +09002858 // Stubs lib doesn't link to the shared lib dependencies. Don't set
2859 // linkFile, depFile, and ptr.
2860 if c.IsStubs() {
2861 break
2862 }
2863
Colin Cross0de8a1e2020-09-18 14:15:30 -07002864 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2865 depFile = sharedLibraryInfo.TableOfContents
2866
Colin Cross6e511a92020-07-27 21:26:48 -07002867 ptr = &depPaths.SharedLibs
2868 switch libDepTag.Order {
2869 case earlyLibraryDependency:
2870 ptr = &depPaths.EarlySharedLibs
2871 depPtr = &depPaths.EarlySharedLibsDeps
2872 case normalLibraryDependency:
2873 ptr = &depPaths.SharedLibs
2874 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002875 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002876 case lateLibraryDependency:
2877 ptr = &depPaths.LateSharedLibs
2878 depPtr = &depPaths.LateSharedLibsDeps
2879 default:
2880 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002881 }
Colin Cross6e511a92020-07-27 21:26:48 -07002882 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002883 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2884 if !ctx.Config().AllowMissingDependencies() {
2885 ctx.ModuleErrorf("module %q is not a static library", depName)
2886 } else {
2887 ctx.AddMissingDependencies([]string{depName})
2888 }
2889 return
2890 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002891
2892 // Stubs lib doesn't link to the static lib dependencies. Don't set
2893 // linkFile, depFile, and ptr.
2894 if c.IsStubs() {
2895 break
2896 }
2897
Colin Cross0de8a1e2020-09-18 14:15:30 -07002898 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2899 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002900 if libDepTag.wholeStatic {
2901 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002902 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2903 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002904 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002905 // This case normally catches prebuilt static
2906 // libraries, but it can also occur when
2907 // AllowMissingDependencies is on and the
2908 // dependencies has no sources of its own
2909 // but has a whole_static_libs dependency
2910 // on a missing library. We want to depend
2911 // on the .a file so that there is something
2912 // in the dependency tree that contains the
2913 // error rule for the missing transitive
2914 // dependency.
2915 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002916 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08002917 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
2918 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07002919 } else {
2920 switch libDepTag.Order {
2921 case earlyLibraryDependency:
2922 panic(fmt.Errorf("early static libs not suppported"))
2923 case normalLibraryDependency:
2924 // static dependencies will be handled separately so they can be ordered
2925 // using transitive dependencies.
2926 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002927 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002928 case lateLibraryDependency:
2929 ptr = &depPaths.LateStaticLibs
2930 default:
2931 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002932 }
2933 }
Colin Cross3e5e7782022-06-17 22:17:05 +00002934 if libDepTag.unexportedSymbols {
2935 depPaths.LdFlags = append(depPaths.LdFlags,
2936 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
2937 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002938 }
2939
Colin Cross6e511a92020-07-27 21:26:48 -07002940 if libDepTag.static() && !libDepTag.wholeStatic {
2941 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2942 ctx.ModuleErrorf("module %q not a static library", depName)
2943 return
2944 }
Logan Chien43d34c32017-12-20 01:17:32 +08002945
Colin Cross6e511a92020-07-27 21:26:48 -07002946 // When combining coverage files for shared libraries and executables, coverage files
2947 // in static libraries act as if they were whole static libraries. The same goes for
2948 // source based Abi dump files.
2949 if c, ok := ccDep.(*Module); ok {
2950 staticLib := c.linker.(libraryInterface)
2951 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2952 staticLib.objs().coverageFiles...)
2953 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2954 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002955 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002956 // Handle non-CC modules here
2957 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002958 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002959 }
2960 }
2961
Colin Cross6e511a92020-07-27 21:26:48 -07002962 if ptr != nil {
2963 if !linkFile.Valid() {
2964 if !ctx.Config().AllowMissingDependencies() {
2965 ctx.ModuleErrorf("module %q missing output file", depName)
2966 } else {
2967 ctx.AddMissingDependencies([]string{depName})
2968 }
2969 return
2970 }
2971 *ptr = append(*ptr, linkFile.Path())
2972 }
2973
2974 if depPtr != nil {
2975 dep := depFile
2976 if !dep.Valid() {
2977 dep = linkFile
2978 }
2979 *depPtr = append(*depPtr, dep.Path())
2980 }
2981
Colin Cross0de8a1e2020-09-18 14:15:30 -07002982 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2983 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2984 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2985 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2986
2987 if libDepTag.reexportFlags {
2988 reexportExporter(depExporterInfo)
2989 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2990 // Re-exported shared library headers must be included as well since they can help us with type information
2991 // about template instantiations (instantiated from their headers).
2992 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2993 // scripts.
2994 c.sabi.Properties.ReexportedIncludes = append(
2995 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2996 }
2997
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002998 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07002999 switch {
3000 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003001 c.Properties.AndroidMkHeaderLibs = append(
3002 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003003 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003004 if lib := moduleLibraryInterface(dep); lib != nil {
3005 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003006 // Add the dependency to the APEX(es) providing the library so that
3007 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07003008 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09003009 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003010 c.Properties.ApexesProvidingSharedLibs = append(
3011 c.Properties.ApexesProvidingSharedLibs, an)
3012 }
3013 }
3014 }
3015
3016 // Note: the order of libs in this list is not important because
3017 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003018 c.Properties.AndroidMkSharedLibs = append(
3019 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003020 // Record BaseLibName for snapshots.
3021 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003022 case libDepTag.static():
3023 if libDepTag.wholeStatic {
3024 c.Properties.AndroidMkWholeStaticLibs = append(
3025 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3026 } else {
3027 c.Properties.AndroidMkStaticLibs = append(
3028 c.Properties.AndroidMkStaticLibs, makeLibName)
3029 }
Justin Yun5e035862021-06-29 20:50:37 +09003030 // Record BaseLibName for snapshots.
3031 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003032 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003033 } else if !c.IsStubs() {
3034 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3035
Colin Cross6e511a92020-07-27 21:26:48 -07003036 switch depTag {
3037 case runtimeDepTag:
3038 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003039 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003040 // Record BaseLibName for snapshots.
3041 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003042 case objDepTag:
3043 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3044 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003045 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003046 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003047 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003048 case dynamicLinkerDepTag:
3049 depPaths.DynamicLinker = linkFile
3050 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003051 }
Colin Crossca860ac2016-01-04 14:34:37 -08003052 })
3053
Jeff Gaston294356f2017-09-27 17:05:30 -07003054 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003055 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3056 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3057 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003058
Colin Crossdd84e052017-05-17 13:44:16 -07003059 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003060 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003061 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3062 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003063 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003064 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3065 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003066 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003067 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003068 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003069
3070 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003071 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003072 }
Colin Crossdd84e052017-05-17 13:44:16 -07003073
Colin Crossca860ac2016-01-04 14:34:37 -08003074 return depPaths
3075}
3076
Jiyong Park7d55b612021-06-11 17:22:09 +09003077// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3078// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3079// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3080// has different level of updatability. For example, if a library foo in an APEX depends on a
3081// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3082// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3083// same APEX as foo, the non-stub variant of bar is used.
3084func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3085 depName := ctx.OtherModuleName(dep)
3086 depTag := ctx.OtherModuleDependencyTag(dep)
3087 libDepTag, ok := depTag.(libraryDependencyTag)
3088 if !ok || !libDepTag.shared() {
3089 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3090 }
3091
3092 thisModule, ok := ctx.Module().(android.ApexModule)
3093 if !ok {
3094 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3095 }
3096
3097 useVndk := false
3098 bootstrap := false
3099 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3100 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3101 } else {
3102 useVndk = linkable.UseVndk()
3103 bootstrap = linkable.Bootstrap()
3104 }
3105
3106 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
3107 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3108 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
3109 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
3110
3111 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
3112 useStubs := false
3113
3114 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3115 if !apexInfo.IsForPlatform() {
3116 // For platform libraries, use current version of LLNDK
3117 // If this is for use_vendor apex we will apply the same rules
3118 // of apex sdk enforcement below to choose right version.
3119 useStubs = true
3120 }
Jiyong Park9477c262021-06-22 20:23:05 +09003121 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3122 // If not building for APEX or the containing APEX allows the use of
3123 // platform APIs, use stubs only when it is from an APEX (and not from
3124 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3125 // bootstrap modules, always link to non-stub variant
Jiyong Park7d55b612021-06-11 17:22:09 +09003126 useStubs = dep.(android.ApexModule).NotInPlatform() && !bootstrap
3127 if useStubs {
3128 // Another exception: if this module is a test for an APEX, then
3129 // it is linked with the non-stub variant of a module in the APEX
3130 // as if this is part of the APEX.
3131 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
3132 for _, apexContents := range testFor.ApexContents {
3133 if apexContents.DirectlyInApex(depName) {
3134 useStubs = false
3135 break
3136 }
3137 }
3138 }
3139 if useStubs {
3140 // Yet another exception: If this module and the dependency are
3141 // available to the same APEXes then skip stubs between their
3142 // platform variants. This complements the test_for case above,
3143 // which avoids the stubs on a direct APEX library dependency, by
3144 // avoiding stubs for indirect test dependencies as well.
3145 //
3146 // TODO(b/183882457): This doesn't work if the two libraries have
3147 // only partially overlapping apex_available. For that test_for
3148 // modules would need to be split into APEX variants and resolved
3149 // separately for each APEX they have access to.
3150 if android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3151 useStubs = false
3152 }
3153 }
3154 } else {
3155 // If building for APEX, use stubs when the parent is in any APEX that
3156 // the child is not in.
3157 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3158 }
3159
3160 // when to use (unspecified) stubs, use the latest one.
3161 if useStubs {
3162 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3163 toUse := stubs[len(stubs)-1]
3164 sharedLibraryInfo = toUse.SharedLibraryInfo
3165 depExporterInfo = toUse.FlagExporterInfo
3166 }
3167 }
3168 return sharedLibraryInfo, depExporterInfo
3169}
3170
Colin Cross0de8a1e2020-09-18 14:15:30 -07003171// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3172// to match the topological order of the dependency tree, including any static analogues of
3173// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3174// of the transitive dependencies.
3175func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
3176 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
3177 var staticPaths android.Paths
3178 for _, staticDep := range staticDeps {
3179 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3180 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3181 }
3182 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003183 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3184 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003185 }
3186 }
3187 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3188
3189 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3190
3191 // reorder the dependencies based on transitive dependencies
3192 staticPaths = android.FirstUniquePaths(staticPaths)
3193 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3194
3195 if len(orderedStaticPaths) != len(staticPaths) {
3196 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3197 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3198 }
3199
3200 return orderedStaticPaths, transitiveStaticLibs
3201}
3202
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003203// BaseLibName trims known prefixes and suffixes
3204func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003205 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3206 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003207 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003208 return libName
3209}
3210
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003211func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003212 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003213 ccDepModule, _ := ccDep.(*Module)
3214 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003215 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003216
Justin Yuncbca3732021-02-03 19:24:13 +09003217 if ccDepModule != nil {
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003218 // TODO(ivanlozano) Support snapshots for Rust-produced C library variants.
Colin Cross6e511a92020-07-27 21:26:48 -07003219 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003220 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003221 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003222
Ivan Lozanod1dec542021-05-26 15:33:11 -04003223 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003224 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003225
3226 // Remove API import suffix if exists
3227 if _, ok := ccDepModule.linker.(*apiLibraryDecorator); ok {
3228 libName = strings.TrimSuffix(libName, multitree.GetApiImportSuffix())
3229 }
Colin Cross6e511a92020-07-27 21:26:48 -07003230 }
3231
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003232 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3233 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003234 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3235 // core module instead.
3236 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003237 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003238 // The vendor and product modules in Make will have been renamed to not conflict with the
3239 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003240 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003241 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003242 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003243 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003244 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003245 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003246 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003247 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003248 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003249 } else {
3250 return libName
3251 }
3252}
3253
Colin Crossca860ac2016-01-04 14:34:37 -08003254func (c *Module) InstallInData() bool {
3255 if c.installer == nil {
3256 return false
3257 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003258 return c.installer.inData()
3259}
3260
3261func (c *Module) InstallInSanitizerDir() bool {
3262 if c.installer == nil {
3263 return false
3264 }
3265 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003266 return true
3267 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003268 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003269}
3270
Yifan Hong1b3348d2020-01-21 15:53:22 -08003271func (c *Module) InstallInRamdisk() bool {
3272 return c.InRamdisk()
3273}
3274
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003275func (c *Module) InstallInVendorRamdisk() bool {
3276 return c.InVendorRamdisk()
3277}
3278
Jiyong Parkf9332f12018-02-01 00:54:12 +09003279func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003280 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003281}
3282
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003283func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003284 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003285 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003286 return
3287 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003288 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003289}
3290
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003291func (c *Module) HostToolPath() android.OptionalPath {
3292 if c.installer == nil {
3293 return android.OptionalPath{}
3294 }
3295 return c.installer.hostToolPath()
3296}
3297
Nan Zhangd4e641b2017-07-12 12:55:28 -07003298func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3299 return c.outputFile
3300}
3301
Colin Cross41955e82019-05-29 14:40:35 -07003302func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3303 switch tag {
3304 case "":
3305 if c.outputFile.Valid() {
3306 return android.Paths{c.outputFile.Path()}, nil
3307 }
3308 return android.Paths{}, nil
3309 default:
3310 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003311 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003312}
3313
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003314func (c *Module) static() bool {
3315 if static, ok := c.linker.(interface {
3316 static() bool
3317 }); ok {
3318 return static.static()
3319 }
3320 return false
3321}
3322
Jiyong Park379de2f2018-12-19 02:47:14 +09003323func (c *Module) staticBinary() bool {
3324 if static, ok := c.linker.(interface {
3325 staticBinary() bool
3326 }); ok {
3327 return static.staticBinary()
3328 }
3329 return false
3330}
3331
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003332func (c *Module) testBinary() bool {
3333 if test, ok := c.linker.(interface {
3334 testBinary() bool
3335 }); ok {
3336 return test.testBinary()
3337 }
3338 return false
3339}
3340
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003341func (c *Module) benchmarkBinary() bool {
3342 if b, ok := c.linker.(interface {
3343 benchmarkBinary() bool
3344 }); ok {
3345 return b.benchmarkBinary()
3346 }
3347 return false
3348}
3349
3350func (c *Module) fuzzBinary() bool {
3351 if f, ok := c.linker.(interface {
3352 fuzzBinary() bool
3353 }); ok {
3354 return f.fuzzBinary()
3355 }
3356 return false
3357}
3358
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003359// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3360func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003361 if h, ok := c.linker.(interface {
3362 header() bool
3363 }); ok {
3364 return h.header()
3365 }
3366 return false
3367}
3368
Ivan Lozanod7586b62021-04-01 09:49:36 -04003369func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003370 if b, ok := c.linker.(interface {
3371 binary() bool
3372 }); ok {
3373 return b.binary()
3374 }
3375 return false
3376}
3377
Justin Yun5e035862021-06-29 20:50:37 +09003378func (c *Module) StaticExecutable() bool {
3379 if b, ok := c.linker.(*binaryDecorator); ok {
3380 return b.static()
3381 }
3382 return false
3383}
3384
Ivan Lozanod7586b62021-04-01 09:49:36 -04003385func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003386 if o, ok := c.linker.(interface {
3387 object() bool
3388 }); ok {
3389 return o.object()
3390 }
3391 return false
3392}
3393
Ivan Lozanof9e21722020-12-02 09:00:51 -05003394func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003395 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003396 if c.IsLlndk() {
3397 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003398 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003399 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003400 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003401 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003402 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003403 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003404 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003405 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003406 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003407 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003408 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003409 return "native:product"
3410 }
Jooyung Han38002912019-05-16 04:01:54 +09003411 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003412 } else if c.InRamdisk() {
3413 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003414 } else if c.InVendorRamdisk() {
3415 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003416 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003417 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003418 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003419 return "native:ndk:none:none"
3420 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3421 //family, link := getNdkStlFamilyAndLinkType(c)
3422 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003423 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003424 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003425 } else {
3426 return "native:platform"
3427 }
3428}
3429
Jiyong Park9d452992018-10-03 00:38:19 +09003430// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003431// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003432func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003433 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003434 // Stub libs and prebuilt libs in a versioned SDK are not
3435 // installable to APEX even though they are shared libs.
Colin Cross31076b32020-10-23 17:22:06 -07003436 return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01003437 } else if _, ok := c.linker.(testPerSrc); ok {
3438 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003439 }
3440 return false
3441}
3442
Jiyong Parka90ca002019-10-07 15:47:24 +09003443func (c *Module) AvailableFor(what string) bool {
3444 if linker, ok := c.linker.(interface {
3445 availableFor(string) bool
3446 }); ok {
3447 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3448 } else {
3449 return c.ApexModuleBase.AvailableFor(what)
3450 }
3451}
3452
Jiyong Park62304bb2020-04-13 16:19:48 +09003453func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003454 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003455}
3456
Paul Duffin0cb37b92020-03-04 14:52:46 +00003457func (c *Module) EverInstallable() bool {
3458 return c.installer != nil &&
3459 // Check to see whether the module is actually ever installable.
3460 c.installer.everInstallable()
3461}
3462
Ivan Lozanod7586b62021-04-01 09:49:36 -04003463func (c *Module) PreventInstall() bool {
3464 return c.Properties.PreventInstall
3465}
3466
3467func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003468 if c.library != nil {
3469 if i := c.library.installable(); i != nil {
3470 return i
3471 }
3472 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003473 return c.Properties.Installable
3474}
3475
3476func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003477 ret := c.EverInstallable() &&
3478 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003479 proptools.BoolDefault(c.Installable(), true) &&
3480 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003481
3482 // The platform variant doesn't need further condition. Apex variants however might not
3483 // be installable because it will likely to be included in the APEX and won't appear
3484 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003485 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003486 return ret
3487 }
3488
3489 // Special case for modules that are configured to be installed to /data, which includes
3490 // test modules. For these modules, both APEX and non-APEX variants are considered as
3491 // installable. This is because even the APEX variants won't be included in the APEX, but
3492 // will anyway be installed to /data/*.
3493 // See b/146995717
3494 if c.InstallInData() {
3495 return ret
3496 }
3497
3498 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003499}
3500
Logan Chien41eabe62019-04-10 13:33:58 +08003501func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3502 if c.linker != nil {
3503 if library, ok := c.linker.(*libraryDecorator); ok {
3504 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3505 }
3506 }
3507}
3508
Jiyong Park45bf82e2020-12-15 22:29:02 +09003509var _ android.ApexModule = (*Module)(nil)
3510
3511// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003512func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003513 depTag := ctx.OtherModuleDependencyTag(dep)
3514 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3515
3516 if cc, ok := dep.(*Module); ok {
3517 if cc.HasStubsVariants() {
3518 if isLibDepTag && libDepTag.shared() {
3519 // dynamic dep to a stubs lib crosses APEX boundary
3520 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003521 }
Colin Cross6e511a92020-07-27 21:26:48 -07003522 if IsRuntimeDepTag(depTag) {
3523 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003524 return false
3525 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003526 }
Zhijun Heec285872021-04-24 10:47:08 -07003527 if cc.IsLlndk() {
3528 return false
3529 }
Colin Crossaac32222020-07-29 12:51:56 -07003530 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003531 // shared_lib dependency from a static lib is considered as crossing
3532 // the APEX boundary because the dependency doesn't actually is
3533 // linked; the dependency is used only during the compilation phase.
3534 return false
3535 }
Jiyong Parke3867542020-12-03 17:28:25 +09003536
3537 if isLibDepTag && libDepTag.excludeInApex {
3538 return false
3539 }
Colin Cross6e511a92020-07-27 21:26:48 -07003540 }
Colin Crossc1b36442021-05-06 13:42:48 -07003541 if depTag == stubImplDepTag {
3542 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003543 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003544 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003545 if depTag == staticVariantTag {
3546 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3547 // actually mean that the static lib (and its dependencies) are copied into the
3548 // APEX.
3549 return false
3550 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003551 return true
3552}
3553
Jiyong Park45bf82e2020-12-15 22:29:02 +09003554// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003555func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3556 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003557 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3558 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3559 return nil
3560 }
Jooyung Han749dc692020-04-15 11:03:39 +09003561 // We don't check for prebuilt modules
3562 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3563 return nil
3564 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003565 if _, ok := c.linker.(*apiLibraryDecorator); ok {
3566 return nil
3567 }
3568
Jooyung Han749dc692020-04-15 11:03:39 +09003569 minSdkVersion := c.MinSdkVersion()
3570 if minSdkVersion == "apex_inherit" {
3571 return nil
3572 }
3573 if minSdkVersion == "" {
3574 // JNI libs within APK-in-APEX fall into here
3575 // Those are okay to set sdk_version instead
3576 // We don't have to check if this is a SDK variant because
3577 // non-SDK variant resets sdk_version, which works too.
3578 minSdkVersion = c.SdkVersion()
3579 }
Dan Albertc8060532020-07-22 22:32:17 -07003580 if minSdkVersion == "" {
3581 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3582 }
3583 // Not using nativeApiLevelFromUser because the context here is not
3584 // necessarily a native context.
3585 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003586 if err != nil {
3587 return err
3588 }
Dan Albertc8060532020-07-22 22:32:17 -07003589
3590 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003591 return fmt.Errorf("newer SDK(%v)", ver)
3592 }
3593 return nil
3594}
3595
Paul Duffinb5769c12021-05-12 16:16:51 +01003596// Implements android.ApexModule
3597func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3598 // stub libraries and native bridge libraries are always available to platform
3599 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3600}
3601
Jooyung Han91f92032022-02-04 12:36:33 +09003602// Overrides android.ApexModuleBase.UniqueApexVariations
3603func (c *Module) UniqueApexVariations() bool {
3604 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
3605 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
3606 // variation of the VNDK lib because APEX variations are merged/grouped.
3607 return c.UseVndk() && c.IsVndk()
3608}
3609
Rob Seymour925aa092021-08-10 20:42:03 +00003610var _ snapshot.RelativeInstallPath = (*Module)(nil)
3611
Liz Kammer35ca77e2021-12-22 15:31:40 -05003612type moduleType int
3613
3614const (
3615 unknownType moduleType = iota
3616 binary
3617 object
3618 fullLibrary
3619 staticLibrary
3620 sharedLibrary
3621 headerLibrary
3622)
3623
3624func (c *Module) typ() moduleType {
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003625 if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003626 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003627 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003628 return object
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003629 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05003630 static := false
3631 shared := false
3632 if library, ok := c.linker.(*libraryDecorator); ok {
3633 static = library.MutatedProperties.BuildStatic
3634 shared = library.MutatedProperties.BuildShared
3635 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
3636 static = library.MutatedProperties.BuildStatic
3637 shared = library.MutatedProperties.BuildShared
3638 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003639 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003640 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003641 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003642 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003643 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003644 return staticLibrary
3645 }
3646 return sharedLibrary
3647 }
3648 return unknownType
3649}
3650
3651// ConvertWithBp2build converts Module to Bazel for bp2build.
3652func (c *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
3653 prebuilt := c.IsPrebuilt()
3654 switch c.typ() {
3655 case binary:
3656 if !prebuilt {
3657 binaryBp2build(ctx, c, ctx.ModuleType())
3658 }
3659 case object:
3660 if !prebuilt {
3661 objectBp2Build(ctx, c)
3662 }
3663 case fullLibrary:
3664 if !prebuilt {
3665 libraryBp2Build(ctx, c)
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00003666 } else {
3667 prebuiltLibraryBp2Build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05003668 }
3669 case headerLibrary:
3670 libraryHeadersBp2Build(ctx, c)
3671 case staticLibrary:
Liz Kammer35ca77e2021-12-22 15:31:40 -05003672 if prebuilt {
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00003673 prebuiltLibraryStaticBp2Build(ctx, c, false)
Liz Kammer35ca77e2021-12-22 15:31:40 -05003674 } else {
3675 sharedOrStaticLibraryBp2Build(ctx, c, true)
3676 }
3677 case sharedLibrary:
3678 if prebuilt {
3679 prebuiltLibrarySharedBp2Build(ctx, c)
3680 } else {
3681 sharedOrStaticLibraryBp2Build(ctx, c, false)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003682 }
3683 }
3684}
3685
Colin Crosscfad1192015-11-02 16:43:11 -08003686// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08003687type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07003688 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07003689 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09003690 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08003691}
3692
Patrice Arrudac249c712019-03-19 17:00:29 -07003693// cc_defaults provides a set of properties that can be inherited by other cc
3694// modules. A module can use the properties from a cc_defaults using
3695// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3696// merged (when possible) by prepending the default module's values to the
3697// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003698func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003699 return DefaultsFactory()
3700}
3701
Colin Cross36242852017-06-23 15:06:31 -07003702func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003703 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003704
Colin Cross36242852017-06-23 15:06:31 -07003705 module.AddProperties(props...)
3706 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003707 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003708 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003709 &BaseCompilerProperties{},
3710 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003711 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003712 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003713 &StaticProperties{},
3714 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003715 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003716 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00003717 &TestLinkerProperties{},
3718 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003719 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003720 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07003721 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003722 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003723 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003724 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003725 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003726 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003727 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003728 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003729 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003730 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08003731 &AfdoProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003732 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003733 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003734 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3735 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07003736 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003737 )
Colin Crosscfad1192015-11-02 16:43:11 -08003738
Jooyung Hancc372c52019-09-25 15:18:44 +09003739 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003740
3741 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003742}
3743
Jiyong Park2286afd2020-06-16 21:58:53 +09003744func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02003745 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09003746}
3747
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003748func kytheExtractAllFactory() android.Singleton {
3749 return &kytheExtractAllSingleton{}
3750}
3751
3752type kytheExtractAllSingleton struct {
3753}
3754
3755func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3756 var xrefTargets android.Paths
3757 ctx.VisitAllModules(func(module android.Module) {
3758 if ccModule, ok := module.(xref); ok {
3759 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3760 }
3761 })
3762 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3763 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003764 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003765 }
3766}
3767
Colin Cross06a931b2015-10-28 17:23:31 -07003768var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003769var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003770var BoolPtr = proptools.BoolPtr
3771var String = proptools.String
3772var StringPtr = proptools.StringPtr