blob: 963e7b9bce6d7d38dac924a637d2d55c6252996b [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()
Inseob Kimac1e9862019-12-09 18:15:47 +090054 ctx.BottomUp("sysprop_cc", SyspropMutator).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070055 })
Colin Cross16b23492016-01-06 14:41:07 -080056
Paul Duffin036e7002019-12-19 19:16:28 +000057 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -040058 for _, san := range Sanitizers {
59 san.registerMutators(ctx)
60 }
Dan Willemsen581341d2017-02-09 16:16:31 -080061
Colin Cross0b908332019-06-19 23:00:20 -070062 ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel()
Jiyong Park379de2f2018-12-19 02:47:14 +090063 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
Ivan Lozano30c5db22018-02-21 15:49:20 -080064
Cory Barkera1da26f2022-06-07 20:12:06 +000065 ctx.TopDown("fuzz_deps", fuzzMutatorDeps)
Cory Barkera1da26f2022-06-07 20:12:06 +000066
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -080067 ctx.BottomUp("coverage", coverageMutator).Parallel()
Stephen Craneba090d12017-05-09 15:44:35 -070068
Yi Kongeb8efc92021-12-09 18:06:29 +080069 ctx.TopDown("afdo_deps", afdoDepsMutator)
70 ctx.BottomUp("afdo", afdoMutator).Parallel()
71
Stephen Craneba090d12017-05-09 15:44:35 -070072 ctx.TopDown("lto_deps", ltoDepsMutator)
73 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090074
Jooyung Han479ca172020-10-19 18:51:07 +090075 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090076 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070077 })
Colin Crossb98c8b02016-07-29 13:44:28 -070078
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080079 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
80 // sabi mutator needs to be run after apex mutator finishes.
81 ctx.TopDown("sabi_deps", sabiDepsMutator)
82 })
83
Colin Cross57898582020-10-29 18:25:19 -070084 ctx.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070085}
86
Chris Parsonsef6e0cf2020-12-01 18:26:21 -050087// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
88// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
89// edges to these modules.
90// This object is constructed in DepsMutator, by calling to various module delegates to set
91// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
92// dependencies.
93// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
94// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -080095type Deps struct {
96 SharedLibs, LateSharedLibs []string
97 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -080098 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +080099 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700100
Colin Cross3e5e7782022-06-17 22:17:05 +0000101 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
102 // prevent automatically exporting symbols.
103 UnexportedStaticLibs []string
104
Chris Parsons79d66a52020-06-05 17:26:16 -0400105 // Used for data dependencies adjacent to tests
106 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700107 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400108
Yo Chiang219968c2020-09-22 18:45:04 +0800109 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
110 SystemSharedLibs []string
111
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500112 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800113 StaticUnwinderIfLegacy bool
114
Colin Cross5950f382016-12-13 12:50:57 -0800115 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700116
Colin Cross81413472016-04-11 14:37:39 -0700117 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700118
Dan Willemsenb40aab62016-04-20 14:21:14 -0700119 GeneratedSources []string
120 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900121 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700122
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700123 ReexportGeneratedHeaders []string
124
Colin Crossc465efd2021-06-11 18:00:04 -0700125 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700126
127 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700128 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900129
130 // List of libs that need to be excluded for APEX variant
131 ExcludeLibsForApex []string
Colin Crossc472d572015-03-17 15:06:21 -0700132}
133
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500134// PathDeps is a struct containing file paths to dependencies of a module.
135// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
136// It's used to construct flags for various build statements (such as for compiling and linking).
137// It is then passed to module decorator functions responsible for registering build statements
138// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800139type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700140 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900141 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700142 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900143 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700144 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700145 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700146
Colin Cross0de8a1e2020-09-18 14:15:30 -0700147 // Transitive static library dependencies of static libraries for use in ordering.
148 TranstiveStaticLibrariesForOrdering *android.DepSet
149
Colin Cross26c34ed2016-09-30 17:10:16 -0700150 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100151 Objs Objects
152 // Paths to .o files in dependencies that provide them. Note that these lists
153 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800154 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700155 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700156
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100157 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
158 // the libs from all whole_static_lib dependencies.
159 WholeStaticLibsFromPrebuilts android.Paths
160
Colin Cross26c34ed2016-09-30 17:10:16 -0700161 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700162 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900163 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700164
Inseob Kimd110f872019-12-06 13:15:38 +0900165 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000166 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900167 IncludeDirs android.Paths
168 SystemIncludeDirs android.Paths
169 ReexportedDirs android.Paths
170 ReexportedSystemDirs android.Paths
171 ReexportedFlags []string
172 ReexportedGeneratedHeaders android.Paths
173 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700174
Colin Cross26c34ed2016-09-30 17:10:16 -0700175 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700176 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700177
Dan Willemsena0790e32018-10-12 00:24:23 -0700178 // Path to the dynamic linker binary
179 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700180
181 // For Darwin builds, the path to the second architecture's output that should
182 // be combined with this architectures's output into a FAT MachO file.
183 DarwinSecondArchOutput android.OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700184}
185
Colin Cross4af21ed2019-11-04 09:37:55 -0800186// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
187// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
188// command line so they can be overridden by the local module flags).
189type LocalOrGlobalFlags struct {
190 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700191 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800192 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700193 CFlags []string // Flags that apply to C and C++ source files
194 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
195 ConlyFlags []string // Flags that apply to C source files
196 CppFlags []string // Flags that apply to C++ source files
197 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700198 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800199}
200
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500201// Flags contains various types of command line flags (and settings) for use in building build
202// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800203type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500204 // Local flags (which individual modules are responsible for). These may override global flags.
205 Local LocalOrGlobalFlags
206 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800207 Global LocalOrGlobalFlags
208
209 aidlFlags []string // Flags that apply to aidl source files
210 rsFlags []string // Flags that apply to renderscript source files
211 libFlags []string // Flags to add libraries early to the link order
212 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
213 TidyFlags []string // Flags that apply to clang-tidy
214 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700215
Colin Crossc3199482017-03-30 15:03:04 -0700216 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800217 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700218 SystemIncludeFlags []string
219
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800220 Toolchain config.Toolchain
221 Tidy bool // True if ninja .tidy rules should be generated.
222 NeedTidyFiles bool // True if module link should depend on .tidy files
223 GcovCoverage bool // True if coverage files should be generated.
224 SAbiDump bool // True if header abi dumps should be generated.
225 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800226
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500227 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800228 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500229 // The target-device system path to the dynamic linker.
230 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800231
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700232 CFlagsDeps android.Paths // Files depended on by compiler flags
233 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800234
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500235 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700236 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800237
Colin Cross19878da2019-03-28 14:45:07 -0700238 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700239 protoC bool // Whether to use C instead of C++
240 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700241
242 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200243 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700244}
245
Colin Crossca860ac2016-01-04 14:34:37 -0800246// Properties used to compile all C or C++ modules
247type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700248 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800249 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700250
Jiyong Parkb35a8192020-08-10 15:59:36 +0900251 // The API level that this module is built against. The APIs of this API level will be
252 // visible at build time, but use of any APIs newer than min_sdk_version will render the
253 // module unloadable on older devices. In the future it will be possible to weakly-link new
254 // APIs, making the behavior match Java: such modules will load on older devices, but
255 // calling new APIs on devices that do not support them will result in a crash.
256 //
257 // This property has the same behavior as sdk_version does for Java modules. For those
258 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
259 // does for Java code.
260 //
261 // In addition, setting this property causes two variants to be built, one for the platform
262 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800263 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700264
Jiyong Parkb35a8192020-08-10 15:59:36 +0900265 // Minimum OS API level supported by this C or C++ module. This property becomes the value
266 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
267 // this property is also used to ensure that the min_sdk_version of the containing module is
268 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
269 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
270 // min_sdk_version of the containing APEX. When the module
271 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900272 Min_sdk_version *string
273
Colin Crossc511bc52020-04-07 16:50:32 +0000274 // If true, always create an sdk variant and don't create a platform variant.
275 Sdk_variant_only *bool
276
Jiyong Parkde866cb2018-12-07 23:08:36 +0900277 AndroidMkSharedLibs []string `blueprint:"mutated"`
278 AndroidMkStaticLibs []string `blueprint:"mutated"`
279 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
280 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700281 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900282 HideFromMake bool `blueprint:"mutated"`
283 PreventInstall bool `blueprint:"mutated"`
284 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700285
Yo Chiang219968c2020-09-22 18:45:04 +0800286 // Set by DepsMutator.
287 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
288
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200289 // The name of the image this module is built for, suffixed with a '.'
Justin Yun5f7f7e82019-11-18 19:52:14 +0900290 ImageVariationPrefix string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200291
292 // The VNDK version this module is built against. If empty, the module is not
293 // build against the VNDK.
294 VndkVersion string `blueprint:"mutated"`
295
296 // Suffix for the name of Android.mk entries generated by this module
297 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800298
299 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
300 // file
301 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900302
Yifan Hong39143a92020-10-26 12:43:12 -0700303 // Make this module available when building for ramdisk.
304 // On device without a dedicated recovery partition, the module is only
305 // available after switching root into
306 // /first_stage_ramdisk. To expose the module before switching root, install
307 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800308 Ramdisk_available *bool
309
Yifan Hong39143a92020-10-26 12:43:12 -0700310 // Make this module available when building for vendor ramdisk.
311 // On device without a dedicated recovery partition, the module is only
312 // available after switching root into
313 // /first_stage_ramdisk. To expose the module before switching root, install
314 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700315 Vendor_ramdisk_available *bool
316
Jiyong Parkf9332f12018-02-01 00:54:12 +0900317 // Make this module available when building for recovery
318 Recovery_available *bool
319
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200320 // Used by imageMutator, set by ImageMutatorBegin()
321 CoreVariantNeeded bool `blueprint:"mutated"`
322 RamdiskVariantNeeded bool `blueprint:"mutated"`
323 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
324 RecoveryVariantNeeded bool `blueprint:"mutated"`
325
326 // A list of variations for the "image" mutator of the form
327 //<image name> '.' <version char>, for example, 'vendor.S'
328 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900329
330 // Allows this module to use non-APEX version of libraries. Useful
331 // for building binaries that are started before APEXes are activated.
332 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900333
334 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
335 // see soong/cc/config/vndk.go
336 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900337
338 // Used by vendor snapshot to record dependencies from snapshot modules.
339 SnapshotSharedLibs []string `blueprint:"mutated"`
Justin Yun5e035862021-06-29 20:50:37 +0900340 SnapshotStaticLibs []string `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900341 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000342
Colin Cross1bc94122021-10-28 13:25:54 -0700343 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000344
345 // Set by factories of module types that can only be referenced from variants compiled against
346 // the SDK.
347 AlwaysSdk bool `blueprint:"mutated"`
348
349 // Variant is an SDK variant created by sdkMutator
350 IsSdkVariant bool `blueprint:"mutated"`
351 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
352 // variant to have a ".sdk" suffix.
353 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700354
355 // Normally Soong uses the directory structure to decide which modules
356 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800357 // different snapshots (vendor, recovery, etc.), but this property
358 // allows a partner to exclude a module normally thought of as a
359 // framework module from the vendor snapshot.
360 Exclude_from_vendor_snapshot *bool
361
362 // Normally Soong uses the directory structure to decide which modules
363 // should be included (framework) or excluded (non-framework) from the
364 // different snapshots (vendor, recovery, etc.), but this property
365 // allows a partner to exclude a module normally thought of as a
366 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800367 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900368
369 // List of APEXes that this module has private access to for testing purpose. The module
370 // can depend on libraries that are not exported by the APEXes and use private symbols
371 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000372 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800373
374 Target struct {
375 Platform struct {
376 // List of modules required by the core variant.
377 Required []string `android:"arch_variant"`
378
379 // List of modules not required by the core variant.
380 Exclude_required []string `android:"arch_variant"`
381 } `android:"arch_variant"`
382
383 Recovery struct {
384 // List of modules required by the recovery variant.
385 Required []string `android:"arch_variant"`
386
387 // List of modules not required by the recovery variant.
388 Exclude_required []string `android:"arch_variant"`
389 } `android:"arch_variant"`
390 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700391}
392
393type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900394 // whether this module should be allowed to be directly depended by other
395 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900396 // If set to true, two variants will be built separately, one like
397 // normal, and the other limited to the set of libraries and headers
398 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700399 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900400 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700401 // so it shouldn't have any unversioned runtime dependencies, or
402 // make assumptions about the system that may not be true in the
403 // future.
404 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900405 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900406 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900407 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900408 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900409 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700410 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
411 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900412
Justin Yunebcf0c52021-01-08 18:00:19 +0900413 // This is the same as the "vendor_available" except that the install path
414 // of the vendor variant is /odm or /vendor/odm.
415 // By replacing "vendor_available: true" with "odm_available: true", the
416 // module will install its vendor variant to the /odm partition or /vendor/odm.
417 // As the modules with "odm_available: true" still create the vendor variants,
418 // they can link to the other vendor modules as the vendor_available modules do.
419 // Also, the vendor modules can link to odm_available modules.
420 //
421 // It may not be used for VNDK modules.
422 Odm_available *bool
423
Justin Yun63e9ec72020-10-29 16:49:43 +0900424 // whether this module should be allowed to be directly depended by other
425 // modules with `product_specific: true` or `product_available: true`.
426 // If set to true, an additional product variant will be built separately
427 // that is limited to the set of libraries and headers that are exposed to
428 // /product modules.
429 //
430 // The product variant may be used with a different (newer) /system,
431 // so it shouldn't have any unversioned runtime dependencies, or
432 // make assumptions about the system that may not be true in the
433 // future.
434 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900435 // If set to false, this module becomes inaccessible from /product modules.
436 //
437 // Different from the 'vendor_available' property, the modules with
438 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
439 // library without 'product_available' may not be depended on by any other
440 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900441 //
442 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
443 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
444 Product_available *bool
445
Jiyong Park5fb8c102018-04-09 12:03:06 +0900446 // whether this module is capable of being loaded with other instance
447 // (possibly an older version) of the same module in the same process.
448 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
449 // can be double loaded in a vendor process if the library is also a
450 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
451 // explicitly marked as `double_loadable: true` by the owner, or the dependency
452 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
453 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800454
455 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
456 IsLLNDK bool `blueprint:"mutated"`
457
Colin Cross78212242021-01-06 14:51:30 -0800458 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
459 // set and the module is not listed in VndkMustUseVendorVariantList.
460 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
461
462 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
463 IsVNDKCore bool `blueprint:"mutated"`
464
465 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
466 IsVNDKSP bool `blueprint:"mutated"`
467
468 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
469 // module sets the llndk.private property.
470 IsVNDKPrivate bool `blueprint:"mutated"`
471
472 // IsVNDKProduct is set if a VNDK module sets the product_available property.
473 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700474
475 // IsVendorPublicLibrary is set for the core and product variants of a library that has
476 // vendor_public_library stubs.
477 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800478}
479
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500480// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
481// to understanding details about the type of the current module.
482// For example, one might call these functions to determine whether the current module is a static
483// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800484type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800485 static() bool
486 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700487 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800488 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900489 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900490 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900491 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700492 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900493 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700494 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800495 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900496 minSdkVersion() string
497 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700498 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700499 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800500 IsLlndk() bool
501 IsLlndkPublic() bool
502 isImplementationForLLNDKPublic() bool
503 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900504 isVndk() bool
505 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500506 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700507 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900508 inProduct() bool
509 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800510 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700511 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900512 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700513 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700514 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800515 getVndkExtendsModuleName() string
Yi Kong4ef54592022-02-14 20:00:10 +0800516 isAfdoCompile() bool
Yi Kong7e53c572018-02-14 18:16:12 +0800517 isPgoCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800518 isCfi() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800519 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800520 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800521 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700522 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700523 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900524 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800525 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700526 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700527 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800528 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800529 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800530 getSharedFlags() *SharedFlags
531}
532
533type SharedFlags struct {
534 numSharedFlags int
535 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800536}
537
538type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700539 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800540 ModuleContextIntf
541}
542
543type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700544 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800545 ModuleContextIntf
546}
547
Colin Cross37047f12016-12-13 17:06:13 -0800548type DepsContext interface {
549 android.BottomUpMutatorContext
550 ModuleContextIntf
551}
552
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500553// feature represents additional (optional) steps to building cc-related modules, such as invocation
554// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800555type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800556 flags(ctx ModuleContext, flags Flags) Flags
557 props() []interface{}
558}
559
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500560// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500561// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800562type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700563 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800564 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800565 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700566 compilerProps() []interface{}
567
Colin Cross76fada02016-07-27 10:31:13 -0700568 appendCflags([]string)
569 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700570 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800571}
572
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500573// linker is the interface for a linker decorator object. Individual module types can provide
574// their own implementation for this decorator, and thus specify custom logic regarding build
575// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800576type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700577 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800578 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700579 linkerFlags(ctx ModuleContext, flags Flags) Flags
580 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800581 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700582
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700583 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700584 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900585 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700586
587 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900588 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000589
590 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000591 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
592}
593
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500594// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000595type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500596 sharedLibs []string
597 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
598 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700599 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800600}
601
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500602// installer is the interface for an installer helper object. This helper is responsible for
603// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800604type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700605 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700606 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000607 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800608 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700609 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700610 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900611 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100612 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900613 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800614}
615
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800616type xref interface {
617 XrefCcFiles() android.Paths
618}
619
Colin Cross6e511a92020-07-27 21:26:48 -0700620type libraryDependencyKind int
621
622const (
623 headerLibraryDependency = iota
624 sharedLibraryDependency
625 staticLibraryDependency
626)
627
628func (k libraryDependencyKind) String() string {
629 switch k {
630 case headerLibraryDependency:
631 return "headerLibraryDependency"
632 case sharedLibraryDependency:
633 return "sharedLibraryDependency"
634 case staticLibraryDependency:
635 return "staticLibraryDependency"
636 default:
637 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
638 }
639}
640
641type libraryDependencyOrder int
642
643const (
644 earlyLibraryDependency = -1
645 normalLibraryDependency = 0
646 lateLibraryDependency = 1
647)
648
649func (o libraryDependencyOrder) String() string {
650 switch o {
651 case earlyLibraryDependency:
652 return "earlyLibraryDependency"
653 case normalLibraryDependency:
654 return "normalLibraryDependency"
655 case lateLibraryDependency:
656 return "lateLibraryDependency"
657 default:
658 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
659 }
660}
661
662// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
663// tags that have a set of predefined tag objects that are reused for each dependency, a
664// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
665// That means that comparing a libraryDependencyTag for equality will only be equal if all
666// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
667// then check individual metadata fields instead.
668type libraryDependencyTag struct {
669 blueprint.BaseDependencyTag
670
671 // These are exported so that fmt.Printf("%#v") can call their String methods.
672 Kind libraryDependencyKind
673 Order libraryDependencyOrder
674
675 wholeStatic bool
676
677 reexportFlags bool
678 explicitlyVersioned bool
679 dataLib bool
680 ndk bool
681
682 staticUnwinder bool
683
684 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900685
Cindy Zhou18417cb2020-12-10 07:12:38 -0800686 // Whether or not this dependency should skip the apex dependency check
687 skipApexAllowedDependenciesCheck bool
688
Jiyong Parke3867542020-12-03 17:28:25 +0900689 // Whether or not this dependency has to be followed for the apex variants
690 excludeInApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000691
692 // If true, don't automatically export symbols from the static library into a shared library.
693 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700694}
695
696// header returns true if the libraryDependencyTag is tagging a header lib dependency.
697func (d libraryDependencyTag) header() bool {
698 return d.Kind == headerLibraryDependency
699}
700
701// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
702func (d libraryDependencyTag) shared() bool {
703 return d.Kind == sharedLibraryDependency
704}
705
706// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
707func (d libraryDependencyTag) static() bool {
708 return d.Kind == staticLibraryDependency
709}
710
Colin Cross65cb3142021-12-10 23:05:02 +0000711func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
712 if d.shared() {
713 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
714 }
715 return nil
716}
717
718var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
719
Colin Crosse9fe2942020-11-10 18:12:15 -0800720// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
721// binaries or other shared libraries are installed as dependencies.
722func (d libraryDependencyTag) InstallDepNeeded() bool {
723 return d.shared()
724}
725
726var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
727
728// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700729// libraryDependencyTag. Each tag object is created globally and reused for multiple
730// dependencies (although since the object contains no references, assigning a tag to a
731// variable and modifying it will not modify the original). Users can compare the tag
732// returned by ctx.OtherModuleDependencyTag against the global original
733type dependencyTag struct {
734 blueprint.BaseDependencyTag
735 name string
736}
737
Colin Crosse9fe2942020-11-10 18:12:15 -0800738// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
739// libraryDependencyTag, but where the dependency needs to be installed when the parent is
740// installed.
741type installDependencyTag struct {
742 blueprint.BaseDependencyTag
743 android.InstallAlwaysNeededDependencyTag
744 name string
745}
746
Colin Crossc99deeb2016-04-11 15:06:20 -0700747var (
Colin Cross6e511a92020-07-27 21:26:48 -0700748 genSourceDepTag = dependencyTag{name: "gen source"}
749 genHeaderDepTag = dependencyTag{name: "gen header"}
750 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
751 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900752 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700753 reuseObjTag = dependencyTag{name: "reuse objects"}
754 staticVariantTag = dependencyTag{name: "static variant"}
755 vndkExtDepTag = dependencyTag{name: "vndk extends"}
756 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700757 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800758 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700759 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700760 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000761 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700762)
763
Roland Levillainf89cd092019-07-29 16:22:59 +0100764func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700765 ccLibDepTag, ok := depTag.(libraryDependencyTag)
766 return ok && ccLibDepTag.shared()
767}
768
769func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
770 ccLibDepTag, ok := depTag.(libraryDependencyTag)
771 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100772}
773
Zach Johnson3df4e632020-11-06 11:56:27 -0800774func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
775 ccLibDepTag, ok := depTag.(libraryDependencyTag)
776 return ok && ccLibDepTag.header()
777}
778
Roland Levillainf89cd092019-07-29 16:22:59 +0100779func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800780 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100781}
782
783func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700784 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100785 return ok && ccDepTag == testPerSrcDepTag
786}
787
Chris Parsonsf874e462022-05-10 13:50:12 -0400788// bazelHandler is the interface for a helper object related to deferring to Bazel for
789// processing a cc module (during Bazel mixed builds). Individual module types should define
790// their own bazel handler if they support being handled by Bazel.
791type BazelHandler interface {
792 // QueueBazelCall invokes request-queueing functions on the BazelContext
793 //so that these requests are handled when Bazel's cquery is invoked.
794 QueueBazelCall(ctx android.BaseModuleContext, label string)
795
796 // ProcessBazelQueryResponse uses information retrieved from Bazel to set properties
797 // on the current module with given label.
798 ProcessBazelQueryResponse(ctx android.ModuleContext, label string)
799}
800
Colin Crossca860ac2016-01-04 14:34:37 -0800801// Module contains the properties and members used by all C/C++ module types, and implements
802// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500803// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
804// interface.
805//
806// To define a C/C++ related module, construct a new Module object and point its delegates to
807// type-specific structs. These delegates will be invoked to register module-specific build
808// statements which may be unique to the module type. For example, module.compiler.compile() should
809// be defined so as to register build statements which are responsible for compiling the module.
810//
811// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
812// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
813// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
814// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800815type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700816 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700817
Jiyong Parkd1063c12019-07-17 20:08:41 +0900818 android.SdkBase
Liz Kammerea6666f2021-02-17 10:17:28 -0500819 android.BazelModuleBase
Colin Crossc472d572015-03-17 15:06:21 -0700820
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700821 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700822 Properties BaseProperties
Colin Crossfa138792015-04-24 17:31:52 -0700823
Colin Crossca860ac2016-01-04 14:34:37 -0800824 // initialize before calling Init
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400825 hod android.HostOrDeviceSupported
826 multilib android.Multilib
827 bazelable bool
Colin Crossc472d572015-03-17 15:06:21 -0700828
Paul Duffina0843f62019-12-13 19:50:38 +0000829 // Allowable SdkMemberTypes of this module type.
830 sdkMemberTypes []android.SdkMemberType
831
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500832 // decorator delegates, initialize before calling Init
833 // these may contain module-specific implementations, and effectively allow for custom
834 // type-specific logic. These members may reference different objects or the same object.
835 // Functions of these decorators will be invoked to initialize and register type-specific
836 // build statements.
Chris Parsons8d6e4332021-02-22 16:13:50 -0500837 compiler compiler
838 linker linker
839 installer installer
Chris Parsonsf874e462022-05-10 13:50:12 -0400840 bazelHandler BazelHandler
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500841
842 features []feature
843 stl *stl
844 sanitize *sanitize
845 coverage *coverage
Cory Barkera1da26f2022-06-07 20:12:06 +0000846 fuzzer *fuzzer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500847 sabi *sabi
848 vndkdep *vndkdep
849 lto *lto
Yi Kongeb8efc92021-12-09 18:06:29 +0800850 afdo *afdo
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500851 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800852
Colin Cross31076b32020-10-23 17:22:06 -0700853 library libraryInterface
854
Colin Cross635c3b02016-05-18 15:37:25 -0700855 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800856
Colin Crossb98c8b02016-07-29 13:44:28 -0700857 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700858
859 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800860
861 // Flags used to compile this module
862 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700863
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800864 // Shared flags among build rules of this module
865 sharedFlags SharedFlags
866
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800867 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700868 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900869
870 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800871 // Kythe (source file indexer) paths for this compilation module
872 kytheFiles android.Paths
Chih-Hung Hsieh80783772021-10-11 16:46:56 -0700873 // Object .o file output paths for this compilation module
874 objFiles android.Paths
875 // Tidy .tidy file output paths for this compilation module
876 tidyFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900877
878 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700879 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700880
881 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700882}
883
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200884func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400885 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
886 if b, ok := c.compiler.(*baseCompiler); ok {
887 hasAidl = b.hasSrcExt(".aidl")
888 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
889 hasProto = b.hasSrcExt(".proto")
890 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
891 hasSysprop = b.hasSrcExt(".sysprop")
892 hasWinMsg = b.hasSrcExt(".mc")
893 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
894 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200895 c.AndroidModuleBase().AddJSONData(d)
896 (*d)["Cc"] = map[string]interface{}{
897 "SdkVersion": c.SdkVersion(),
898 "MinSdkVersion": c.MinSdkVersion(),
899 "VndkVersion": c.VndkVersion(),
900 "ProductSpecific": c.ProductSpecific(),
901 "SocSpecific": c.SocSpecific(),
902 "DeviceSpecific": c.DeviceSpecific(),
903 "InProduct": c.InProduct(),
904 "InVendor": c.InVendor(),
905 "InRamdisk": c.InRamdisk(),
906 "InVendorRamdisk": c.InVendorRamdisk(),
907 "InRecovery": c.InRecovery(),
908 "VendorAvailable": c.VendorAvailable(),
909 "ProductAvailable": c.ProductAvailable(),
910 "RamdiskAvailable": c.RamdiskAvailable(),
911 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
912 "RecoveryAvailable": c.RecoveryAvailable(),
913 "OdmAvailable": c.OdmAvailable(),
914 "InstallInData": c.InstallInData(),
915 "InstallInRamdisk": c.InstallInRamdisk(),
916 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
917 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
918 "InstallInRecovery": c.InstallInRecovery(),
919 "InstallInRoot": c.InstallInRoot(),
920 "IsVndk": c.IsVndk(),
921 "IsVndkExt": c.IsVndkExt(),
922 "IsVndkPrivate": c.IsVndkPrivate(),
923 "IsVndkSp": c.IsVndkSp(),
924 "IsLlndk": c.IsLlndk(),
925 "IsLlndkPublic": c.IsLlndkPublic(),
926 "IsSnapshotLibrary": c.IsSnapshotLibrary(),
927 "IsSnapshotPrebuilt": c.IsSnapshotPrebuilt(),
928 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
929 "ApexSdkVersion": c.apexSdkVersion,
930 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400931 "AidlSrcs": hasAidl,
932 "LexSrcs": hasLex,
933 "ProtoSrcs": hasProto,
934 "RenderscriptSrcs": hasRenderscript,
935 "SyspropSrcs": hasSysprop,
936 "WinMsgSrcs": hasWinMsg,
937 "YaccSrsc": hasYacc,
938 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200939 }
940}
941
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500942func (c *Module) SetPreventInstall() {
943 c.Properties.PreventInstall = true
944}
945
946func (c *Module) SetHideFromMake() {
947 c.Properties.HideFromMake = true
948}
949
Ivan Lozanod7586b62021-04-01 09:49:36 -0400950func (c *Module) HiddenFromMake() bool {
951 return c.Properties.HideFromMake
952}
953
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800954func (c *Module) RequiredModuleNames() []string {
955 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
956 if c.ImageVariation().Variation == android.CoreVariation {
957 required = append(required, c.Properties.Target.Platform.Required...)
958 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
959 } else if c.InRecovery() {
960 required = append(required, c.Properties.Target.Recovery.Required...)
961 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
962 }
963 return android.FirstUniqueStrings(required)
964}
965
Ivan Lozano52767be2019-10-18 14:49:46 -0700966func (c *Module) Toc() android.OptionalPath {
967 if c.linker != nil {
968 if library, ok := c.linker.(libraryInterface); ok {
969 return library.toc()
970 }
971 }
972 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
973}
974
975func (c *Module) ApiLevel() string {
976 if c.linker != nil {
977 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700978 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700979 }
980 }
981 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
982}
983
984func (c *Module) Static() bool {
985 if c.linker != nil {
986 if library, ok := c.linker.(libraryInterface); ok {
987 return library.static()
988 }
989 }
990 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
991}
992
993func (c *Module) Shared() bool {
994 if c.linker != nil {
995 if library, ok := c.linker.(libraryInterface); ok {
996 return library.shared()
997 }
998 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +0200999
Ivan Lozano52767be2019-10-18 14:49:46 -07001000 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1001}
1002
1003func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001004 if c.stl != nil {
1005 return c.stl.Properties.SelectedStl
1006 }
1007 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001008}
1009
Ivan Lozano52767be2019-10-18 14:49:46 -07001010func (c *Module) NdkPrebuiltStl() bool {
1011 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1012 return true
1013 }
1014 return false
1015}
1016
1017func (c *Module) StubDecorator() bool {
1018 if _, ok := c.linker.(*stubDecorator); ok {
1019 return true
1020 }
1021 return false
1022}
1023
1024func (c *Module) SdkVersion() string {
1025 return String(c.Properties.Sdk_version)
1026}
1027
Artur Satayev480e25b2020-04-27 18:53:18 +01001028func (c *Module) MinSdkVersion() string {
1029 return String(c.Properties.Min_sdk_version)
1030}
1031
Jiyong Park5df7bd32021-08-25 16:18:46 +09001032func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001033 if linker, ok := c.linker.(*objectLinker); ok {
1034 return linker.isCrt()
1035 }
1036 return false
1037}
1038
Jiyong Park5df7bd32021-08-25 16:18:46 +09001039func (c *Module) SplitPerApiLevel() bool {
1040 return c.canUseSdk() && c.isCrt()
1041}
1042
Colin Crossc511bc52020-04-07 16:50:32 +00001043func (c *Module) AlwaysSdk() bool {
1044 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1045}
1046
Ivan Lozano183a3212019-10-18 14:18:45 -07001047func (c *Module) CcLibrary() bool {
1048 if c.linker != nil {
1049 if _, ok := c.linker.(*libraryDecorator); ok {
1050 return true
1051 }
Colin Crossd48fe732020-09-23 20:37:24 -07001052 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1053 return true
1054 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001055 }
1056 return false
1057}
1058
1059func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001060 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001061 return true
1062 }
1063 return false
1064}
1065
Ivan Lozano2b262972019-11-21 12:30:50 -08001066func (c *Module) NonCcVariants() bool {
1067 return false
1068}
1069
Ivan Lozano183a3212019-10-18 14:18:45 -07001070func (c *Module) SetStatic() {
1071 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001072 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001073 library.setStatic()
1074 return
1075 }
1076 }
1077 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1078}
1079
1080func (c *Module) SetShared() {
1081 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001082 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001083 library.setShared()
1084 return
1085 }
1086 }
1087 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1088}
1089
1090func (c *Module) BuildStaticVariant() bool {
1091 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001092 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001093 return library.buildStatic()
1094 }
1095 }
1096 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1097}
1098
1099func (c *Module) BuildSharedVariant() bool {
1100 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001101 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001102 return library.buildShared()
1103 }
1104 }
1105 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1106}
1107
1108func (c *Module) Module() android.Module {
1109 return c
1110}
1111
Jiyong Parkc20eee32018-09-05 22:36:17 +09001112func (c *Module) OutputFile() android.OptionalPath {
1113 return c.outputFile
1114}
1115
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001116func (c *Module) CoverageFiles() android.Paths {
1117 if c.linker != nil {
1118 if library, ok := c.linker.(libraryInterface); ok {
1119 return library.objs().coverageFiles
1120 }
1121 }
1122 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1123}
1124
Ivan Lozano183a3212019-10-18 14:18:45 -07001125var _ LinkableInterface = (*Module)(nil)
1126
Jiyong Park719b4462019-01-13 00:39:51 +09001127func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001128 if c.linker != nil {
1129 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001130 }
1131 return nil
1132}
1133
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001134func (c *Module) CoverageOutputFile() android.OptionalPath {
1135 if c.linker != nil {
1136 return c.linker.coverageOutputFilePath()
1137 }
1138 return android.OptionalPath{}
1139}
1140
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001141func (c *Module) RelativeInstallPath() string {
1142 if c.installer != nil {
1143 return c.installer.relativeInstallPath()
1144 }
1145 return ""
1146}
1147
Jooyung Han344d5432019-08-23 11:17:39 +09001148func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001149 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001150}
1151
Colin Cross36242852017-06-23 15:06:31 -07001152func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001153 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -08001154 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001155 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001156 }
1157 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001158 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001159 }
1160 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001161 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001162 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001163 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001164 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001165 }
Colin Cross16b23492016-01-06 14:41:07 -08001166 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001167 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001168 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001169 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001170 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001171 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001172 if c.fuzzer != nil {
1173 c.AddProperties(c.fuzzer.props()...)
1174 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001175 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001176 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001177 }
Justin Yun8effde42017-06-23 19:24:43 +09001178 if c.vndkdep != nil {
1179 c.AddProperties(c.vndkdep.props()...)
1180 }
Stephen Craneba090d12017-05-09 15:44:35 -07001181 if c.lto != nil {
1182 c.AddProperties(c.lto.props()...)
1183 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001184 if c.afdo != nil {
1185 c.AddProperties(c.afdo.props()...)
1186 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001187 if c.pgo != nil {
1188 c.AddProperties(c.pgo.props()...)
1189 }
Colin Crossca860ac2016-01-04 14:34:37 -08001190 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001191 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001192 }
Colin Crossc472d572015-03-17 15:06:21 -07001193
Colin Cross36242852017-06-23 15:06:31 -07001194 android.InitAndroidArchModule(c, c.hod, c.multilib)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001195 if c.bazelable {
1196 android.InitBazelModule(c)
1197 }
Jiyong Park7916bfc2019-09-30 19:13:12 +09001198 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +09001199 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001200 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001201
Colin Cross36242852017-06-23 15:06:31 -07001202 return c
Colin Crossc472d572015-03-17 15:06:21 -07001203}
1204
Ivan Lozano52767be2019-10-18 14:49:46 -07001205func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001206 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001207}
1208
Colin Crossc511bc52020-04-07 16:50:32 +00001209func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001210 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1211 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001212}
1213
1214func (c *Module) UseSdk() bool {
1215 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001216 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001217 }
1218 return false
1219}
1220
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001221func (c *Module) isCoverageVariant() bool {
1222 return c.coverage.Properties.IsCoverageVariant
1223}
1224
Colin Cross95f1ca02020-10-29 20:47:22 -07001225func (c *Module) IsNdk(config android.Config) bool {
1226 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001227}
1228
Colin Cross127bb8b2020-12-16 16:46:01 -08001229func (c *Module) IsLlndk() bool {
1230 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001231}
1232
Colin Cross127bb8b2020-12-16 16:46:01 -08001233func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001234 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001235}
1236
Colin Cross1f3f1302021-04-26 18:37:44 -07001237func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001238 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001239 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001240}
1241
Colin Cross5271fea2021-04-27 13:06:04 -07001242func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1243 lib := moduleLibraryInterface(m)
1244 return lib != nil && (lib.hasVendorPublicLibrary())
1245}
1246
1247// IsVendorPublicLibrary returns true for vendor public libraries.
1248func (c *Module) IsVendorPublicLibrary() bool {
1249 return c.VendorProperties.IsVendorPublicLibrary
1250}
1251
Ivan Lozanof1868af2022-04-12 13:08:36 -04001252func (c *Module) IsVndkPrebuiltLibrary() bool {
1253 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1254 return true
1255 }
1256 return false
1257}
1258
1259func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1260 return c.Properties.SdkAndPlatformVariantVisibleToMake
1261}
1262
Ivan Lozanod7586b62021-04-01 09:49:36 -04001263func (c *Module) HasLlndkStubs() bool {
1264 lib := moduleLibraryInterface(c)
1265 return lib != nil && lib.hasLLNDKStubs()
1266}
1267
1268func (c *Module) StubsVersion() string {
1269 if lib, ok := c.linker.(versionedInterface); ok {
1270 return lib.stubsVersion()
1271 }
1272 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1273}
1274
Colin Cross127bb8b2020-12-16 16:46:01 -08001275// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1276// and does not set llndk.vendor_available: false.
1277func (c *Module) isImplementationForLLNDKPublic() bool {
1278 library, _ := c.library.(*libraryDecorator)
1279 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001280 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001281}
1282
Justin Yunfd9e8042020-12-23 18:23:14 +09001283// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001284func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001285 // Check if VNDK-core-private or VNDK-SP-private
1286 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001287 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001288 }
1289
1290 // Check if LLNDK-private
1291 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001292 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001293 }
1294
1295 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001296}
1297
Ivan Lozano52767be2019-10-18 14:49:46 -07001298func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001299 if vndkdep := c.vndkdep; vndkdep != nil {
1300 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001301 }
1302 return false
1303}
1304
Yi Kong4ef54592022-02-14 20:00:10 +08001305func (c *Module) isAfdoCompile() bool {
1306 if afdo := c.afdo; afdo != nil {
1307 return afdo.Properties.AfdoTarget != nil
1308 }
1309 return false
1310}
1311
Yi Kong7e53c572018-02-14 18:16:12 +08001312func (c *Module) isPgoCompile() bool {
1313 if pgo := c.pgo; pgo != nil {
1314 return pgo.Properties.PgoCompile
1315 }
1316 return false
1317}
1318
Yi Kongc702ebd2022-08-19 16:02:45 +08001319func (c *Module) isCfi() bool {
1320 if sanitize := c.sanitize; sanitize != nil {
1321 return Bool(sanitize.Properties.Sanitize.Cfi)
1322 }
1323 return false
1324}
1325
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001326func (c *Module) isNDKStubLibrary() bool {
1327 if _, ok := c.compiler.(*stubDecorator); ok {
1328 return true
1329 }
1330 return false
1331}
1332
Ivan Lozanod7586b62021-04-01 09:49:36 -04001333func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001334 if vndkdep := c.vndkdep; vndkdep != nil {
1335 return vndkdep.isVndkSp()
1336 }
1337 return false
1338}
1339
Ivan Lozanof9e21722020-12-02 09:00:51 -05001340func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001341 if vndkdep := c.vndkdep; vndkdep != nil {
1342 return vndkdep.isVndkExt()
1343 }
1344 return false
1345}
1346
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001347func (c *Module) SubName() string {
1348 return c.Properties.SubName
1349}
1350
Ivan Lozano52767be2019-10-18 14:49:46 -07001351func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001352 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001353}
1354
Logan Chienf3511742017-10-31 18:04:35 +08001355func (c *Module) getVndkExtendsModuleName() string {
1356 if vndkdep := c.vndkdep; vndkdep != nil {
1357 return vndkdep.getVndkExtendsModuleName()
1358 }
1359 return ""
1360}
1361
Jiyong Park25fc6a92018-11-18 18:02:45 +09001362func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001363 if lib := c.library; lib != nil {
1364 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001365 }
1366 return false
1367}
1368
1369func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001370 if lib := c.library; lib != nil {
1371 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001372 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001373 return false
1374}
1375
Colin Cross0477b422020-10-13 18:43:54 -07001376// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1377// the implementation. If it is an implementation library it returns its own name.
1378func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1379 name := ctx.OtherModuleName(c)
1380 if versioned, ok := c.linker.(versionedInterface); ok {
1381 name = versioned.implementationModuleName(name)
1382 }
1383 return name
1384}
1385
Martin Stjernholm2856c662020-12-02 15:03:42 +00001386// Similar to ImplementationModuleName, but uses the Make variant of the module
1387// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1388// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1389// under the premise that the prebuilt module overrides its source counterpart
1390// if it is exposed to Make).
1391func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1392 name := c.BaseModuleName()
1393 if versioned, ok := c.linker.(versionedInterface); ok {
1394 name = versioned.implementationModuleName(name)
1395 }
1396 return name
1397}
1398
Jiyong Park7d55b612021-06-11 17:22:09 +09001399func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001400 return Bool(c.Properties.Bootstrap)
1401}
1402
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001403func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001404 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1405 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1406 return false
1407 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001408 return c.linker != nil && c.linker.nativeCoverage()
1409}
1410
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001411func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001412 if p, ok := c.linker.(SnapshotInterface); ok {
1413 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001414 }
1415 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001416}
1417
Bill Peckham945441c2020-08-31 16:07:58 -07001418func (c *Module) ExcludeFromVendorSnapshot() bool {
1419 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1420}
1421
Jose Galmesf7294582020-11-13 12:07:36 -08001422func (c *Module) ExcludeFromRecoverySnapshot() bool {
1423 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1424}
1425
Jiyong Parkf1194352019-02-25 11:05:47 +09001426func isBionic(name string) bool {
1427 switch name {
Kiyoung Kim4098c7e2020-11-30 14:42:14 +09001428 case "libc", "libm", "libdl", "libdl_android", "linker", "linkerconfig":
Jiyong Parkf1194352019-02-25 11:05:47 +09001429 return true
1430 }
1431 return false
1432}
1433
Martin Stjernholm279de572019-09-10 23:18:20 +01001434func InstallToBootstrap(name string, config android.Config) bool {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001435 if name == "libclang_rt.hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001437 }
1438 return isBionic(name)
1439}
1440
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001441func (c *Module) XrefCcFiles() android.Paths {
1442 return c.kytheFiles
1443}
1444
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001445func (c *Module) isCfiAssemblySupportEnabled() bool {
1446 return c.sanitize != nil &&
1447 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1448}
1449
Inseob Kim800d1142021-06-14 12:03:51 +09001450func (c *Module) InstallInRoot() bool {
1451 return c.installer != nil && c.installer.installInRoot()
1452}
1453
Colin Crossca860ac2016-01-04 14:34:37 -08001454type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001455 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001456 moduleContextImpl
1457}
1458
Colin Cross37047f12016-12-13 17:06:13 -08001459type depsContext struct {
1460 android.BottomUpMutatorContext
1461 moduleContextImpl
1462}
1463
Colin Crossca860ac2016-01-04 14:34:37 -08001464type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001465 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001466 moduleContextImpl
1467}
1468
1469type moduleContextImpl struct {
1470 mod *Module
1471 ctx BaseModuleContext
1472}
1473
Colin Crossb98c8b02016-07-29 13:44:28 -07001474func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001475 return ctx.mod.toolchain(ctx.ctx)
1476}
1477
1478func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001479 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001480}
1481
1482func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001483 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001484}
1485
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001486func (ctx *moduleContextImpl) testBinary() bool {
1487 return ctx.mod.testBinary()
1488}
1489
Yi Kong56fc1b62022-09-06 16:24:00 +08001490func (ctx *moduleContextImpl) testLibrary() bool {
1491 return ctx.mod.testLibrary()
1492}
1493
Jiyong Park1d1119f2019-07-29 21:27:18 +09001494func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001495 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001496}
1497
Inseob Kim7f283f42020-06-01 21:53:49 +09001498func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001499 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001500}
1501
Inseob Kim1042d292020-06-01 23:23:05 +09001502func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001503 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001504}
1505
Jooyung Hanccce2f22020-03-07 03:45:53 +09001506func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001507 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001508}
1509
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001510func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001511 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001512}
1513
1514func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001515 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001516 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001517 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001518 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001519 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001520 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001521 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001522 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001523 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001524 }
1525 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001526}
1527
Jiyong Parkb35a8192020-08-10 15:59:36 +09001528func (ctx *moduleContextImpl) minSdkVersion() string {
1529 ver := ctx.mod.MinSdkVersion()
1530 if ver == "apex_inherit" && !ctx.isForPlatform() {
1531 ver = ctx.apexSdkVersion().String()
1532 }
1533 if ver == "apex_inherit" || ver == "" {
1534 ver = ctx.sdkVersion()
1535 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001536 // For crt objects, the meaning of min_sdk_version is very different from other types of
1537 // module. For them, min_sdk_version defines the oldest version that the build system will
1538 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1539 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1540 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001541 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1542 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1543 // support such an old version. The version is set to the later version in case when the
1544 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1545 // it's for an APEX.
1546 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1547 if ctx.isForPlatform() {
1548 ver = strconv.Itoa(android.FutureApiLevelInt)
1549 } else { // for apex
1550 ver = ctx.apexSdkVersion().String()
1551 if ver == "" { // in case when min_sdk_version was not set by the APEX
1552 ver = ctx.sdkVersion()
1553 }
1554 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001555 }
1556
Jiyong Parkb35a8192020-08-10 15:59:36 +09001557 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1558 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1559 minSdkVersionInt, err2 := strconv.Atoi(ver)
1560 if err == nil && err2 == nil {
1561 if sdkVersionInt < minSdkVersionInt {
1562 return strconv.Itoa(sdkVersionInt)
1563 }
1564 }
1565 return ver
1566}
1567
1568func (ctx *moduleContextImpl) isSdkVariant() bool {
1569 return ctx.mod.IsSdkVariant()
1570}
1571
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001572func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001573 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001574}
Justin Yun8effde42017-06-23 19:24:43 +09001575
Colin Cross95f1ca02020-10-29 20:47:22 -07001576func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1577 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001578}
1579
Colin Cross127bb8b2020-12-16 16:46:01 -08001580func (ctx *moduleContextImpl) IsLlndk() bool {
1581 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001582}
1583
Colin Cross127bb8b2020-12-16 16:46:01 -08001584func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1585 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001586}
1587
Colin Cross127bb8b2020-12-16 16:46:01 -08001588func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1589 return ctx.mod.isImplementationForLLNDKPublic()
1590}
1591
1592func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1593 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001594}
1595
Logan Chienf3511742017-10-31 18:04:35 +08001596func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001597 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001598}
1599
Yi Kong4ef54592022-02-14 20:00:10 +08001600func (ctx *moduleContextImpl) isAfdoCompile() bool {
1601 return ctx.mod.isAfdoCompile()
1602}
1603
Yi Kong7e53c572018-02-14 18:16:12 +08001604func (ctx *moduleContextImpl) isPgoCompile() bool {
1605 return ctx.mod.isPgoCompile()
1606}
1607
Yi Kongc702ebd2022-08-19 16:02:45 +08001608func (ctx *moduleContextImpl) isCfi() bool {
1609 return ctx.mod.isCfi()
1610}
1611
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001612func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1613 return ctx.mod.isNDKStubLibrary()
1614}
1615
Justin Yun8effde42017-06-23 19:24:43 +09001616func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001617 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001618}
1619
Ivan Lozanof9e21722020-12-02 09:00:51 -05001620func (ctx *moduleContextImpl) IsVndkExt() bool {
1621 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001622}
1623
Colin Cross5271fea2021-04-27 13:06:04 -07001624func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1625 return ctx.mod.IsVendorPublicLibrary()
1626}
1627
Vic Yangefd249e2018-11-12 20:19:56 -08001628func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001629 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001630}
1631
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001632func (ctx *moduleContextImpl) selectedStl() string {
1633 if stl := ctx.mod.stl; stl != nil {
1634 return stl.Properties.SelectedStl
1635 }
1636 return ""
1637}
1638
Ivan Lozanobd721262018-11-27 14:33:03 -08001639func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1640 return ctx.mod.linker.useClangLld(actx)
1641}
1642
Colin Crossce75d2c2016-10-06 16:12:58 -07001643func (ctx *moduleContextImpl) baseModuleName() string {
1644 return ctx.mod.ModuleBase.BaseModuleName()
1645}
1646
Logan Chienf3511742017-10-31 18:04:35 +08001647func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1648 return ctx.mod.getVndkExtendsModuleName()
1649}
1650
Logan Chiene274fc92019-12-03 11:18:32 -08001651func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001652 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001653}
1654
Colin Crosse07f2312020-08-13 11:24:56 -07001655func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001656 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001657}
1658
Dan Albertc8060532020-07-22 22:32:17 -07001659func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001660 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001661}
1662
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001663func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001664 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001665}
1666
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001667func (ctx *moduleContextImpl) nativeCoverage() bool {
1668 return ctx.mod.nativeCoverage()
1669}
1670
Colin Cross56a83212020-09-15 18:30:11 -07001671func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1672 return ctx.mod.DirectlyInAnyApex()
1673}
1674
Colin Cross95b07f22020-12-16 11:06:50 -08001675func (ctx *moduleContextImpl) isPreventInstall() bool {
1676 return ctx.mod.Properties.PreventInstall
1677}
1678
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001679func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1680 shared := &ctx.mod.sharedFlags
1681 if shared.flagsMap == nil {
1682 shared.numSharedFlags = 0
1683 shared.flagsMap = make(map[string]string)
1684 }
1685 return shared
1686}
1687
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001688func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1689 return ctx.mod.isCfiAssemblySupportEnabled()
1690}
1691
Colin Cross635c3b02016-05-18 15:37:25 -07001692func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001693 return &Module{
1694 hod: hod,
1695 multilib: multilib,
1696 }
1697}
1698
Colin Cross635c3b02016-05-18 15:37:25 -07001699func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001700 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001701 module.features = []feature{
1702 &tidyFeature{},
1703 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001704 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001705 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001706 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001707 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001708 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001709 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001710 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001711 module.afdo = &afdo{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001712 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001713 return module
1714}
1715
Colin Crossce75d2c2016-10-06 16:12:58 -07001716func (c *Module) Prebuilt() *android.Prebuilt {
1717 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1718 return p.prebuilt()
1719 }
1720 return nil
1721}
1722
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001723func (c *Module) IsPrebuilt() bool {
1724 return c.Prebuilt() != nil
1725}
1726
Colin Crossce75d2c2016-10-06 16:12:58 -07001727func (c *Module) Name() string {
1728 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001729 if p, ok := c.linker.(interface {
1730 Name(string) string
1731 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001732 name = p.Name(name)
1733 }
1734 return name
1735}
1736
Alex Light3d673592019-01-18 14:37:31 -08001737func (c *Module) Symlinks() []string {
1738 if p, ok := c.installer.(interface {
1739 symlinkList() []string
1740 }); ok {
1741 return p.symlinkList()
1742 }
1743 return nil
1744}
1745
Roland Levillainf89cd092019-07-29 16:22:59 +01001746func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1747 test, ok := c.linker.(testPerSrc)
1748 return ok && test.isAllTestsVariation()
1749}
1750
Chris Parsons216e10a2020-07-09 17:12:52 -04001751func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001752 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001753 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001754 }); ok {
1755 return p.dataPaths()
1756 }
1757 return nil
1758}
1759
Ivan Lozanof1868af2022-04-12 13:08:36 -04001760func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001761 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1762 // "current", it will append the VNDK version to the name suffix.
1763 var vndkVersion string
1764 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001765 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001766 if c.ProductSpecific() {
1767 // If the module is product specific with 'product_specific: true',
1768 // do not add a name suffix because it is a base module.
1769 return ""
1770 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001771 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
Matthew Maurer52af5b02021-05-27 10:01:36 -07001772 nameSuffix = ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001773 } else {
1774 vndkVersion = ctx.DeviceConfig().VndkVersion()
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001775 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001776 }
1777 if vndkVersion == "current" {
1778 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1779 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001780 if c.VndkVersion() != vndkVersion && c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001781 // add version suffix only if the module is using different vndk version than the
1782 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001783 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001784 }
1785 return nameSuffix
1786}
1787
Ivan Lozanof1868af2022-04-12 13:08:36 -04001788func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1789 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001790
1791 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001792 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001793 }
1794
Colin Cross127bb8b2020-12-16 16:46:01 -08001795 llndk := c.IsLlndk()
Colin Cross627280f2021-04-26 16:53:58 -07001796 if llndk || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001797 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1798 // added for product variant only when we have vendor and product variants with core
1799 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001800 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001801 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001802 subName += vendorPublicLibrarySuffix
1803 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001804 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1805 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001806 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001807 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001808 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001809 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001810 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001811 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001812 subName += RecoverySuffix
1813 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1814 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001815 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001816 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001817 }
Inseob Kim64c43952019-08-26 16:52:35 +09001818 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001819
1820 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001821}
1822
Chris Parsonsf874e462022-05-10 13:50:12 -04001823var _ android.MixedBuildBuildable = (*Module)(nil)
1824
1825func (c *Module) getBazelModuleLabel(ctx android.BaseModuleContext) string {
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001826 var bazelModuleLabel string
Liz Kammer35ca77e2021-12-22 15:31:40 -05001827 if c.typ() == fullLibrary && c.static() {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001828 // cc_library is a special case in bp2build; two targets are generated -- one for each
1829 // of the shared and static variants. The shared variant keeps the module name, but the
1830 // static variant uses a different suffixed name.
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001831 bazelModuleLabel = bazelLabelForStaticModule(ctx, c)
1832 } else {
1833 bazelModuleLabel = c.GetBazelLabel(ctx, c)
Chris Parsonsf874e462022-05-10 13:50:12 -04001834 }
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001835 labelNoPrebuilt := bazelModuleLabel
1836 if c.IsPrebuilt() {
1837 labelNoPrebuilt = android.RemoveOptionalPrebuiltPrefixFromBazelLabel(bazelModuleLabel)
1838 }
1839 return labelNoPrebuilt
Chris Parsonsf874e462022-05-10 13:50:12 -04001840}
1841
1842func (c *Module) QueueBazelCall(ctx android.BaseModuleContext) {
1843 c.bazelHandler.QueueBazelCall(ctx, c.getBazelModuleLabel(ctx))
1844}
1845
1846func (c *Module) IsMixedBuildSupported(ctx android.BaseModuleContext) bool {
1847 return c.bazelHandler != nil
1848}
1849
1850func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) {
1851 bazelModuleLabel := c.getBazelModuleLabel(ctx)
1852
1853 c.bazelHandler.ProcessBazelQueryResponse(ctx, bazelModuleLabel)
1854
1855 c.Properties.SubName = GetSubnameProperty(ctx, c)
1856 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1857 if !apexInfo.IsForPlatform() {
1858 c.hideApexVariantFromMake = true
Chris Parsons77acf2e2021-12-03 17:27:16 -05001859 }
Liz Kammer35ca77e2021-12-22 15:31:40 -05001860
Chris Parsonsf874e462022-05-10 13:50:12 -04001861 c.makeLinkType = GetMakeLinkType(ctx, c)
1862
1863 mctx := &moduleContext{
1864 ModuleContext: ctx,
1865 moduleContextImpl: moduleContextImpl{
1866 mod: c,
1867 },
Chris Parsons8d6e4332021-02-22 16:13:50 -05001868 }
Chris Parsonsf874e462022-05-10 13:50:12 -04001869 mctx.ctx = mctx
1870
1871 c.maybeInstall(mctx, apexInfo)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001872}
1873
1874func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05001875 // Handle the case of a test module split by `test_per_src` mutator.
1876 //
1877 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1878 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1879 // module and return early, as this module does not produce an output file per se.
1880 if c.IsTestPerSrcAllTestsVariation() {
1881 c.outputFile = android.OptionalPath{}
1882 return
1883 }
1884
Ivan Lozanof1868af2022-04-12 13:08:36 -04001885 c.Properties.SubName = GetSubnameProperty(actx, c)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001886 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1887 if !apexInfo.IsForPlatform() {
1888 c.hideApexVariantFromMake = true
1889 }
1890
Chris Parsonseefc9e62021-04-02 17:36:47 -04001891 c.makeLinkType = GetMakeLinkType(actx, c)
1892
Colin Crossca860ac2016-01-04 14:34:37 -08001893 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001894 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001895 moduleContextImpl: moduleContextImpl{
1896 mod: c,
1897 },
1898 }
1899 ctx.ctx = ctx
1900
Colin Crossf18e1102017-11-16 14:33:08 -08001901 deps := c.depsToPaths(ctx)
1902 if ctx.Failed() {
1903 return
1904 }
1905
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001906 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1907 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00001908 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
1909 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001910 }
1911
Colin Crossca860ac2016-01-04 14:34:37 -08001912 flags := Flags{
1913 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001914 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001915 }
Colin Crossca860ac2016-01-04 14:34:37 -08001916 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001917 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001918 }
1919 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001920 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001921 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001922 if c.stl != nil {
1923 flags = c.stl.flags(ctx, flags)
1924 }
Colin Cross16b23492016-01-06 14:41:07 -08001925 if c.sanitize != nil {
1926 flags = c.sanitize.flags(ctx, flags)
1927 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001928 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001929 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001930 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001931 if c.fuzzer != nil {
1932 flags = c.fuzzer.flags(ctx, flags)
1933 }
Stephen Craneba090d12017-05-09 15:44:35 -07001934 if c.lto != nil {
1935 flags = c.lto.flags(ctx, flags)
1936 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001937 if c.afdo != nil {
1938 flags = c.afdo.flags(ctx, flags)
1939 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001940 if c.pgo != nil {
1941 flags = c.pgo.flags(ctx, flags)
1942 }
Colin Crossca860ac2016-01-04 14:34:37 -08001943 for _, feature := range c.features {
1944 flags = feature.flags(ctx, flags)
1945 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001946 if ctx.Failed() {
1947 return
1948 }
1949
Colin Cross4af21ed2019-11-04 09:37:55 -08001950 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1951 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1952 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001953
Colin Cross4af21ed2019-11-04 09:37:55 -08001954 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001955
1956 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001957 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001958 }
1959 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001960 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001961 }
1962
Colin Cross3e5e7782022-06-17 22:17:05 +00001963 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
1964
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001965 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001966 // We need access to all the flags seen by a source file.
1967 if c.sabi != nil {
1968 flags = c.sabi.flags(ctx, flags)
1969 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001970
Colin Cross4af21ed2019-11-04 09:37:55 -08001971 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001972
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001973 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001974 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001975 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001976 if ctx.Failed() {
1977 return
1978 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001979 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07001980 c.objFiles = objs.objFiles
1981 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001982 }
1983
Colin Crossca860ac2016-01-04 14:34:37 -08001984 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001985 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001986 if ctx.Failed() {
1987 return
1988 }
Colin Cross635c3b02016-05-18 15:37:25 -07001989 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001990
Chris Parsons94a0bba2021-06-04 15:03:47 -04001991 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001992
Jose Galmes6f843bc2020-12-11 13:36:29 -08001993 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
1994 // RECOVERY_SNAPSHOT_VERSION is current.
1995 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001996 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001997 i.collectHeadersForSnapshot(ctx)
1998 }
1999 }
Colin Crossce75d2c2016-10-06 16:12:58 -07002000 }
Colin Cross5049f022015-03-18 13:28:46 -07002001
Chris Parsons94a0bba2021-06-04 15:03:47 -04002002 c.maybeInstall(ctx, apexInfo)
2003}
2004
2005func (c *Module) maybeUnhideFromMake() {
2006 // If a lib is directly included in any of the APEXes or is not available to the
2007 // platform (which is often the case when the stub is provided as a prebuilt),
2008 // unhide the stubs variant having the latest version gets visible to make. In
2009 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2010 // force anything in the make world to link against the stubs library. (unless it
2011 // is explicitly referenced via .bootstrap suffix or the module is marked with
2012 // 'bootstrap: true').
2013 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
2014 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
2015 c.IsStubs() && !c.InVendorRamdisk() {
2016 c.Properties.HideFromMake = false // unhide
2017 // Note: this is still non-installable
2018 }
2019}
2020
2021func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002022 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002023 // If the module has been specifically configure to not be installed then
2024 // hide from make as otherwise it will break when running inside make
2025 // as the output path to install will not be specified. Not all uninstallable
2026 // modules can be hidden from make as some are needed for resolving make side
2027 // dependencies.
2028 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002029 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002030 c.SkipInstall()
2031 }
2032
2033 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2034 // to allow using the outputs in a genrule.
2035 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002036 c.installer.install(ctx, c.outputFile.Path())
2037 if ctx.Failed() {
2038 return
Colin Crossca860ac2016-01-04 14:34:37 -08002039 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002040 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002041}
2042
Colin Cross0ea8ba82019-06-06 14:33:29 -07002043func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002044 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002045 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002046 }
Colin Crossca860ac2016-01-04 14:34:37 -08002047 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002048}
2049
Colin Crossca860ac2016-01-04 14:34:37 -08002050func (c *Module) begin(ctx BaseModuleContext) {
2051 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002052 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002053 }
Colin Crossca860ac2016-01-04 14:34:37 -08002054 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002055 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002056 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002057 if c.stl != nil {
2058 c.stl.begin(ctx)
2059 }
Colin Cross16b23492016-01-06 14:41:07 -08002060 if c.sanitize != nil {
2061 c.sanitize.begin(ctx)
2062 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002063 if c.coverage != nil {
2064 c.coverage.begin(ctx)
2065 }
Stephen Craneba090d12017-05-09 15:44:35 -07002066 if c.lto != nil {
2067 c.lto.begin(ctx)
2068 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002069 if c.afdo != nil {
2070 c.afdo.begin(ctx)
2071 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002072 if c.pgo != nil {
2073 c.pgo.begin(ctx)
2074 }
Dan Albert92fe7402020-07-15 13:33:30 -07002075 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002076 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002077 if err != nil {
2078 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002079 c.Properties.Sdk_version = nil
2080 } else {
2081 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002082 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002083 }
Colin Crossca860ac2016-01-04 14:34:37 -08002084}
2085
Colin Cross37047f12016-12-13 17:06:13 -08002086func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002087 deps := Deps{}
2088
2089 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002090 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002091 }
2092 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002093 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002094 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002095 if c.stl != nil {
2096 deps = c.stl.deps(ctx, deps)
2097 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002098 if c.coverage != nil {
2099 deps = c.coverage.deps(ctx, deps)
2100 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002101
Colin Crossb6715442017-10-24 11:13:31 -07002102 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2103 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2104 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2105 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2106 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2107 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002108 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002109
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002110 for _, lib := range deps.ReexportSharedLibHeaders {
2111 if !inList(lib, deps.SharedLibs) {
2112 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2113 }
2114 }
2115
2116 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002117 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2118 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 -07002119 }
2120 }
2121
Colin Cross5950f382016-12-13 12:50:57 -08002122 for _, lib := range deps.ReexportHeaderLibHeaders {
2123 if !inList(lib, deps.HeaderLibs) {
2124 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2125 }
2126 }
2127
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002128 for _, gen := range deps.ReexportGeneratedHeaders {
2129 if !inList(gen, deps.GeneratedHeaders) {
2130 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2131 }
2132 }
2133
Colin Crossc99deeb2016-04-11 15:06:20 -07002134 return deps
2135}
2136
Dan Albert7e9d2952016-08-04 13:02:36 -07002137func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002138 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002139 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002140 moduleContextImpl: moduleContextImpl{
2141 mod: c,
2142 },
2143 }
2144 ctx.ctx = ctx
2145
Colin Crossca860ac2016-01-04 14:34:37 -08002146 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002147}
2148
Jiyong Park7ed9de32018-10-15 22:25:07 +09002149// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002150func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002151 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2152 version := name[sharp+1:]
2153 libname := name[:sharp]
2154 return libname, version
2155 }
2156 return name, ""
2157}
2158
Dan Albert92fe7402020-07-15 13:33:30 -07002159func GetCrtVariations(ctx android.BottomUpMutatorContext,
2160 m LinkableInterface) []blueprint.Variation {
2161 if ctx.Os() != android.Android {
2162 return nil
2163 }
2164 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002165 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2166 minSdkVersion := m.MinSdkVersion()
2167 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2168 minSdkVersion = m.SdkVersion()
2169 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002170 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2171 if err != nil {
2172 ctx.PropertyErrorf("min_sdk_version", err.Error())
2173 }
Dan Albert92fe7402020-07-15 13:33:30 -07002174 return []blueprint.Variation{
2175 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002176 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002177 }
2178 }
2179 return []blueprint.Variation{
2180 {Mutator: "sdk", Variation: ""},
2181 }
2182}
2183
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002184func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2185 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002186
2187 variations = append([]blueprint.Variation(nil), variations...)
2188
Liz Kammer23942242022-04-08 15:41:00 -04002189 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002190 // Version is explicitly specified. i.e. libFoo#30
2191 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002192 if tag, ok := depTag.(libraryDependencyTag); ok {
2193 tag.explicitlyVersioned = true
2194 } else {
2195 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2196 }
Colin Crosse7257d22020-09-24 09:56:18 -07002197 }
Colin Crosse7257d22020-09-24 09:56:18 -07002198
Colin Cross0de8a1e2020-09-18 14:15:30 -07002199 if far {
2200 ctx.AddFarVariationDependencies(variations, depTag, name)
2201 } else {
2202 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002203 }
2204}
2205
Kiyoung Kim487689e2022-07-26 09:48:22 +09002206func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2207 apiImportInfo := multitree.ApiImportInfo{}
2208
2209 if c.Device() {
2210 var apiImportModule []blueprint.Module
2211 if actx.OtherModuleExists("api_imports") {
2212 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2213 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
2214 apiInfo := actx.OtherModuleProvider(apiImportModule[0], multitree.ApiImportsProvider).(multitree.ApiImportInfo)
2215 apiImportInfo = apiInfo
2216 actx.SetProvider(multitree.ApiImportsProvider, apiInfo)
2217 }
2218 }
2219 }
2220
2221 return apiImportInfo
2222}
2223
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002224func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002225 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002226 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002227 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002228 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2229 // between the modules in the snapshot and the snapshot itself.
2230 var snapshotModule []blueprint.Module
2231 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2232 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2233 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2234 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2235 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002236 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002237 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2238 *snapshotInfo = &snapshot
2239 // republish the snapshot for use in later mutators on this module
2240 actx.SetProvider(SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002241 }
2242 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002243 if *snapshotInfo == nil {
2244 *snapshotInfo = &SnapshotInfo{}
2245 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002246 return **snapshotInfo
2247}
2248
Kiyoung Kim487689e2022-07-26 09:48:22 +09002249func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2250 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002251 return snapshot
2252 }
2253
2254 return lib
2255}
2256
2257// RewriteLibs takes a list of names of shared libraries and scans it for three types
2258// of names:
2259//
2260// 1. Name of an NDK library that refers to a prebuilt module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002261//
2262// For each of these, it adds the name of the prebuilt module (which will be in
2263// prebuilts/ndk) to the list of nonvariant libs.
2264//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002265// 2. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002266//
2267// For each of these, it adds the name of the ndk_library module to the list of
2268// variant libs.
2269//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002270// 3. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002271//
2272// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002273//
2274// The caller can then know to add the variantLibs dependencies differently from the
2275// nonvariantLibs
2276func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2277 variantLibs = []string{}
2278
2279 nonvariantLibs = []string{}
2280 for _, entry := range list {
2281 // strip #version suffix out
2282 name, _ := StubsLibNameAndVersion(entry)
2283 if c.InRecovery() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002284 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002285 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2286 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2287 } else if c.UseVndk() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002288 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002289 } else {
2290 // put name#version back
2291 nonvariantLibs = append(nonvariantLibs, entry)
2292 }
2293 }
2294 return nonvariantLibs, variantLibs
2295}
2296
Kiyoung Kim487689e2022-07-26 09:48:22 +09002297func updateDepsWithApiImports(deps Deps, apiImports multitree.ApiImportInfo) Deps {
2298 for idx, lib := range deps.SharedLibs {
2299 deps.SharedLibs[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
2300 }
2301
2302 for idx, lib := range deps.LateSharedLibs {
2303 deps.LateSharedLibs[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
2304 }
2305
2306 for idx, lib := range deps.RuntimeLibs {
2307 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
2308 }
2309
Kiyoung Kim51279d32022-08-24 14:10:46 +09002310 for idx, lib := range deps.SystemSharedLibs {
2311 deps.SystemSharedLibs[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002312 }
Kiyoung Kim51279d32022-08-24 14:10:46 +09002313
2314 for idx, lib := range deps.ReexportSharedLibHeaders {
2315 deps.ReexportSharedLibHeaders[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
2316 }
2317
Kiyoung Kim487689e2022-07-26 09:48:22 +09002318 return deps
2319}
2320
Colin Cross1e676be2016-10-12 14:38:15 -07002321func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002322 if !c.Enabled() {
2323 return
2324 }
2325
Colin Cross37047f12016-12-13 17:06:13 -08002326 ctx := &depsContext{
2327 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002328 moduleContextImpl: moduleContextImpl{
2329 mod: c,
2330 },
2331 }
2332 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002333
Colin Crossc99deeb2016-04-11 15:06:20 -07002334 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002335
Kiyoung Kim487689e2022-07-26 09:48:22 +09002336 apiImportInfo := GetApiImports(c, actx)
2337 deps = updateDepsWithApiImports(deps, apiImportInfo)
2338
Yo Chiang219968c2020-09-22 18:45:04 +08002339 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2340
Colin Crosse0edaf92021-01-11 17:31:17 -08002341 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002342
Dan Albert914449f2016-06-17 16:45:24 -07002343 variantNdkLibs := []string{}
2344 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002345 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002346 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2347 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2348 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002349
2350 for idx, lib := range deps.RuntimeLibs {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002351 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002352 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002353 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002354
Colin Cross32ec36c2016-12-15 07:39:51 -08002355 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002356 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002357 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002358 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002359 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002360
Kiyoung Kim51279d32022-08-24 14:10:46 +09002361 // Check header lib replacement from API surface first, and then check again with VSDK
2362 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002363 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002364
Spandan Das73bcafc2022-08-18 23:26:00 +00002365 if c.isNDKStubLibrary() {
2366 // ndk_headers do not have any variations
2367 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002368 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002369 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002370 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002371 } else {
2372 actx.AddVariationDependencies(nil, depTag, lib)
2373 }
2374 }
2375
Dan Albertf1d14c72020-07-30 14:32:55 -07002376 if c.isNDKStubLibrary() {
2377 // NDK stubs depend on their implementation because the ABI dumps are
2378 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002379 apiImportName := c.BaseModuleName() + multitree.GetApiImportSuffix()
2380
2381 // If original library exists as imported API, set dependency on the imported library
2382 if actx.OtherModuleExists(apiImportName) {
2383 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2384 c.ImageVariation(),
2385 blueprint.Variation{Mutator: "link", Variation: "shared"},
2386 ), stubImplementation, apiImportName)
2387 } else {
2388 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2389 c.ImageVariation(),
2390 blueprint.Variation{Mutator: "link", Variation: "shared"},
2391 ), stubImplementation, c.BaseModuleName())
2392 }
Dan Albertf1d14c72020-07-30 14:32:55 -07002393 }
2394
Inseob Kim07def122020-11-23 14:43:02 +09002395 // sysprop_library has to support both C++ and Java. So sysprop_library internally creates one
2396 // C++ implementation library and one Java implementation library. When a module links against
2397 // sysprop_library, the C++ implementation library has to be linked. syspropImplLibraries is a
2398 // map from sysprop_library to implementation library; it will be used in whole_static_libs,
2399 // static_libs, and shared_libs.
Inseob Kimc0907f12019-02-08 21:00:45 +09002400 syspropImplLibraries := syspropImplLibraries(actx.Config())
2401
Jiyong Park5d1598f2019-02-25 22:14:17 +09002402 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002403 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09002404 if impl, ok := syspropImplLibraries[lib]; ok {
2405 lib = impl
2406 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002407
Kiyoung Kim487689e2022-07-26 09:48:22 +09002408 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002409
Jiyong Park5d1598f2019-02-25 22:14:17 +09002410 actx.AddVariationDependencies([]blueprint.Variation{
2411 {Mutator: "link", Variation: "static"},
2412 }, depTag, lib)
2413 }
2414
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002415 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002416 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002417 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002418 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002419 }
Jiyong Parke3867542020-12-03 17:28:25 +09002420 if inList(lib, deps.ExcludeLibsForApex) {
2421 depTag.excludeInApex = true
2422 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002423
2424 if impl, ok := syspropImplLibraries[lib]; ok {
2425 lib = impl
2426 }
2427
Kiyoung Kim487689e2022-07-26 09:48:22 +09002428 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002429
Dan Willemsen59339a22018-07-22 21:18:45 -07002430 actx.AddVariationDependencies([]blueprint.Variation{
2431 {Mutator: "link", Variation: "static"},
2432 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002433 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002434
Jooyung Han75568392020-03-20 04:29:24 +09002435 // staticUnwinderDep is treated as staticDep for Q apexes
2436 // so that native libraries/binaries are linked with static unwinder
2437 // because Q libc doesn't have unwinder APIs
2438 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002439 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002440 actx.AddVariationDependencies([]blueprint.Variation{
2441 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002442 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002443 }
2444
Jiyong Park7ed9de32018-10-15 22:25:07 +09002445 // shared lib names without the #version suffix
2446 var sharedLibNames []string
2447
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002448 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002449 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002450 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002451 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002452 }
Jiyong Parke3867542020-12-03 17:28:25 +09002453 if inList(lib, deps.ExcludeLibsForApex) {
2454 depTag.excludeInApex = true
2455 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002456
2457 if impl, ok := syspropImplLibraries[lib]; ok {
2458 lib = impl
2459 }
2460
Jiyong Park73c54ee2019-10-22 20:31:18 +09002461 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002462 sharedLibNames = append(sharedLibNames, name)
2463
Colin Crosse7257d22020-09-24 09:56:18 -07002464 variations := []blueprint.Variation{
2465 {Mutator: "link", Variation: "shared"},
2466 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002467 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002468 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002469
Colin Crossfe9acfe2021-06-14 16:13:03 -07002470 for _, lib := range deps.LateStaticLibs {
2471 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2472 actx.AddVariationDependencies([]blueprint.Variation{
2473 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002474 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Crossfe9acfe2021-06-14 16:13:03 -07002475 }
2476
Colin Cross3e5e7782022-06-17 22:17:05 +00002477 for _, lib := range deps.UnexportedStaticLibs {
2478 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2479 actx.AddVariationDependencies([]blueprint.Variation{
2480 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002481 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Cross3e5e7782022-06-17 22:17:05 +00002482 }
2483
Jiyong Park7ed9de32018-10-15 22:25:07 +09002484 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002485 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002486 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2487 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2488 // linking against both the stubs lib and the non-stubs lib at the same time.
2489 continue
2490 }
Colin Cross6e511a92020-07-27 21:26:48 -07002491 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002492 variations := []blueprint.Variation{
2493 {Mutator: "link", Variation: "shared"},
2494 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002495 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002496 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002497
Dan Willemsen59339a22018-07-22 21:18:45 -07002498 actx.AddVariationDependencies([]blueprint.Variation{
2499 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002500 }, dataLibDepTag, deps.DataLibs...)
2501
Colin Crossc8caa062021-09-24 16:50:14 -07002502 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2503
Chris Parsons79d66a52020-06-05 17:26:16 -04002504 actx.AddVariationDependencies([]blueprint.Variation{
2505 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002506 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002507
Colin Cross68861832016-07-08 10:41:41 -07002508 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002509
2510 for _, gen := range deps.GeneratedHeaders {
2511 depTag := genHeaderDepTag
2512 if inList(gen, deps.ReexportGeneratedHeaders) {
2513 depTag = genHeaderExportDepTag
2514 }
2515 actx.AddDependency(c, depTag, gen)
2516 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002517
Dan Albert92fe7402020-07-15 13:33:30 -07002518 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002519 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002520 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002521 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002522 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002523 }
Colin Crossc465efd2021-06-11 18:00:04 -07002524 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002525 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002526 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002527 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002528 if deps.DynamicLinker != "" {
2529 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002530 }
Dan Albert914449f2016-06-17 16:45:24 -07002531
2532 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002533
2534 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002535 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002536 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002537 {Mutator: "link", Variation: "shared"},
2538 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002539
2540 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002541 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002542 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002543 {Mutator: "link", Variation: "shared"},
2544 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002545
2546 if vndkdep := c.vndkdep; vndkdep != nil {
2547 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002548 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002549 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002550 {Mutator: "link", Variation: "shared"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002551 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002552 }
2553 }
Colin Cross6362e272015-10-29 15:25:03 -07002554}
Colin Cross21b9a242015-03-24 14:15:58 -07002555
Colin Crosse40b4ea2018-10-02 22:25:58 -07002556func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002557 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2558 c.beginMutator(ctx)
2559 }
2560}
2561
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002562// Whether a module can link to another module, taking into
2563// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002564func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002565 tag blueprint.DependencyTag) {
2566
2567 switch t := tag.(type) {
2568 case dependencyTag:
2569 if t != vndkExtDepTag {
2570 return
2571 }
2572 case libraryDependencyTag:
2573 default:
2574 return
2575 }
2576
Ivan Lozanof9e21722020-12-02 09:00:51 -05002577 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002578 // Host code is not restricted
2579 return
2580 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002581
2582 // VNDK is cc.Module supported only for now.
2583 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002584 // Though allowed dependency is limited by the image mutator,
2585 // each vendor and product module needs to check link-type
2586 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002587 if ccTo, ok := to.(*Module); ok {
2588 if ccFrom.vndkdep != nil {
2589 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2590 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002591 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002592 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002593 }
2594 return
2595 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002596 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002597 // Platform code can link to anything
2598 return
2599 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002600 if from.InRamdisk() {
2601 // Ramdisk code is not NDK
2602 return
2603 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002604 if from.InVendorRamdisk() {
2605 // Vendor ramdisk code is not NDK
2606 return
2607 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002608 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002609 // Recovery code is not NDK
2610 return
2611 }
Colin Cross31076b32020-10-23 17:22:06 -07002612 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002613 if c.NdkPrebuiltStl() {
2614 // These are allowed, but they don't set sdk_version
2615 return
2616 }
2617 if c.StubDecorator() {
2618 // These aren't real libraries, but are the stub shared libraries that are included in
2619 // the NDK.
2620 return
2621 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002622 }
Logan Chien834b9a62019-01-14 15:39:03 +08002623
Ivan Lozano52767be2019-10-18 14:49:46 -07002624 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002625 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2626 // to link to libc++ (non-NDK and without sdk_version).
2627 return
2628 }
2629
Ivan Lozano52767be2019-10-18 14:49:46 -07002630 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002631 // NDK code linking to platform code is never okay.
2632 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002633 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002634 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002635 }
2636
2637 // At this point we know we have two NDK libraries, but we need to
2638 // check that we're not linking against anything built against a higher
2639 // API level, as it is only valid to link against older or equivalent
2640 // APIs.
2641
Inseob Kim01a28722018-04-11 09:48:45 +09002642 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002643 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002644 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002645 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002646 // Current can't be linked against by anything else.
2647 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002648 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002649 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002650 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002651 if err != nil {
2652 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002653 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002654 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002655 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002656 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002657 if err != nil {
2658 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002659 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002660 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002661 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002662
Inseob Kim01a28722018-04-11 09:48:45 +09002663 if toApi > fromApi {
2664 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002665 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002666 }
2667 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002668 }
Dan Albert202fe492017-12-15 13:56:59 -08002669
2670 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002671 fromStl := from.SelectedStl()
2672 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002673 if fromStl == "" || toStl == "" {
2674 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002675 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002676 // We can be permissive with the system "STL" since it is only the C++
2677 // ABI layer, but in the future we should make sure that everyone is
2678 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002679 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002680 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002681 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2682 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002683 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002684}
2685
Jooyung Han479ca172020-10-19 18:51:07 +09002686func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2687 if c, ok := ctx.Module().(*Module); ok {
2688 ctx.VisitDirectDeps(func(dep android.Module) {
2689 depTag := ctx.OtherModuleDependencyTag(dep)
2690 ccDep, ok := dep.(LinkableInterface)
2691 if ok {
2692 checkLinkType(ctx, c, ccDep, depTag)
2693 }
2694 })
2695 }
2696}
2697
Jiyong Park5fb8c102018-04-09 12:03:06 +09002698// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002699// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2700// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002701// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002702func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2703 check := func(child, parent android.Module) bool {
2704 to, ok := child.(*Module)
2705 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002706 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002707 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002708
Jooyung Hana70f0672019-01-18 15:20:43 +09002709 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2710 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002711 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002712
Jiyong Park0474e1f2021-01-14 14:26:06 +09002713 // These dependencies are not excercised at runtime. Tracking these will give us
2714 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002715 depTag := ctx.OtherModuleDependencyTag(child)
2716 if IsHeaderDepTag(depTag) {
2717 return false
2718 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002719 if depTag == staticVariantTag {
2720 return false
2721 }
2722 if depTag == stubImplDepTag {
2723 return false
2724 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002725
Justin Yun63e9ec72020-10-29 16:49:43 +09002726 // Even if target lib has no vendor variant, keep checking dependency
2727 // graph in case it depends on vendor_available or product_available
2728 // but not double_loadable transtively.
2729 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002730 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002731 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002732
Jiyong Park0474e1f2021-01-14 14:26:06 +09002733 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2734 // one.
2735 if Bool(to.VendorProperties.Double_loadable) {
2736 return true
2737 }
2738
Ivan Lozanod7586b62021-04-01 09:49:36 -04002739 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002740 return false
2741 }
2742
Jooyung Hana70f0672019-01-18 15:20:43 +09002743 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2744 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002745 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002746 return false
2747 }
2748 if module, ok := ctx.Module().(*Module); ok {
2749 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002750 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002751 ctx.WalkDeps(check)
2752 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002753 }
2754 }
2755}
2756
Colin Crossc99deeb2016-04-11 15:06:20 -07002757// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002758func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002759 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002760
Colin Cross0de8a1e2020-09-18 14:15:30 -07002761 var directStaticDeps []StaticLibraryInfo
2762 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002763
Colin Cross0de8a1e2020-09-18 14:15:30 -07002764 reexportExporter := func(exporter FlagExporterInfo) {
2765 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2766 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2767 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2768 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2769 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002770 }
2771
Jooyung Hande34d232020-07-23 13:04:15 +09002772 // For the dependency from platform to apex, use the latest stubs
2773 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002774 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2775 if !apexInfo.IsForPlatform() {
Jiyong Park4eab21d2021-04-15 15:17:54 +09002776 c.apexSdkVersion = apexInfo.MinSdkVersion
Jooyung Hande34d232020-07-23 13:04:15 +09002777 }
2778
2779 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2780 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2781 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2782 // (b/144430859)
2783 c.apexSdkVersion = android.FutureApiLevel
2784 }
2785
Colin Crossd11fcda2017-10-23 17:59:01 -07002786 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002787 depName := ctx.OtherModuleName(dep)
2788 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002789
Dan Willemsen47450072021-10-19 20:24:49 -07002790 if depTag == android.DarwinUniversalVariantTag {
2791 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
2792 return
2793 }
2794
Ivan Lozano52767be2019-10-18 14:49:46 -07002795 ccDep, ok := dep.(LinkableInterface)
2796 if !ok {
2797
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002798 // handling for a few module types that aren't cc Module but that are also supported
2799 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002800 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002801 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002802 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2803 genRule.GeneratedSourceFiles()...)
2804 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002805 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002806 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002807 // Support exported headers from a generated_sources dependency
2808 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002809 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002810 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002811 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002812 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002813 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002814 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002815 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002816 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002817 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2818 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002819 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002820 // 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 +09002821 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002822
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002823 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002824 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002825 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002826 }
Colin Crosscef792e2021-06-11 18:01:26 -07002827 case CrtBeginDepTag:
2828 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
2829 case CrtEndDepTag:
2830 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08002831 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002832 return
2833 }
2834
Colin Crossfe17f6f2019-03-28 19:30:56 -07002835 if depTag == android.ProtoPluginDepTag {
2836 return
2837 }
2838
Colin Crossd11fcda2017-10-23 17:59:01 -07002839 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002840 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2841 return
2842 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002843 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002844 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2845 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002846 return
2847 }
2848
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002849 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07002850 // Skip reused objects for stub libraries, they use their own stub object file instead.
2851 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
2852 // version mutator, so the stubs variant is created from the shared variant that
2853 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07002854 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07002855 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2856 objs := staticAnalogue.ReuseObjects
2857 depPaths.Objs = depPaths.Objs.Append(objs)
2858 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2859 reexportExporter(depExporterInfo)
2860 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002861 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002862 }
2863
Colin Cross6e511a92020-07-27 21:26:48 -07002864 linkFile := ccDep.OutputFile()
2865
2866 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2867 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002868 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002869 return
2870 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002871
Jiyong Parke3867542020-12-03 17:28:25 +09002872 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
2873 return
2874 }
2875
Colin Cross0de8a1e2020-09-18 14:15:30 -07002876 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002877
Colin Cross6e511a92020-07-27 21:26:48 -07002878 var ptr *android.Paths
2879 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002880
Colin Cross6e511a92020-07-27 21:26:48 -07002881 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002882
Colin Cross6e511a92020-07-27 21:26:48 -07002883 switch {
2884 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08002885 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
2886 if !ctx.Config().AllowMissingDependencies() {
2887 ctx.ModuleErrorf("module %q is not a header library", depName)
2888 } else {
2889 ctx.AddMissingDependencies([]string{depName})
2890 }
2891 return
2892 }
Colin Cross6e511a92020-07-27 21:26:48 -07002893 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002894 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2895 if !ctx.Config().AllowMissingDependencies() {
2896 ctx.ModuleErrorf("module %q is not a shared library", depName)
2897 } else {
2898 ctx.AddMissingDependencies([]string{depName})
2899 }
2900 return
2901 }
Jiyong Parke3867542020-12-03 17:28:25 +09002902
Jiyong Park7d55b612021-06-11 17:22:09 +09002903 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
2904 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07002905
Jiyong Park1ad8e162020-12-01 23:40:09 +09002906 // Stubs lib doesn't link to the shared lib dependencies. Don't set
2907 // linkFile, depFile, and ptr.
2908 if c.IsStubs() {
2909 break
2910 }
2911
Colin Cross0de8a1e2020-09-18 14:15:30 -07002912 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2913 depFile = sharedLibraryInfo.TableOfContents
2914
Colin Cross6e511a92020-07-27 21:26:48 -07002915 ptr = &depPaths.SharedLibs
2916 switch libDepTag.Order {
2917 case earlyLibraryDependency:
2918 ptr = &depPaths.EarlySharedLibs
2919 depPtr = &depPaths.EarlySharedLibsDeps
2920 case normalLibraryDependency:
2921 ptr = &depPaths.SharedLibs
2922 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002923 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002924 case lateLibraryDependency:
2925 ptr = &depPaths.LateSharedLibs
2926 depPtr = &depPaths.LateSharedLibsDeps
2927 default:
2928 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002929 }
Colin Cross6e511a92020-07-27 21:26:48 -07002930 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002931 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2932 if !ctx.Config().AllowMissingDependencies() {
2933 ctx.ModuleErrorf("module %q is not a static library", depName)
2934 } else {
2935 ctx.AddMissingDependencies([]string{depName})
2936 }
2937 return
2938 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002939
2940 // Stubs lib doesn't link to the static lib dependencies. Don't set
2941 // linkFile, depFile, and ptr.
2942 if c.IsStubs() {
2943 break
2944 }
2945
Colin Cross0de8a1e2020-09-18 14:15:30 -07002946 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2947 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002948 if libDepTag.wholeStatic {
2949 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002950 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2951 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002952 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002953 // This case normally catches prebuilt static
2954 // libraries, but it can also occur when
2955 // AllowMissingDependencies is on and the
2956 // dependencies has no sources of its own
2957 // but has a whole_static_libs dependency
2958 // on a missing library. We want to depend
2959 // on the .a file so that there is something
2960 // in the dependency tree that contains the
2961 // error rule for the missing transitive
2962 // dependency.
2963 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002964 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08002965 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
2966 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07002967 } else {
2968 switch libDepTag.Order {
2969 case earlyLibraryDependency:
2970 panic(fmt.Errorf("early static libs not suppported"))
2971 case normalLibraryDependency:
2972 // static dependencies will be handled separately so they can be ordered
2973 // using transitive dependencies.
2974 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002975 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002976 case lateLibraryDependency:
2977 ptr = &depPaths.LateStaticLibs
2978 default:
2979 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002980 }
2981 }
Colin Cross3e5e7782022-06-17 22:17:05 +00002982 if libDepTag.unexportedSymbols {
2983 depPaths.LdFlags = append(depPaths.LdFlags,
2984 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
2985 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002986 }
2987
Colin Cross6e511a92020-07-27 21:26:48 -07002988 if libDepTag.static() && !libDepTag.wholeStatic {
2989 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2990 ctx.ModuleErrorf("module %q not a static library", depName)
2991 return
2992 }
Logan Chien43d34c32017-12-20 01:17:32 +08002993
Colin Cross6e511a92020-07-27 21:26:48 -07002994 // When combining coverage files for shared libraries and executables, coverage files
2995 // in static libraries act as if they were whole static libraries. The same goes for
2996 // source based Abi dump files.
2997 if c, ok := ccDep.(*Module); ok {
2998 staticLib := c.linker.(libraryInterface)
2999 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3000 staticLib.objs().coverageFiles...)
3001 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3002 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003003 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003004 // Handle non-CC modules here
3005 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003006 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003007 }
3008 }
3009
Colin Cross6e511a92020-07-27 21:26:48 -07003010 if ptr != nil {
3011 if !linkFile.Valid() {
3012 if !ctx.Config().AllowMissingDependencies() {
3013 ctx.ModuleErrorf("module %q missing output file", depName)
3014 } else {
3015 ctx.AddMissingDependencies([]string{depName})
3016 }
3017 return
3018 }
3019 *ptr = append(*ptr, linkFile.Path())
3020 }
3021
3022 if depPtr != nil {
3023 dep := depFile
3024 if !dep.Valid() {
3025 dep = linkFile
3026 }
3027 *depPtr = append(*depPtr, dep.Path())
3028 }
3029
Colin Cross0de8a1e2020-09-18 14:15:30 -07003030 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3031 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3032 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3033 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3034
3035 if libDepTag.reexportFlags {
3036 reexportExporter(depExporterInfo)
3037 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3038 // Re-exported shared library headers must be included as well since they can help us with type information
3039 // about template instantiations (instantiated from their headers).
3040 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
3041 // scripts.
3042 c.sabi.Properties.ReexportedIncludes = append(
3043 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3044 }
3045
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003046 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003047 switch {
3048 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003049 c.Properties.AndroidMkHeaderLibs = append(
3050 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003051 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003052 if lib := moduleLibraryInterface(dep); lib != nil {
3053 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003054 // Add the dependency to the APEX(es) providing the library so that
3055 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07003056 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09003057 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003058 c.Properties.ApexesProvidingSharedLibs = append(
3059 c.Properties.ApexesProvidingSharedLibs, an)
3060 }
3061 }
3062 }
3063
3064 // Note: the order of libs in this list is not important because
3065 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003066 c.Properties.AndroidMkSharedLibs = append(
3067 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003068 // Record BaseLibName for snapshots.
3069 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003070 case libDepTag.static():
3071 if libDepTag.wholeStatic {
3072 c.Properties.AndroidMkWholeStaticLibs = append(
3073 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3074 } else {
3075 c.Properties.AndroidMkStaticLibs = append(
3076 c.Properties.AndroidMkStaticLibs, makeLibName)
3077 }
Justin Yun5e035862021-06-29 20:50:37 +09003078 // Record BaseLibName for snapshots.
3079 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003080 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003081 } else if !c.IsStubs() {
3082 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3083
Colin Cross6e511a92020-07-27 21:26:48 -07003084 switch depTag {
3085 case runtimeDepTag:
3086 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003087 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003088 // Record BaseLibName for snapshots.
3089 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003090 case objDepTag:
3091 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3092 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003093 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003094 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003095 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003096 case dynamicLinkerDepTag:
3097 depPaths.DynamicLinker = linkFile
3098 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003099 }
Colin Crossca860ac2016-01-04 14:34:37 -08003100 })
3101
Jeff Gaston294356f2017-09-27 17:05:30 -07003102 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003103 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3104 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3105 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003106
Colin Crossdd84e052017-05-17 13:44:16 -07003107 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003108 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003109 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3110 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003111 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003112 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3113 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003114 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003115 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003116 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003117
3118 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003119 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003120 }
Colin Crossdd84e052017-05-17 13:44:16 -07003121
Colin Crossca860ac2016-01-04 14:34:37 -08003122 return depPaths
3123}
3124
Jiyong Park7d55b612021-06-11 17:22:09 +09003125// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3126// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3127// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3128// has different level of updatability. For example, if a library foo in an APEX depends on a
3129// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3130// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3131// same APEX as foo, the non-stub variant of bar is used.
3132func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3133 depName := ctx.OtherModuleName(dep)
3134 depTag := ctx.OtherModuleDependencyTag(dep)
3135 libDepTag, ok := depTag.(libraryDependencyTag)
3136 if !ok || !libDepTag.shared() {
3137 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3138 }
3139
3140 thisModule, ok := ctx.Module().(android.ApexModule)
3141 if !ok {
3142 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3143 }
3144
3145 useVndk := false
3146 bootstrap := false
3147 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3148 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3149 } else {
3150 useVndk = linkable.UseVndk()
3151 bootstrap = linkable.Bootstrap()
3152 }
3153
3154 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
3155 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3156 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
3157 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
3158
3159 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
3160 useStubs := false
3161
3162 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3163 if !apexInfo.IsForPlatform() {
3164 // For platform libraries, use current version of LLNDK
3165 // If this is for use_vendor apex we will apply the same rules
3166 // of apex sdk enforcement below to choose right version.
3167 useStubs = true
3168 }
Jiyong Park9477c262021-06-22 20:23:05 +09003169 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3170 // If not building for APEX or the containing APEX allows the use of
3171 // platform APIs, use stubs only when it is from an APEX (and not from
3172 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3173 // bootstrap modules, always link to non-stub variant
Jiyong Park7d55b612021-06-11 17:22:09 +09003174 useStubs = dep.(android.ApexModule).NotInPlatform() && !bootstrap
3175 if useStubs {
3176 // Another exception: if this module is a test for an APEX, then
3177 // it is linked with the non-stub variant of a module in the APEX
3178 // as if this is part of the APEX.
3179 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
3180 for _, apexContents := range testFor.ApexContents {
3181 if apexContents.DirectlyInApex(depName) {
3182 useStubs = false
3183 break
3184 }
3185 }
3186 }
3187 if useStubs {
3188 // Yet another exception: If this module and the dependency are
3189 // available to the same APEXes then skip stubs between their
3190 // platform variants. This complements the test_for case above,
3191 // which avoids the stubs on a direct APEX library dependency, by
3192 // avoiding stubs for indirect test dependencies as well.
3193 //
3194 // TODO(b/183882457): This doesn't work if the two libraries have
3195 // only partially overlapping apex_available. For that test_for
3196 // modules would need to be split into APEX variants and resolved
3197 // separately for each APEX they have access to.
3198 if android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3199 useStubs = false
3200 }
3201 }
3202 } else {
3203 // If building for APEX, use stubs when the parent is in any APEX that
3204 // the child is not in.
3205 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3206 }
3207
3208 // when to use (unspecified) stubs, use the latest one.
3209 if useStubs {
3210 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3211 toUse := stubs[len(stubs)-1]
3212 sharedLibraryInfo = toUse.SharedLibraryInfo
3213 depExporterInfo = toUse.FlagExporterInfo
3214 }
3215 }
3216 return sharedLibraryInfo, depExporterInfo
3217}
3218
Colin Cross0de8a1e2020-09-18 14:15:30 -07003219// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3220// to match the topological order of the dependency tree, including any static analogues of
3221// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3222// of the transitive dependencies.
3223func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
3224 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
3225 var staticPaths android.Paths
3226 for _, staticDep := range staticDeps {
3227 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3228 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3229 }
3230 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003231 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3232 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003233 }
3234 }
3235 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3236
3237 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3238
3239 // reorder the dependencies based on transitive dependencies
3240 staticPaths = android.FirstUniquePaths(staticPaths)
3241 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3242
3243 if len(orderedStaticPaths) != len(staticPaths) {
3244 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3245 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3246 }
3247
3248 return orderedStaticPaths, transitiveStaticLibs
3249}
3250
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003251// BaseLibName trims known prefixes and suffixes
3252func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003253 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3254 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003255 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003256 return libName
3257}
3258
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003259func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003260 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003261 ccDepModule, _ := ccDep.(*Module)
3262 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003263 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003264
Justin Yuncbca3732021-02-03 19:24:13 +09003265 if ccDepModule != nil {
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003266 // TODO(ivanlozano) Support snapshots for Rust-produced C library variants.
Colin Cross6e511a92020-07-27 21:26:48 -07003267 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003268 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003269 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003270
Ivan Lozanod1dec542021-05-26 15:33:11 -04003271 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003272 }
3273 }
3274
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003275 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3276 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003277 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3278 // core module instead.
3279 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003280 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003281 // The vendor and product modules in Make will have been renamed to not conflict with the
3282 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003283 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003284 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003285 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003286 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003287 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003288 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003289 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003290 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003291 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003292 } else {
3293 return libName
3294 }
3295}
3296
Colin Crossca860ac2016-01-04 14:34:37 -08003297func (c *Module) InstallInData() bool {
3298 if c.installer == nil {
3299 return false
3300 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003301 return c.installer.inData()
3302}
3303
3304func (c *Module) InstallInSanitizerDir() bool {
3305 if c.installer == nil {
3306 return false
3307 }
3308 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003309 return true
3310 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003311 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003312}
3313
Yifan Hong1b3348d2020-01-21 15:53:22 -08003314func (c *Module) InstallInRamdisk() bool {
3315 return c.InRamdisk()
3316}
3317
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003318func (c *Module) InstallInVendorRamdisk() bool {
3319 return c.InVendorRamdisk()
3320}
3321
Jiyong Parkf9332f12018-02-01 00:54:12 +09003322func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003323 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003324}
3325
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003326func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003327 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003328 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003329 return
3330 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003331 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003332}
3333
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003334func (c *Module) HostToolPath() android.OptionalPath {
3335 if c.installer == nil {
3336 return android.OptionalPath{}
3337 }
3338 return c.installer.hostToolPath()
3339}
3340
Nan Zhangd4e641b2017-07-12 12:55:28 -07003341func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3342 return c.outputFile
3343}
3344
Colin Cross41955e82019-05-29 14:40:35 -07003345func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3346 switch tag {
3347 case "":
3348 if c.outputFile.Valid() {
3349 return android.Paths{c.outputFile.Path()}, nil
3350 }
3351 return android.Paths{}, nil
3352 default:
3353 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003354 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003355}
3356
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003357func (c *Module) static() bool {
3358 if static, ok := c.linker.(interface {
3359 static() bool
3360 }); ok {
3361 return static.static()
3362 }
3363 return false
3364}
3365
Jiyong Park379de2f2018-12-19 02:47:14 +09003366func (c *Module) staticBinary() bool {
3367 if static, ok := c.linker.(interface {
3368 staticBinary() bool
3369 }); ok {
3370 return static.staticBinary()
3371 }
3372 return false
3373}
3374
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003375func (c *Module) testBinary() bool {
3376 if test, ok := c.linker.(interface {
3377 testBinary() bool
3378 }); ok {
3379 return test.testBinary()
3380 }
3381 return false
3382}
3383
Jingwen Chen537242c2022-08-24 11:53:27 +00003384func (c *Module) testLibrary() bool {
3385 if test, ok := c.linker.(interface {
3386 testLibrary() bool
3387 }); ok {
3388 return test.testLibrary()
3389 }
3390 return false
3391}
3392
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003393func (c *Module) benchmarkBinary() bool {
3394 if b, ok := c.linker.(interface {
3395 benchmarkBinary() bool
3396 }); ok {
3397 return b.benchmarkBinary()
3398 }
3399 return false
3400}
3401
3402func (c *Module) fuzzBinary() bool {
3403 if f, ok := c.linker.(interface {
3404 fuzzBinary() bool
3405 }); ok {
3406 return f.fuzzBinary()
3407 }
3408 return false
3409}
3410
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003411// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3412func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003413 if h, ok := c.linker.(interface {
3414 header() bool
3415 }); ok {
3416 return h.header()
3417 }
3418 return false
3419}
3420
Ivan Lozanod7586b62021-04-01 09:49:36 -04003421func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003422 if b, ok := c.linker.(interface {
3423 binary() bool
3424 }); ok {
3425 return b.binary()
3426 }
3427 return false
3428}
3429
Justin Yun5e035862021-06-29 20:50:37 +09003430func (c *Module) StaticExecutable() bool {
3431 if b, ok := c.linker.(*binaryDecorator); ok {
3432 return b.static()
3433 }
3434 return false
3435}
3436
Ivan Lozanod7586b62021-04-01 09:49:36 -04003437func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003438 if o, ok := c.linker.(interface {
3439 object() bool
3440 }); ok {
3441 return o.object()
3442 }
3443 return false
3444}
3445
Ivan Lozanof9e21722020-12-02 09:00:51 -05003446func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003447 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003448 if c.IsLlndk() {
3449 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003450 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003451 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003452 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003453 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003454 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003455 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003456 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003457 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003458 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003459 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003460 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003461 return "native:product"
3462 }
Jooyung Han38002912019-05-16 04:01:54 +09003463 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003464 } else if c.InRamdisk() {
3465 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003466 } else if c.InVendorRamdisk() {
3467 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003468 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003469 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003470 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003471 return "native:ndk:none:none"
3472 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3473 //family, link := getNdkStlFamilyAndLinkType(c)
3474 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003475 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003476 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003477 } else {
3478 return "native:platform"
3479 }
3480}
3481
Jiyong Park9d452992018-10-03 00:38:19 +09003482// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003483// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003484func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003485 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003486 // Stub libs and prebuilt libs in a versioned SDK are not
3487 // installable to APEX even though they are shared libs.
Colin Cross31076b32020-10-23 17:22:06 -07003488 return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01003489 } else if _, ok := c.linker.(testPerSrc); ok {
3490 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003491 }
3492 return false
3493}
3494
Jiyong Parka90ca002019-10-07 15:47:24 +09003495func (c *Module) AvailableFor(what string) bool {
3496 if linker, ok := c.linker.(interface {
3497 availableFor(string) bool
3498 }); ok {
3499 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3500 } else {
3501 return c.ApexModuleBase.AvailableFor(what)
3502 }
3503}
3504
Jiyong Park62304bb2020-04-13 16:19:48 +09003505func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003506 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003507}
3508
Paul Duffin0cb37b92020-03-04 14:52:46 +00003509func (c *Module) EverInstallable() bool {
3510 return c.installer != nil &&
3511 // Check to see whether the module is actually ever installable.
3512 c.installer.everInstallable()
3513}
3514
Ivan Lozanod7586b62021-04-01 09:49:36 -04003515func (c *Module) PreventInstall() bool {
3516 return c.Properties.PreventInstall
3517}
3518
3519func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003520 if c.library != nil {
3521 if i := c.library.installable(); i != nil {
3522 return i
3523 }
3524 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003525 return c.Properties.Installable
3526}
3527
3528func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003529 ret := c.EverInstallable() &&
3530 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003531 proptools.BoolDefault(c.Installable(), true) &&
3532 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003533
3534 // The platform variant doesn't need further condition. Apex variants however might not
3535 // be installable because it will likely to be included in the APEX and won't appear
3536 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003537 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003538 return ret
3539 }
3540
3541 // Special case for modules that are configured to be installed to /data, which includes
3542 // test modules. For these modules, both APEX and non-APEX variants are considered as
3543 // installable. This is because even the APEX variants won't be included in the APEX, but
3544 // will anyway be installed to /data/*.
3545 // See b/146995717
3546 if c.InstallInData() {
3547 return ret
3548 }
3549
3550 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003551}
3552
Logan Chien41eabe62019-04-10 13:33:58 +08003553func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3554 if c.linker != nil {
3555 if library, ok := c.linker.(*libraryDecorator); ok {
3556 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3557 }
3558 }
3559}
3560
Jiyong Park45bf82e2020-12-15 22:29:02 +09003561var _ android.ApexModule = (*Module)(nil)
3562
3563// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003564func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003565 depTag := ctx.OtherModuleDependencyTag(dep)
3566 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3567
3568 if cc, ok := dep.(*Module); ok {
3569 if cc.HasStubsVariants() {
3570 if isLibDepTag && libDepTag.shared() {
3571 // dynamic dep to a stubs lib crosses APEX boundary
3572 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003573 }
Colin Cross6e511a92020-07-27 21:26:48 -07003574 if IsRuntimeDepTag(depTag) {
3575 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003576 return false
3577 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003578 }
Zhijun Heec285872021-04-24 10:47:08 -07003579 if cc.IsLlndk() {
3580 return false
3581 }
Colin Crossaac32222020-07-29 12:51:56 -07003582 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003583 // shared_lib dependency from a static lib is considered as crossing
3584 // the APEX boundary because the dependency doesn't actually is
3585 // linked; the dependency is used only during the compilation phase.
3586 return false
3587 }
Jiyong Parke3867542020-12-03 17:28:25 +09003588
3589 if isLibDepTag && libDepTag.excludeInApex {
3590 return false
3591 }
Colin Cross6e511a92020-07-27 21:26:48 -07003592 }
Colin Crossc1b36442021-05-06 13:42:48 -07003593 if depTag == stubImplDepTag {
3594 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003595 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003596 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003597 if depTag == staticVariantTag {
3598 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3599 // actually mean that the static lib (and its dependencies) are copied into the
3600 // APEX.
3601 return false
3602 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003603 return true
3604}
3605
Jiyong Park45bf82e2020-12-15 22:29:02 +09003606// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003607func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3608 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003609 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3610 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3611 return nil
3612 }
Jooyung Han749dc692020-04-15 11:03:39 +09003613 // We don't check for prebuilt modules
3614 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3615 return nil
3616 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003617
Jooyung Han749dc692020-04-15 11:03:39 +09003618 minSdkVersion := c.MinSdkVersion()
3619 if minSdkVersion == "apex_inherit" {
3620 return nil
3621 }
3622 if minSdkVersion == "" {
3623 // JNI libs within APK-in-APEX fall into here
3624 // Those are okay to set sdk_version instead
3625 // We don't have to check if this is a SDK variant because
3626 // non-SDK variant resets sdk_version, which works too.
3627 minSdkVersion = c.SdkVersion()
3628 }
Dan Albertc8060532020-07-22 22:32:17 -07003629 if minSdkVersion == "" {
3630 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3631 }
3632 // Not using nativeApiLevelFromUser because the context here is not
3633 // necessarily a native context.
3634 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003635 if err != nil {
3636 return err
3637 }
Dan Albertc8060532020-07-22 22:32:17 -07003638
3639 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003640 return fmt.Errorf("newer SDK(%v)", ver)
3641 }
3642 return nil
3643}
3644
Paul Duffinb5769c12021-05-12 16:16:51 +01003645// Implements android.ApexModule
3646func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3647 // stub libraries and native bridge libraries are always available to platform
3648 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3649}
3650
Jooyung Han91f92032022-02-04 12:36:33 +09003651// Overrides android.ApexModuleBase.UniqueApexVariations
3652func (c *Module) UniqueApexVariations() bool {
3653 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
3654 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
3655 // variation of the VNDK lib because APEX variations are merged/grouped.
3656 return c.UseVndk() && c.IsVndk()
3657}
3658
Rob Seymour925aa092021-08-10 20:42:03 +00003659var _ snapshot.RelativeInstallPath = (*Module)(nil)
3660
Liz Kammer35ca77e2021-12-22 15:31:40 -05003661type moduleType int
3662
3663const (
3664 unknownType moduleType = iota
3665 binary
3666 object
3667 fullLibrary
3668 staticLibrary
3669 sharedLibrary
3670 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00003671 testBin // testBinary already declared
Liz Kammer35ca77e2021-12-22 15:31:40 -05003672)
3673
3674func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00003675 if c.testBinary() {
3676 // testBinary is also a binary, so this comes before the c.Binary()
3677 // conditional. A testBinary has additional implicit dependencies and
3678 // other test-only semantics.
3679 return testBin
3680 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003681 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003682 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003683 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00003684 } else if c.testLibrary() {
3685 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
3686 // will let them add implicit compile deps on gtest, for example.
3687 //
3688 // For now, treat them as regular shared libraries.
3689 return sharedLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003690 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05003691 static := false
3692 shared := false
3693 if library, ok := c.linker.(*libraryDecorator); ok {
3694 static = library.MutatedProperties.BuildStatic
3695 shared = library.MutatedProperties.BuildShared
3696 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
3697 static = library.MutatedProperties.BuildStatic
3698 shared = library.MutatedProperties.BuildShared
3699 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003700 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003701 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003702 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003703 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003704 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003705 return staticLibrary
3706 }
3707 return sharedLibrary
3708 }
3709 return unknownType
3710}
3711
3712// ConvertWithBp2build converts Module to Bazel for bp2build.
3713func (c *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
3714 prebuilt := c.IsPrebuilt()
3715 switch c.typ() {
3716 case binary:
3717 if !prebuilt {
Jingwen Chen537242c2022-08-24 11:53:27 +00003718 binaryBp2build(ctx, c)
3719 }
3720 case testBin:
3721 if !prebuilt {
3722 testBinaryBp2build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05003723 }
3724 case object:
3725 if !prebuilt {
3726 objectBp2Build(ctx, c)
3727 }
3728 case fullLibrary:
3729 if !prebuilt {
3730 libraryBp2Build(ctx, c)
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00003731 } else {
3732 prebuiltLibraryBp2Build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05003733 }
3734 case headerLibrary:
3735 libraryHeadersBp2Build(ctx, c)
3736 case staticLibrary:
Liz Kammer35ca77e2021-12-22 15:31:40 -05003737 if prebuilt {
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00003738 prebuiltLibraryStaticBp2Build(ctx, c, false)
Liz Kammer35ca77e2021-12-22 15:31:40 -05003739 } else {
3740 sharedOrStaticLibraryBp2Build(ctx, c, true)
3741 }
3742 case sharedLibrary:
3743 if prebuilt {
3744 prebuiltLibrarySharedBp2Build(ctx, c)
3745 } else {
3746 sharedOrStaticLibraryBp2Build(ctx, c, false)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003747 }
3748 }
3749}
3750
Colin Crosscfad1192015-11-02 16:43:11 -08003751// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08003752type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07003753 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07003754 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09003755 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08003756}
3757
Patrice Arrudac249c712019-03-19 17:00:29 -07003758// cc_defaults provides a set of properties that can be inherited by other cc
3759// modules. A module can use the properties from a cc_defaults using
3760// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3761// merged (when possible) by prepending the default module's values to the
3762// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003763func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003764 return DefaultsFactory()
3765}
3766
Colin Cross36242852017-06-23 15:06:31 -07003767func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003768 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003769
Colin Cross36242852017-06-23 15:06:31 -07003770 module.AddProperties(props...)
3771 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003772 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003773 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003774 &BaseCompilerProperties{},
3775 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003776 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003777 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003778 &StaticProperties{},
3779 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003780 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003781 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00003782 &TestLinkerProperties{},
3783 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003784 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003785 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07003786 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003787 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003788 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003789 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003790 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003791 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003792 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003793 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003794 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003795 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08003796 &AfdoProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003797 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003798 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003799 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3800 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07003801 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003802 )
Colin Crosscfad1192015-11-02 16:43:11 -08003803
Jooyung Hancc372c52019-09-25 15:18:44 +09003804 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003805
3806 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003807}
3808
Jiyong Park2286afd2020-06-16 21:58:53 +09003809func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02003810 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09003811}
3812
Kiyoung Kim51279d32022-08-24 14:10:46 +09003813func (c *Module) isImportedApiLibrary() bool {
3814 _, ok := c.linker.(*apiLibraryDecorator)
3815 return ok
3816}
3817
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003818func kytheExtractAllFactory() android.Singleton {
3819 return &kytheExtractAllSingleton{}
3820}
3821
3822type kytheExtractAllSingleton struct {
3823}
3824
3825func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3826 var xrefTargets android.Paths
3827 ctx.VisitAllModules(func(module android.Module) {
3828 if ccModule, ok := module.(xref); ok {
3829 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3830 }
3831 })
3832 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3833 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003834 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003835 }
3836}
3837
Jihoon Kangf78a8902022-09-01 22:47:07 +00003838func (c *Module) Partition() string {
3839 if p, ok := c.installer.(interface {
3840 getPartition() string
3841 }); ok {
3842 return p.getPartition()
3843 }
3844 return ""
3845}
3846
Colin Cross06a931b2015-10-28 17:23:31 -07003847var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003848var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003849var BoolPtr = proptools.BoolPtr
3850var String = proptools.String
3851var StringPtr = proptools.StringPtr