blob: 7b1e44b42048d91c9f8abbfcaafdb4a9924fa99a [file] [log] [blame]
Colin Cross5049f022015-03-18 13:28:46 -07001// Copyright 2015 Google Inc. All rights reserved.
Colin Cross3f40fa42015-01-30 17:27:36 -08002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file contains the module types for compiling C/C++ for Android, and converts the properties
18// into the flags and filenames necessary to pass to the compiler. The final creation of the rules
19// is handled in builder.go
20
21import (
Colin Cross41955e82019-05-29 14:40:35 -070022 "fmt"
Logan Chien41eabe62019-04-10 13:33:58 +080023 "io"
Dan Albert9e10cd42016-08-03 14:12:14 -070024 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080025 "strings"
26
Colin Cross97ba0732015-03-23 17:50:24 -070027 "github.com/google/blueprint"
Colin Cross06a931b2015-10-28 17:23:31 -070028 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070029
Colin Cross635c3b02016-05-18 15:37:25 -070030 "android/soong/android"
Colin Crossb98c8b02016-07-29 13:44:28 -070031 "android/soong/cc/config"
Colin Cross5049f022015-03-18 13:28:46 -070032 "android/soong/genrule"
Colin Cross3f40fa42015-01-30 17:27:36 -080033)
34
Colin Cross463a90e2015-06-17 14:20:06 -070035func init() {
Paul Duffin036e7002019-12-19 19:16:28 +000036 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -070037
Paul Duffin036e7002019-12-19 19:16:28 +000038 pctx.Import("android/soong/cc/config")
39}
40
41func RegisterCCBuildComponents(ctx android.RegistrationContext) {
42 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
43
44 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossc511bc52020-04-07 16:50:32 +000045 ctx.BottomUp("sdk", sdkMutator).Parallel()
Inseob Kim64c43952019-08-26 16:52:35 +090046 ctx.BottomUp("vndk", VndkMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070047 ctx.BottomUp("link", LinkageMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +010048 ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
Colin Crossd1f898e2020-08-18 18:35:15 -070049 ctx.BottomUp("version_selector", versionSelectorMutator).Parallel()
50 ctx.BottomUp("version", versionMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070051 ctx.BottomUp("begin", BeginMutator).Parallel()
Inseob Kimac1e9862019-12-09 18:15:47 +090052 ctx.BottomUp("sysprop_cc", SyspropMutator).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070053 })
Colin Cross16b23492016-01-06 14:41:07 -080054
Paul Duffin036e7002019-12-19 19:16:28 +000055 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Ivan Lozano3968d8f2020-12-14 11:27:52 -050056 ctx.TopDown("asan_deps", sanitizerDepsMutator(Asan))
57 ctx.BottomUp("asan", sanitizerMutator(Asan)).Parallel()
Colin Cross16b23492016-01-06 14:41:07 -080058
Tri Vo6eafc362021-04-01 11:29:09 -070059 ctx.TopDown("hwasan_deps", sanitizerDepsMutator(Hwasan))
60 ctx.BottomUp("hwasan", sanitizerMutator(Hwasan)).Parallel()
Evgenii Stepanovd97a6e92018-08-02 16:19:13 -070061
Ivan Lozano3968d8f2020-12-14 11:27:52 -050062 ctx.TopDown("fuzzer_deps", sanitizerDepsMutator(Fuzzer))
63 ctx.BottomUp("fuzzer", sanitizerMutator(Fuzzer)).Parallel()
Mitch Phillipsbfeade62019-05-01 14:42:05 -070064
Jiyong Park1d1119f2019-07-29 21:27:18 +090065 // cfi mutator shouldn't run before sanitizers that return true for
66 // incompatibleWithCfi()
Vishwath Mohanb743e9c2017-11-01 09:20:21 +000067 ctx.TopDown("cfi_deps", sanitizerDepsMutator(cfi))
68 ctx.BottomUp("cfi", sanitizerMutator(cfi)).Parallel()
69
Peter Collingbourne8c7e6e22018-11-19 16:03:58 -080070 ctx.TopDown("scs_deps", sanitizerDepsMutator(scs))
71 ctx.BottomUp("scs", sanitizerMutator(scs)).Parallel()
72
Colin Cross1e676be2016-10-12 14:38:15 -070073 ctx.TopDown("tsan_deps", sanitizerDepsMutator(tsan))
74 ctx.BottomUp("tsan", sanitizerMutator(tsan)).Parallel()
Dan Willemsen581341d2017-02-09 16:16:31 -080075
Colin Cross0b908332019-06-19 23:00:20 -070076 ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel()
Jiyong Park379de2f2018-12-19 02:47:14 +090077 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
Ivan Lozano30c5db22018-02-21 15:49:20 -080078
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -080079 ctx.BottomUp("coverage", coverageMutator).Parallel()
Stephen Craneba090d12017-05-09 15:44:35 -070080
81 ctx.TopDown("lto_deps", ltoDepsMutator)
82 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090083
Jooyung Han479ca172020-10-19 18:51:07 +090084 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090085 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070086 })
Colin Crossb98c8b02016-07-29 13:44:28 -070087
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080088 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
89 // sabi mutator needs to be run after apex mutator finishes.
90 ctx.TopDown("sabi_deps", sabiDepsMutator)
91 })
92
Colin Cross57898582020-10-29 18:25:19 -070093 ctx.RegisterSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070094}
95
Chris Parsonsef6e0cf2020-12-01 18:26:21 -050096// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
97// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
98// edges to these modules.
99// This object is constructed in DepsMutator, by calling to various module delegates to set
100// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
101// dependencies.
102// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
103// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800104type Deps struct {
105 SharedLibs, LateSharedLibs []string
106 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800107 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800108 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700109
Chris Parsons79d66a52020-06-05 17:26:16 -0400110 // Used for data dependencies adjacent to tests
111 DataLibs []string
112
Yo Chiang219968c2020-09-22 18:45:04 +0800113 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
114 SystemSharedLibs []string
115
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500116 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800117 StaticUnwinderIfLegacy bool
118
Colin Cross5950f382016-12-13 12:50:57 -0800119 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700120
Colin Cross81413472016-04-11 14:37:39 -0700121 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700122
Dan Willemsenb40aab62016-04-20 14:21:14 -0700123 GeneratedSources []string
124 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900125 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700126
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700127 ReexportGeneratedHeaders []string
128
Colin Cross97ba0732015-03-23 17:50:24 -0700129 CrtBegin, CrtEnd string
Dan Willemsena0790e32018-10-12 00:24:23 -0700130
131 // Used for host bionic
132 LinkerFlagsFile string
133 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900134
135 // List of libs that need to be excluded for APEX variant
136 ExcludeLibsForApex []string
Colin Crossc472d572015-03-17 15:06:21 -0700137}
138
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500139// PathDeps is a struct containing file paths to dependencies of a module.
140// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
141// It's used to construct flags for various build statements (such as for compiling and linking).
142// It is then passed to module decorator functions responsible for registering build statements
143// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800144type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700145 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900146 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700147 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900148 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700149 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700150 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700151
Colin Cross0de8a1e2020-09-18 14:15:30 -0700152 // Transitive static library dependencies of static libraries for use in ordering.
153 TranstiveStaticLibrariesForOrdering *android.DepSet
154
Colin Cross26c34ed2016-09-30 17:10:16 -0700155 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100156 Objs Objects
157 // Paths to .o files in dependencies that provide them. Note that these lists
158 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800159 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700160 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700161
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100162 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
163 // the libs from all whole_static_lib dependencies.
164 WholeStaticLibsFromPrebuilts android.Paths
165
Colin Cross26c34ed2016-09-30 17:10:16 -0700166 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700167 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900168 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700169
Inseob Kimd110f872019-12-06 13:15:38 +0900170 Flags []string
171 IncludeDirs android.Paths
172 SystemIncludeDirs android.Paths
173 ReexportedDirs android.Paths
174 ReexportedSystemDirs android.Paths
175 ReexportedFlags []string
176 ReexportedGeneratedHeaders android.Paths
177 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700178
Colin Cross26c34ed2016-09-30 17:10:16 -0700179 // Paths to crt*.o files
Colin Cross635c3b02016-05-18 15:37:25 -0700180 CrtBegin, CrtEnd android.OptionalPath
Dan Willemsena0790e32018-10-12 00:24:23 -0700181
182 // Path to the file container flags to use with the linker
183 LinkerFlagsFile android.OptionalPath
184
185 // Path to the dynamic linker binary
186 DynamicLinker android.OptionalPath
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700187}
188
Colin Cross4af21ed2019-11-04 09:37:55 -0800189// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
190// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
191// command line so they can be overridden by the local module flags).
192type LocalOrGlobalFlags struct {
193 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700194 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800195 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700196 CFlags []string // Flags that apply to C and C++ source files
197 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
198 ConlyFlags []string // Flags that apply to C source files
199 CppFlags []string // Flags that apply to C++ source files
200 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700201 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800202}
203
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500204// Flags contains various types of command line flags (and settings) for use in building build
205// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800206type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500207 // Local flags (which individual modules are responsible for). These may override global flags.
208 Local LocalOrGlobalFlags
209 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800210 Global LocalOrGlobalFlags
211
212 aidlFlags []string // Flags that apply to aidl source files
213 rsFlags []string // Flags that apply to renderscript source files
214 libFlags []string // Flags to add libraries early to the link order
215 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
216 TidyFlags []string // Flags that apply to clang-tidy
217 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700218
Colin Crossc3199482017-03-30 15:03:04 -0700219 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800220 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700221 SystemIncludeFlags []string
222
Oliver Nguyen04526782020-04-21 12:40:27 -0700223 Toolchain config.Toolchain
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500224 Tidy bool // True if clang-tidy is enabled.
225 GcovCoverage bool // True if coverage files should be generated.
226 SAbiDump bool // True if header abi dumps should be generated.
Oliver Nguyen04526782020-04-21 12:40:27 -0700227 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800228
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500229 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800230 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500231 // The target-device system path to the dynamic linker.
232 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800233
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700234 CFlagsDeps android.Paths // Files depended on by compiler flags
235 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800236
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500237 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700238 AssemblerWithCpp bool
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500239 // True if static libraries should be grouped (using `-Wl,--start-group` and `-Wl,--end-group`).
240 GroupStaticLibs bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800241
Colin Cross19878da2019-03-28 14:45:07 -0700242 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700243 protoC bool // Whether to use C instead of C++
244 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700245
246 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200247 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700248}
249
Colin Crossca860ac2016-01-04 14:34:37 -0800250// Properties used to compile all C or C++ modules
251type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700252 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800253 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700254
Jiyong Parkb35a8192020-08-10 15:59:36 +0900255 // The API level that this module is built against. The APIs of this API level will be
256 // visible at build time, but use of any APIs newer than min_sdk_version will render the
257 // module unloadable on older devices. In the future it will be possible to weakly-link new
258 // APIs, making the behavior match Java: such modules will load on older devices, but
259 // calling new APIs on devices that do not support them will result in a crash.
260 //
261 // This property has the same behavior as sdk_version does for Java modules. For those
262 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
263 // does for Java code.
264 //
265 // In addition, setting this property causes two variants to be built, one for the platform
266 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800267 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700268
Jiyong Parkb35a8192020-08-10 15:59:36 +0900269 // Minimum OS API level supported by this C or C++ module. This property becomes the value
270 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
271 // this property is also used to ensure that the min_sdk_version of the containing module is
272 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
273 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
274 // min_sdk_version of the containing APEX. When the module
275 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900276 Min_sdk_version *string
277
Colin Crossc511bc52020-04-07 16:50:32 +0000278 // If true, always create an sdk variant and don't create a platform variant.
279 Sdk_variant_only *bool
280
Jiyong Parkde866cb2018-12-07 23:08:36 +0900281 AndroidMkSharedLibs []string `blueprint:"mutated"`
282 AndroidMkStaticLibs []string `blueprint:"mutated"`
283 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
284 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700285 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900286 HideFromMake bool `blueprint:"mutated"`
287 PreventInstall bool `blueprint:"mutated"`
288 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700289
Yo Chiang219968c2020-09-22 18:45:04 +0800290 // Set by DepsMutator.
291 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
292
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200293 // The name of the image this module is built for, suffixed with a '.'
Justin Yun5f7f7e82019-11-18 19:52:14 +0900294 ImageVariationPrefix string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200295
296 // The VNDK version this module is built against. If empty, the module is not
297 // build against the VNDK.
298 VndkVersion string `blueprint:"mutated"`
299
300 // Suffix for the name of Android.mk entries generated by this module
301 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800302
303 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
304 // file
305 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900306
Yifan Hong39143a92020-10-26 12:43:12 -0700307 // Make this module available when building for ramdisk.
308 // On device without a dedicated recovery partition, the module is only
309 // available after switching root into
310 // /first_stage_ramdisk. To expose the module before switching root, install
311 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800312 Ramdisk_available *bool
313
Yifan Hong39143a92020-10-26 12:43:12 -0700314 // Make this module available when building for vendor ramdisk.
315 // On device without a dedicated recovery partition, the module is only
316 // available after switching root into
317 // /first_stage_ramdisk. To expose the module before switching root, install
318 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700319 Vendor_ramdisk_available *bool
320
Jiyong Parkf9332f12018-02-01 00:54:12 +0900321 // Make this module available when building for recovery
322 Recovery_available *bool
323
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200324 // Used by imageMutator, set by ImageMutatorBegin()
325 CoreVariantNeeded bool `blueprint:"mutated"`
326 RamdiskVariantNeeded bool `blueprint:"mutated"`
327 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
328 RecoveryVariantNeeded bool `blueprint:"mutated"`
329
330 // A list of variations for the "image" mutator of the form
331 //<image name> '.' <version char>, for example, 'vendor.S'
332 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900333
334 // Allows this module to use non-APEX version of libraries. Useful
335 // for building binaries that are started before APEXes are activated.
336 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900337
338 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
339 // see soong/cc/config/vndk.go
340 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900341
342 // Used by vendor snapshot to record dependencies from snapshot modules.
343 SnapshotSharedLibs []string `blueprint:"mutated"`
344 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000345
346 Installable *bool
Colin Crossc511bc52020-04-07 16:50:32 +0000347
348 // Set by factories of module types that can only be referenced from variants compiled against
349 // the SDK.
350 AlwaysSdk bool `blueprint:"mutated"`
351
352 // Variant is an SDK variant created by sdkMutator
353 IsSdkVariant bool `blueprint:"mutated"`
354 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
355 // variant to have a ".sdk" suffix.
356 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700357
358 // Normally Soong uses the directory structure to decide which modules
359 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800360 // different snapshots (vendor, recovery, etc.), but this property
361 // allows a partner to exclude a module normally thought of as a
362 // framework module from the vendor snapshot.
363 Exclude_from_vendor_snapshot *bool
364
365 // Normally Soong uses the directory structure to decide which modules
366 // should be included (framework) or excluded (non-framework) from the
367 // different snapshots (vendor, recovery, etc.), but this property
368 // allows a partner to exclude a module normally thought of as a
369 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800370 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900371
372 // List of APEXes that this module has private access to for testing purpose. The module
373 // can depend on libraries that are not exported by the APEXes and use private symbols
374 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000375 Test_for []string `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700376}
377
378type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900379 // whether this module should be allowed to be directly depended by other
380 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900381 // If set to true, two variants will be built separately, one like
382 // normal, and the other limited to the set of libraries and headers
383 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700384 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900385 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700386 // so it shouldn't have any unversioned runtime dependencies, or
387 // make assumptions about the system that may not be true in the
388 // future.
389 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900390 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900391 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900392 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900393 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900394 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700395 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
396 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900397
Justin Yunebcf0c52021-01-08 18:00:19 +0900398 // This is the same as the "vendor_available" except that the install path
399 // of the vendor variant is /odm or /vendor/odm.
400 // By replacing "vendor_available: true" with "odm_available: true", the
401 // module will install its vendor variant to the /odm partition or /vendor/odm.
402 // As the modules with "odm_available: true" still create the vendor variants,
403 // they can link to the other vendor modules as the vendor_available modules do.
404 // Also, the vendor modules can link to odm_available modules.
405 //
406 // It may not be used for VNDK modules.
407 Odm_available *bool
408
Justin Yun63e9ec72020-10-29 16:49:43 +0900409 // whether this module should be allowed to be directly depended by other
410 // modules with `product_specific: true` or `product_available: true`.
411 // If set to true, an additional product variant will be built separately
412 // that is limited to the set of libraries and headers that are exposed to
413 // /product modules.
414 //
415 // The product variant may be used with a different (newer) /system,
416 // so it shouldn't have any unversioned runtime dependencies, or
417 // make assumptions about the system that may not be true in the
418 // future.
419 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900420 // If set to false, this module becomes inaccessible from /product modules.
421 //
422 // Different from the 'vendor_available' property, the modules with
423 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
424 // library without 'product_available' may not be depended on by any other
425 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900426 //
427 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
428 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
429 Product_available *bool
430
Jiyong Park5fb8c102018-04-09 12:03:06 +0900431 // whether this module is capable of being loaded with other instance
432 // (possibly an older version) of the same module in the same process.
433 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
434 // can be double loaded in a vendor process if the library is also a
435 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
436 // explicitly marked as `double_loadable: true` by the owner, or the dependency
437 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
438 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800439
440 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
441 IsLLNDK bool `blueprint:"mutated"`
442
Colin Cross78212242021-01-06 14:51:30 -0800443 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
444 // set and the module is not listed in VndkMustUseVendorVariantList.
445 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
446
447 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
448 IsVNDKCore bool `blueprint:"mutated"`
449
450 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
451 IsVNDKSP bool `blueprint:"mutated"`
452
453 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
454 // module sets the llndk.private property.
455 IsVNDKPrivate bool `blueprint:"mutated"`
456
457 // IsVNDKProduct is set if a VNDK module sets the product_available property.
458 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700459
460 // IsVendorPublicLibrary is set for the core and product variants of a library that has
461 // vendor_public_library stubs.
462 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800463}
464
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500465// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
466// to understanding details about the type of the current module.
467// For example, one might call these functions to determine whether the current module is a static
468// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800469type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800470 static() bool
471 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700472 testBinary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900473 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900474 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900475 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700476 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900477 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700478 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800479 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900480 minSdkVersion() string
481 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700482 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700483 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800484 IsLlndk() bool
485 IsLlndkPublic() bool
486 isImplementationForLLNDKPublic() bool
487 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900488 isVndk() bool
489 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500490 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700491 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900492 inProduct() bool
493 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800494 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700495 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900496 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700497 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700498 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800499 getVndkExtendsModuleName() string
Yi Kong7e53c572018-02-14 18:16:12 +0800500 isPgoCompile() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800501 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800502 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800503 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700504 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700505 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900506 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800507 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700508 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700509 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800510 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800511 isCfiAssemblySupportEnabled() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800512}
513
514type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700515 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800516 ModuleContextIntf
517}
518
519type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700520 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800521 ModuleContextIntf
522}
523
Colin Cross37047f12016-12-13 17:06:13 -0800524type DepsContext interface {
525 android.BottomUpMutatorContext
526 ModuleContextIntf
527}
528
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500529// feature represents additional (optional) steps to building cc-related modules, such as invocation
530// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800531type feature interface {
532 begin(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800533 deps(ctx DepsContext, deps Deps) Deps
Colin Crossca860ac2016-01-04 14:34:37 -0800534 flags(ctx ModuleContext, flags Flags) Flags
535 props() []interface{}
536}
537
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500538// compiler is the interface for a compiler helper object. Different module decorators may implement
539// this helper differently. For example, compiling a `cc_library` may use a different build
540// statement than building a `toolchain_library`.
Colin Crossca860ac2016-01-04 14:34:37 -0800541type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700542 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800543 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800544 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700545 compilerProps() []interface{}
546
Colin Cross76fada02016-07-27 10:31:13 -0700547 appendCflags([]string)
548 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700549 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800550}
551
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500552// linker is the interface for a linker decorator object. Individual module types can provide
553// their own implementation for this decorator, and thus specify custom logic regarding build
554// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800555type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700556 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800557 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700558 linkerFlags(ctx ModuleContext, flags Flags) Flags
559 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800560 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700561
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700562 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700563 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900564 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700565
566 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900567 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000568
569 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000570 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
571}
572
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500573// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000574type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500575 sharedLibs []string
576 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
577 // libc, libm, etc.)
578 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800579}
580
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500581// installer is the interface for an installer helper object. This helper is responsible for
582// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800583type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700584 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700585 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000586 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800587 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700588 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700589 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900590 relativeInstallPath() string
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +0100591 makeUninstallable(mod *Module)
Colin Crossca860ac2016-01-04 14:34:37 -0800592}
593
Chris Parsons8d6e4332021-02-22 16:13:50 -0500594// bazelHandler is the interface for a helper object related to deferring to Bazel for
595// processing a module (during Bazel mixed builds). Individual module types should define
596// their own bazel handler if they support deferring to Bazel.
597type bazelHandler interface {
598 // Issue query to Bazel to retrieve information about Bazel's view of the current module.
599 // If Bazel returns this information, set module properties on the current module to reflect
600 // the returned information.
601 // Returns true if information was available from Bazel, false if bazel invocation still needs to occur.
602 generateBazelBuildActions(ctx android.ModuleContext, label string) bool
603}
604
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800605type xref interface {
606 XrefCcFiles() android.Paths
607}
608
Colin Cross6e511a92020-07-27 21:26:48 -0700609type libraryDependencyKind int
610
611const (
612 headerLibraryDependency = iota
613 sharedLibraryDependency
614 staticLibraryDependency
615)
616
617func (k libraryDependencyKind) String() string {
618 switch k {
619 case headerLibraryDependency:
620 return "headerLibraryDependency"
621 case sharedLibraryDependency:
622 return "sharedLibraryDependency"
623 case staticLibraryDependency:
624 return "staticLibraryDependency"
625 default:
626 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
627 }
628}
629
630type libraryDependencyOrder int
631
632const (
633 earlyLibraryDependency = -1
634 normalLibraryDependency = 0
635 lateLibraryDependency = 1
636)
637
638func (o libraryDependencyOrder) String() string {
639 switch o {
640 case earlyLibraryDependency:
641 return "earlyLibraryDependency"
642 case normalLibraryDependency:
643 return "normalLibraryDependency"
644 case lateLibraryDependency:
645 return "lateLibraryDependency"
646 default:
647 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
648 }
649}
650
651// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
652// tags that have a set of predefined tag objects that are reused for each dependency, a
653// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
654// That means that comparing a libraryDependencyTag for equality will only be equal if all
655// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
656// then check individual metadata fields instead.
657type libraryDependencyTag struct {
658 blueprint.BaseDependencyTag
659
660 // These are exported so that fmt.Printf("%#v") can call their String methods.
661 Kind libraryDependencyKind
662 Order libraryDependencyOrder
663
664 wholeStatic bool
665
666 reexportFlags bool
667 explicitlyVersioned bool
668 dataLib bool
669 ndk bool
670
671 staticUnwinder bool
672
673 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900674
Cindy Zhou18417cb2020-12-10 07:12:38 -0800675 // Whether or not this dependency should skip the apex dependency check
676 skipApexAllowedDependenciesCheck bool
677
Jiyong Parke3867542020-12-03 17:28:25 +0900678 // Whether or not this dependency has to be followed for the apex variants
679 excludeInApex bool
Colin Cross6e511a92020-07-27 21:26:48 -0700680}
681
682// header returns true if the libraryDependencyTag is tagging a header lib dependency.
683func (d libraryDependencyTag) header() bool {
684 return d.Kind == headerLibraryDependency
685}
686
687// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
688func (d libraryDependencyTag) shared() bool {
689 return d.Kind == sharedLibraryDependency
690}
691
692// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
693func (d libraryDependencyTag) static() bool {
694 return d.Kind == staticLibraryDependency
695}
696
Colin Crosse9fe2942020-11-10 18:12:15 -0800697// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
698// binaries or other shared libraries are installed as dependencies.
699func (d libraryDependencyTag) InstallDepNeeded() bool {
700 return d.shared()
701}
702
703var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
704
705// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700706// libraryDependencyTag. Each tag object is created globally and reused for multiple
707// dependencies (although since the object contains no references, assigning a tag to a
708// variable and modifying it will not modify the original). Users can compare the tag
709// returned by ctx.OtherModuleDependencyTag against the global original
710type dependencyTag struct {
711 blueprint.BaseDependencyTag
712 name string
713}
714
Colin Crosse9fe2942020-11-10 18:12:15 -0800715// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
716// libraryDependencyTag, but where the dependency needs to be installed when the parent is
717// installed.
718type installDependencyTag struct {
719 blueprint.BaseDependencyTag
720 android.InstallAlwaysNeededDependencyTag
721 name string
722}
723
Colin Crossc99deeb2016-04-11 15:06:20 -0700724var (
Colin Cross6e511a92020-07-27 21:26:48 -0700725 genSourceDepTag = dependencyTag{name: "gen source"}
726 genHeaderDepTag = dependencyTag{name: "gen header"}
727 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
728 objDepTag = dependencyTag{name: "obj"}
729 linkerFlagsDepTag = dependencyTag{name: "linker flags file"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900730 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700731 reuseObjTag = dependencyTag{name: "reuse objects"}
732 staticVariantTag = dependencyTag{name: "static variant"}
733 vndkExtDepTag = dependencyTag{name: "vndk extends"}
734 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800735 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700736 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700737 stubImplDepTag = dependencyTag{name: "stub_impl"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700738)
739
Roland Levillainf89cd092019-07-29 16:22:59 +0100740func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700741 ccLibDepTag, ok := depTag.(libraryDependencyTag)
742 return ok && ccLibDepTag.shared()
743}
744
745func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
746 ccLibDepTag, ok := depTag.(libraryDependencyTag)
747 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100748}
749
Zach Johnson3df4e632020-11-06 11:56:27 -0800750func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
751 ccLibDepTag, ok := depTag.(libraryDependencyTag)
752 return ok && ccLibDepTag.header()
753}
754
Roland Levillainf89cd092019-07-29 16:22:59 +0100755func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800756 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100757}
758
759func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700760 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100761 return ok && ccDepTag == testPerSrcDepTag
762}
763
Colin Crossca860ac2016-01-04 14:34:37 -0800764// Module contains the properties and members used by all C/C++ module types, and implements
765// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500766// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
767// interface.
768//
769// To define a C/C++ related module, construct a new Module object and point its delegates to
770// type-specific structs. These delegates will be invoked to register module-specific build
771// statements which may be unique to the module type. For example, module.compiler.compile() should
772// be defined so as to register build statements which are responsible for compiling the module.
773//
774// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
775// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
776// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
777// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800778type Module struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700779 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -0700780 android.DefaultableModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +0900781 android.ApexModuleBase
Jiyong Parkd1063c12019-07-17 20:08:41 +0900782 android.SdkBase
Liz Kammerea6666f2021-02-17 10:17:28 -0500783 android.BazelModuleBase
Colin Crossc472d572015-03-17 15:06:21 -0700784
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700785 Properties BaseProperties
786 VendorProperties VendorProperties
Colin Crossfa138792015-04-24 17:31:52 -0700787
Colin Crossca860ac2016-01-04 14:34:37 -0800788 // initialize before calling Init
Colin Cross635c3b02016-05-18 15:37:25 -0700789 hod android.HostOrDeviceSupported
790 multilib android.Multilib
Colin Crossc472d572015-03-17 15:06:21 -0700791
Paul Duffina0843f62019-12-13 19:50:38 +0000792 // Allowable SdkMemberTypes of this module type.
793 sdkMemberTypes []android.SdkMemberType
794
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500795 // decorator delegates, initialize before calling Init
796 // these may contain module-specific implementations, and effectively allow for custom
797 // type-specific logic. These members may reference different objects or the same object.
798 // Functions of these decorators will be invoked to initialize and register type-specific
799 // build statements.
Chris Parsons8d6e4332021-02-22 16:13:50 -0500800 compiler compiler
801 linker linker
802 installer installer
803 bazelHandler bazelHandler
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500804
805 features []feature
806 stl *stl
807 sanitize *sanitize
808 coverage *coverage
809 sabi *sabi
810 vndkdep *vndkdep
811 lto *lto
812 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800813
Colin Cross31076b32020-10-23 17:22:06 -0700814 library libraryInterface
815
Colin Cross635c3b02016-05-18 15:37:25 -0700816 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800817
Colin Crossb98c8b02016-07-29 13:44:28 -0700818 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700819
820 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800821
822 // Flags used to compile this module
823 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700824
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800825 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700826 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900827
828 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800829 // Kythe (source file indexer) paths for this compilation module
830 kytheFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900831
832 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700833 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700834
835 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700836}
837
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500838func (c *Module) SetPreventInstall() {
839 c.Properties.PreventInstall = true
840}
841
842func (c *Module) SetHideFromMake() {
843 c.Properties.HideFromMake = true
844}
845
Ivan Lozanod7586b62021-04-01 09:49:36 -0400846func (c *Module) HiddenFromMake() bool {
847 return c.Properties.HideFromMake
848}
849
Ivan Lozano52767be2019-10-18 14:49:46 -0700850func (c *Module) Toc() android.OptionalPath {
851 if c.linker != nil {
852 if library, ok := c.linker.(libraryInterface); ok {
853 return library.toc()
854 }
855 }
856 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
857}
858
859func (c *Module) ApiLevel() string {
860 if c.linker != nil {
861 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700862 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700863 }
864 }
865 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
866}
867
868func (c *Module) Static() bool {
869 if c.linker != nil {
870 if library, ok := c.linker.(libraryInterface); ok {
871 return library.static()
872 }
873 }
874 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
875}
876
877func (c *Module) Shared() bool {
878 if c.linker != nil {
879 if library, ok := c.linker.(libraryInterface); ok {
880 return library.shared()
881 }
882 }
883 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
884}
885
886func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +0000887 if c.stl != nil {
888 return c.stl.Properties.SelectedStl
889 }
890 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -0700891}
892
893func (c *Module) ToolchainLibrary() bool {
894 if _, ok := c.linker.(*toolchainLibraryDecorator); ok {
895 return true
896 }
897 return false
898}
899
900func (c *Module) NdkPrebuiltStl() bool {
901 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
902 return true
903 }
904 return false
905}
906
907func (c *Module) StubDecorator() bool {
908 if _, ok := c.linker.(*stubDecorator); ok {
909 return true
910 }
911 return false
912}
913
914func (c *Module) SdkVersion() string {
915 return String(c.Properties.Sdk_version)
916}
917
Artur Satayev480e25b2020-04-27 18:53:18 +0100918func (c *Module) MinSdkVersion() string {
919 return String(c.Properties.Min_sdk_version)
920}
921
Dan Albert92fe7402020-07-15 13:33:30 -0700922func (c *Module) SplitPerApiLevel() bool {
Colin Cross1348ce32020-10-01 13:37:16 -0700923 if !c.canUseSdk() {
924 return false
925 }
Dan Albert92fe7402020-07-15 13:33:30 -0700926 if linker, ok := c.linker.(*objectLinker); ok {
927 return linker.isCrt()
928 }
929 return false
930}
931
Colin Crossc511bc52020-04-07 16:50:32 +0000932func (c *Module) AlwaysSdk() bool {
933 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
934}
935
Ivan Lozano183a3212019-10-18 14:18:45 -0700936func (c *Module) CcLibrary() bool {
937 if c.linker != nil {
938 if _, ok := c.linker.(*libraryDecorator); ok {
939 return true
940 }
Colin Crossd48fe732020-09-23 20:37:24 -0700941 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
942 return true
943 }
Ivan Lozano183a3212019-10-18 14:18:45 -0700944 }
945 return false
946}
947
948func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -0700949 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700950 return true
951 }
952 return false
953}
954
Ivan Lozano2b262972019-11-21 12:30:50 -0800955func (c *Module) NonCcVariants() bool {
956 return false
957}
958
Ivan Lozano183a3212019-10-18 14:18:45 -0700959func (c *Module) SetStatic() {
960 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700961 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700962 library.setStatic()
963 return
964 }
965 }
966 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
967}
968
969func (c *Module) SetShared() {
970 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700971 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700972 library.setShared()
973 return
974 }
975 }
976 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
977}
978
979func (c *Module) BuildStaticVariant() bool {
980 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700981 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700982 return library.buildStatic()
983 }
984 }
985 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
986}
987
988func (c *Module) BuildSharedVariant() bool {
989 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -0700990 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -0700991 return library.buildShared()
992 }
993 }
994 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
995}
996
997func (c *Module) Module() android.Module {
998 return c
999}
1000
Jiyong Parkc20eee32018-09-05 22:36:17 +09001001func (c *Module) OutputFile() android.OptionalPath {
1002 return c.outputFile
1003}
1004
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001005func (c *Module) CoverageFiles() android.Paths {
1006 if c.linker != nil {
1007 if library, ok := c.linker.(libraryInterface); ok {
1008 return library.objs().coverageFiles
1009 }
1010 }
1011 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1012}
1013
Ivan Lozano183a3212019-10-18 14:18:45 -07001014var _ LinkableInterface = (*Module)(nil)
1015
Jiyong Park719b4462019-01-13 00:39:51 +09001016func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001017 if c.linker != nil {
1018 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001019 }
1020 return nil
1021}
1022
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001023func (c *Module) CoverageOutputFile() android.OptionalPath {
1024 if c.linker != nil {
1025 return c.linker.coverageOutputFilePath()
1026 }
1027 return android.OptionalPath{}
1028}
1029
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001030func (c *Module) RelativeInstallPath() string {
1031 if c.installer != nil {
1032 return c.installer.relativeInstallPath()
1033 }
1034 return ""
1035}
1036
Jooyung Han344d5432019-08-23 11:17:39 +09001037func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001038 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001039}
1040
Colin Cross36242852017-06-23 15:06:31 -07001041func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001042 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -08001043 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001044 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001045 }
1046 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001047 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001048 }
1049 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001050 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001051 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001052 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001053 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001054 }
Colin Cross16b23492016-01-06 14:41:07 -08001055 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001056 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001057 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001058 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001059 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001060 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001061 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001062 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001063 }
Justin Yun8effde42017-06-23 19:24:43 +09001064 if c.vndkdep != nil {
1065 c.AddProperties(c.vndkdep.props()...)
1066 }
Stephen Craneba090d12017-05-09 15:44:35 -07001067 if c.lto != nil {
1068 c.AddProperties(c.lto.props()...)
1069 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001070 if c.pgo != nil {
1071 c.AddProperties(c.pgo.props()...)
1072 }
Colin Crossca860ac2016-01-04 14:34:37 -08001073 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001074 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001075 }
Colin Crossc472d572015-03-17 15:06:21 -07001076
Colin Cross36242852017-06-23 15:06:31 -07001077 android.InitAndroidArchModule(c, c.hod, c.multilib)
Liz Kammerea6666f2021-02-17 10:17:28 -05001078 android.InitBazelModule(c)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001079 android.InitApexModule(c)
Jiyong Parkd1063c12019-07-17 20:08:41 +09001080 android.InitSdkAwareModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001081 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001082
Colin Cross36242852017-06-23 15:06:31 -07001083 return c
Colin Crossc472d572015-03-17 15:06:21 -07001084}
1085
Colin Crossb916a382016-07-29 17:28:03 -07001086// Returns true for dependency roots (binaries)
1087// TODO(ccross): also handle dlopenable libraries
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001088func (c *Module) IsDependencyRoot() bool {
Colin Crossb916a382016-07-29 17:28:03 -07001089 if root, ok := c.linker.(interface {
1090 isDependencyRoot() bool
1091 }); ok {
1092 return root.isDependencyRoot()
1093 }
1094 return false
1095}
1096
Ivan Lozano52767be2019-10-18 14:49:46 -07001097func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001098 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001099}
1100
Colin Crossc511bc52020-04-07 16:50:32 +00001101func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001102 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1103 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001104}
1105
1106func (c *Module) UseSdk() bool {
1107 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001108 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001109 }
1110 return false
1111}
1112
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001113func (c *Module) isCoverageVariant() bool {
1114 return c.coverage.Properties.IsCoverageVariant
1115}
1116
Colin Cross95f1ca02020-10-29 20:47:22 -07001117func (c *Module) IsNdk(config android.Config) bool {
1118 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001119}
1120
Colin Cross127bb8b2020-12-16 16:46:01 -08001121func (c *Module) IsLlndk() bool {
1122 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001123}
1124
Colin Cross127bb8b2020-12-16 16:46:01 -08001125func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001126 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001127}
1128
Colin Cross1f3f1302021-04-26 18:37:44 -07001129func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001130 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001131 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001132}
1133
Colin Cross5271fea2021-04-27 13:06:04 -07001134func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1135 lib := moduleLibraryInterface(m)
1136 return lib != nil && (lib.hasVendorPublicLibrary())
1137}
1138
1139// IsVendorPublicLibrary returns true for vendor public libraries.
1140func (c *Module) IsVendorPublicLibrary() bool {
1141 return c.VendorProperties.IsVendorPublicLibrary
1142}
1143
Ivan Lozanod7586b62021-04-01 09:49:36 -04001144func (c *Module) HasLlndkStubs() bool {
1145 lib := moduleLibraryInterface(c)
1146 return lib != nil && lib.hasLLNDKStubs()
1147}
1148
1149func (c *Module) StubsVersion() string {
1150 if lib, ok := c.linker.(versionedInterface); ok {
1151 return lib.stubsVersion()
1152 }
1153 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1154}
1155
Colin Cross127bb8b2020-12-16 16:46:01 -08001156// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1157// and does not set llndk.vendor_available: false.
1158func (c *Module) isImplementationForLLNDKPublic() bool {
1159 library, _ := c.library.(*libraryDecorator)
1160 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001161 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001162}
1163
Justin Yunfd9e8042020-12-23 18:23:14 +09001164// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001165func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001166 // Check if VNDK-core-private or VNDK-SP-private
1167 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001168 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001169 }
1170
1171 // Check if LLNDK-private
1172 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001173 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001174 }
1175
1176 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001177}
1178
Ivan Lozano52767be2019-10-18 14:49:46 -07001179func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001180 if vndkdep := c.vndkdep; vndkdep != nil {
1181 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001182 }
1183 return false
1184}
1185
Yi Kong7e53c572018-02-14 18:16:12 +08001186func (c *Module) isPgoCompile() bool {
1187 if pgo := c.pgo; pgo != nil {
1188 return pgo.Properties.PgoCompile
1189 }
1190 return false
1191}
1192
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001193func (c *Module) isNDKStubLibrary() bool {
1194 if _, ok := c.compiler.(*stubDecorator); ok {
1195 return true
1196 }
1197 return false
1198}
1199
Ivan Lozanod7586b62021-04-01 09:49:36 -04001200func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001201 if vndkdep := c.vndkdep; vndkdep != nil {
1202 return vndkdep.isVndkSp()
1203 }
1204 return false
1205}
1206
Ivan Lozanof9e21722020-12-02 09:00:51 -05001207func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001208 if vndkdep := c.vndkdep; vndkdep != nil {
1209 return vndkdep.isVndkExt()
1210 }
1211 return false
1212}
1213
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001214func (c *Module) SubName() string {
1215 return c.Properties.SubName
1216}
1217
Ivan Lozano52767be2019-10-18 14:49:46 -07001218func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001219 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001220}
1221
Logan Chienf3511742017-10-31 18:04:35 +08001222func (c *Module) getVndkExtendsModuleName() string {
1223 if vndkdep := c.vndkdep; vndkdep != nil {
1224 return vndkdep.getVndkExtendsModuleName()
1225 }
1226 return ""
1227}
1228
Jiyong Park25fc6a92018-11-18 18:02:45 +09001229func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001230 if lib := c.library; lib != nil {
1231 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001232 }
1233 return false
1234}
1235
1236func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001237 if lib := c.library; lib != nil {
1238 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001239 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001240 return false
1241}
1242
Colin Cross0477b422020-10-13 18:43:54 -07001243// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1244// the implementation. If it is an implementation library it returns its own name.
1245func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1246 name := ctx.OtherModuleName(c)
1247 if versioned, ok := c.linker.(versionedInterface); ok {
1248 name = versioned.implementationModuleName(name)
1249 }
1250 return name
1251}
1252
Martin Stjernholm2856c662020-12-02 15:03:42 +00001253// Similar to ImplementationModuleName, but uses the Make variant of the module
1254// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1255// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1256// under the premise that the prebuilt module overrides its source counterpart
1257// if it is exposed to Make).
1258func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1259 name := c.BaseModuleName()
1260 if versioned, ok := c.linker.(versionedInterface); ok {
1261 name = versioned.implementationModuleName(name)
1262 }
1263 return name
1264}
1265
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001266func (c *Module) bootstrap() bool {
1267 return Bool(c.Properties.Bootstrap)
1268}
1269
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001270func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001271 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1272 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1273 return false
1274 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001275 return c.linker != nil && c.linker.nativeCoverage()
1276}
1277
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001278func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001279 if p, ok := c.linker.(SnapshotInterface); ok {
1280 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001281 }
1282 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001283}
1284
Bill Peckham945441c2020-08-31 16:07:58 -07001285func (c *Module) ExcludeFromVendorSnapshot() bool {
1286 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1287}
1288
Jose Galmesf7294582020-11-13 12:07:36 -08001289func (c *Module) ExcludeFromRecoverySnapshot() bool {
1290 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1291}
1292
Jiyong Parkf1194352019-02-25 11:05:47 +09001293func isBionic(name string) bool {
1294 switch name {
Kiyoung Kim4098c7e2020-11-30 14:42:14 +09001295 case "libc", "libm", "libdl", "libdl_android", "linker", "linkerconfig":
Jiyong Parkf1194352019-02-25 11:05:47 +09001296 return true
1297 }
1298 return false
1299}
1300
Martin Stjernholm279de572019-09-10 23:18:20 +01001301func InstallToBootstrap(name string, config android.Config) bool {
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001302 if name == "libclang_rt.hwasan-aarch64-android" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001303 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001304 }
1305 return isBionic(name)
1306}
1307
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001308func (c *Module) XrefCcFiles() android.Paths {
1309 return c.kytheFiles
1310}
1311
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001312func (c *Module) isCfiAssemblySupportEnabled() bool {
1313 return c.sanitize != nil &&
1314 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1315}
1316
Colin Crossca860ac2016-01-04 14:34:37 -08001317type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001318 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001319 moduleContextImpl
1320}
1321
Colin Cross37047f12016-12-13 17:06:13 -08001322type depsContext struct {
1323 android.BottomUpMutatorContext
1324 moduleContextImpl
1325}
1326
Colin Crossca860ac2016-01-04 14:34:37 -08001327type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001328 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001329 moduleContextImpl
1330}
1331
1332type moduleContextImpl struct {
1333 mod *Module
1334 ctx BaseModuleContext
1335}
1336
Colin Crossb98c8b02016-07-29 13:44:28 -07001337func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001338 return ctx.mod.toolchain(ctx.ctx)
1339}
1340
1341func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001342 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001343}
1344
1345func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001346 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001347}
1348
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001349func (ctx *moduleContextImpl) testBinary() bool {
1350 return ctx.mod.testBinary()
1351}
1352
Jiyong Park1d1119f2019-07-29 21:27:18 +09001353func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001354 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001355}
1356
Inseob Kim7f283f42020-06-01 21:53:49 +09001357func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001358 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001359}
1360
Inseob Kim1042d292020-06-01 23:23:05 +09001361func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001362 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001363}
1364
Jooyung Hanccce2f22020-03-07 03:45:53 +09001365func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001366 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001367}
1368
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001369func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001370 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001371}
1372
1373func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001374 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001375 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001376 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001377 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001378 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001379 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001380 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001381 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001382 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001383 }
1384 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001385}
1386
Jiyong Parkb35a8192020-08-10 15:59:36 +09001387func (ctx *moduleContextImpl) minSdkVersion() string {
1388 ver := ctx.mod.MinSdkVersion()
1389 if ver == "apex_inherit" && !ctx.isForPlatform() {
1390 ver = ctx.apexSdkVersion().String()
1391 }
1392 if ver == "apex_inherit" || ver == "" {
1393 ver = ctx.sdkVersion()
1394 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001395 // For crt objects, the meaning of min_sdk_version is very different from other types of
1396 // module. For them, min_sdk_version defines the oldest version that the build system will
1397 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1398 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1399 // and min_sdk_version properties of the variants are set to the corresponding version
1400 // numbers. However, the platform (non-sdk) variant of the crt object is left untouched.
1401 // min_sdk_version: 16 doesn't actually mean that the platform variant has to support such
1402 // an old version. Since the variant is for the platform, it's preferred to target the
1403 // latest version.
1404 if ctx.mod.SplitPerApiLevel() && !ctx.isSdkVariant() {
1405 ver = strconv.Itoa(android.FutureApiLevelInt)
1406 }
1407
Jiyong Parkb35a8192020-08-10 15:59:36 +09001408 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1409 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1410 minSdkVersionInt, err2 := strconv.Atoi(ver)
1411 if err == nil && err2 == nil {
1412 if sdkVersionInt < minSdkVersionInt {
1413 return strconv.Itoa(sdkVersionInt)
1414 }
1415 }
1416 return ver
1417}
1418
1419func (ctx *moduleContextImpl) isSdkVariant() bool {
1420 return ctx.mod.IsSdkVariant()
1421}
1422
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001423func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001424 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001425}
Justin Yun8effde42017-06-23 19:24:43 +09001426
Colin Cross95f1ca02020-10-29 20:47:22 -07001427func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1428 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001429}
1430
Colin Cross127bb8b2020-12-16 16:46:01 -08001431func (ctx *moduleContextImpl) IsLlndk() bool {
1432 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001433}
1434
Colin Cross127bb8b2020-12-16 16:46:01 -08001435func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1436 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001437}
1438
Colin Cross127bb8b2020-12-16 16:46:01 -08001439func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1440 return ctx.mod.isImplementationForLLNDKPublic()
1441}
1442
1443func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1444 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001445}
1446
Logan Chienf3511742017-10-31 18:04:35 +08001447func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001448 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001449}
1450
Yi Kong7e53c572018-02-14 18:16:12 +08001451func (ctx *moduleContextImpl) isPgoCompile() bool {
1452 return ctx.mod.isPgoCompile()
1453}
1454
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001455func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1456 return ctx.mod.isNDKStubLibrary()
1457}
1458
Justin Yun8effde42017-06-23 19:24:43 +09001459func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001460 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001461}
1462
Ivan Lozanof9e21722020-12-02 09:00:51 -05001463func (ctx *moduleContextImpl) IsVndkExt() bool {
1464 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001465}
1466
Colin Cross5271fea2021-04-27 13:06:04 -07001467func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1468 return ctx.mod.IsVendorPublicLibrary()
1469}
1470
Vic Yangefd249e2018-11-12 20:19:56 -08001471func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001472 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001473}
1474
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001475func (ctx *moduleContextImpl) selectedStl() string {
1476 if stl := ctx.mod.stl; stl != nil {
1477 return stl.Properties.SelectedStl
1478 }
1479 return ""
1480}
1481
Ivan Lozanobd721262018-11-27 14:33:03 -08001482func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1483 return ctx.mod.linker.useClangLld(actx)
1484}
1485
Colin Crossce75d2c2016-10-06 16:12:58 -07001486func (ctx *moduleContextImpl) baseModuleName() string {
1487 return ctx.mod.ModuleBase.BaseModuleName()
1488}
1489
Logan Chienf3511742017-10-31 18:04:35 +08001490func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1491 return ctx.mod.getVndkExtendsModuleName()
1492}
1493
Logan Chiene274fc92019-12-03 11:18:32 -08001494func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001495 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001496}
1497
Colin Crosse07f2312020-08-13 11:24:56 -07001498func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001499 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001500}
1501
Dan Albertc8060532020-07-22 22:32:17 -07001502func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001503 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001504}
1505
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001506func (ctx *moduleContextImpl) bootstrap() bool {
1507 return ctx.mod.bootstrap()
1508}
1509
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001510func (ctx *moduleContextImpl) nativeCoverage() bool {
1511 return ctx.mod.nativeCoverage()
1512}
1513
Colin Cross56a83212020-09-15 18:30:11 -07001514func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1515 return ctx.mod.DirectlyInAnyApex()
1516}
1517
Colin Cross95b07f22020-12-16 11:06:50 -08001518func (ctx *moduleContextImpl) isPreventInstall() bool {
1519 return ctx.mod.Properties.PreventInstall
1520}
1521
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001522func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1523 return ctx.mod.isCfiAssemblySupportEnabled()
1524}
1525
Colin Cross635c3b02016-05-18 15:37:25 -07001526func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001527 return &Module{
1528 hod: hod,
1529 multilib: multilib,
1530 }
1531}
1532
Colin Cross635c3b02016-05-18 15:37:25 -07001533func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001534 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001535 module.features = []feature{
1536 &tidyFeature{},
1537 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001538 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001539 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001540 module.coverage = &coverage{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001541 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001542 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001543 module.lto = &lto{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001544 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001545 return module
1546}
1547
Colin Crossce75d2c2016-10-06 16:12:58 -07001548func (c *Module) Prebuilt() *android.Prebuilt {
1549 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1550 return p.prebuilt()
1551 }
1552 return nil
1553}
1554
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001555func (c *Module) IsPrebuilt() bool {
1556 return c.Prebuilt() != nil
1557}
1558
Colin Crossce75d2c2016-10-06 16:12:58 -07001559func (c *Module) Name() string {
1560 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001561 if p, ok := c.linker.(interface {
1562 Name(string) string
1563 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001564 name = p.Name(name)
1565 }
1566 return name
1567}
1568
Alex Light3d673592019-01-18 14:37:31 -08001569func (c *Module) Symlinks() []string {
1570 if p, ok := c.installer.(interface {
1571 symlinkList() []string
1572 }); ok {
1573 return p.symlinkList()
1574 }
1575 return nil
1576}
1577
Roland Levillainf89cd092019-07-29 16:22:59 +01001578func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1579 test, ok := c.linker.(testPerSrc)
1580 return ok && test.isAllTestsVariation()
1581}
1582
Chris Parsons216e10a2020-07-09 17:12:52 -04001583func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001584 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001585 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001586 }); ok {
1587 return p.dataPaths()
1588 }
1589 return nil
1590}
1591
Justin Yun5f7f7e82019-11-18 19:52:14 +09001592func (c *Module) getNameSuffixWithVndkVersion(ctx android.ModuleContext) string {
1593 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1594 // "current", it will append the VNDK version to the name suffix.
1595 var vndkVersion string
1596 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001597 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001598 if c.ProductSpecific() {
1599 // If the module is product specific with 'product_specific: true',
1600 // do not add a name suffix because it is a base module.
1601 return ""
1602 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001603 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
1604 nameSuffix = productSuffix
1605 } else {
1606 vndkVersion = ctx.DeviceConfig().VndkVersion()
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001607 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001608 }
1609 if vndkVersion == "current" {
1610 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1611 }
Colin Cross127bb8b2020-12-16 16:46:01 -08001612 if c.Properties.VndkVersion != vndkVersion && c.Properties.VndkVersion != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001613 // add version suffix only if the module is using different vndk version than the
1614 // version in product or vendor partition.
1615 nameSuffix += "." + c.Properties.VndkVersion
1616 }
1617 return nameSuffix
1618}
1619
Chris Parsons8d6e4332021-02-22 16:13:50 -05001620func (c *Module) setSubnameProperty(actx android.ModuleContext) {
Inseob Kim64c43952019-08-26 16:52:35 +09001621 c.Properties.SubName = ""
1622
1623 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1624 c.Properties.SubName += nativeBridgeSuffix
1625 }
1626
Colin Cross127bb8b2020-12-16 16:46:01 -08001627 llndk := c.IsLlndk()
Colin Cross627280f2021-04-26 16:53:58 -07001628 if llndk || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001629 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1630 // added for product variant only when we have vendor and product variants with core
1631 // variant. The suffix is not added for vendor-only or product-only module.
1632 c.Properties.SubName += c.getNameSuffixWithVndkVersion(actx)
Colin Cross5271fea2021-04-27 13:06:04 -07001633 } else if c.IsVendorPublicLibrary() {
1634 c.Properties.SubName += vendorPublicLibrarySuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001635 } else if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
Inseob Kim64c43952019-08-26 16:52:35 +09001636 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1637 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001638 c.Properties.SubName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001639 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
1640 c.Properties.SubName += ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001641 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001642 c.Properties.SubName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001643 } else if c.InRecovery() && !c.OnlyInRecovery() {
Inseob Kim64c43952019-08-26 16:52:35 +09001644 c.Properties.SubName += recoverySuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001645 } else if c.IsSdkVariant() && (c.Properties.SdkAndPlatformVariantVisibleToMake || c.SplitPerApiLevel()) {
Colin Crossc511bc52020-04-07 16:50:32 +00001646 c.Properties.SubName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001647 if c.SplitPerApiLevel() {
1648 c.Properties.SubName += "." + c.SdkVersion()
1649 }
Inseob Kim64c43952019-08-26 16:52:35 +09001650 }
Chris Parsons8d6e4332021-02-22 16:13:50 -05001651}
1652
1653// Returns true if Bazel was successfully used for the analysis of this module.
1654func (c *Module) maybeGenerateBazelActions(actx android.ModuleContext) bool {
Liz Kammerbdc60992021-02-24 16:55:11 -05001655 bazelModuleLabel := c.GetBazelLabel(actx, c)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001656 bazelActionsUsed := false
Chris Parsonsbab4d7e2021-04-15 17:27:08 -04001657 if c.MixedBuildsEnabled(actx) && c.bazelHandler != nil {
Chris Parsons8d6e4332021-02-22 16:13:50 -05001658 bazelActionsUsed = c.bazelHandler.generateBazelBuildActions(actx, bazelModuleLabel)
1659 }
1660 return bazelActionsUsed
1661}
1662
1663func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
1664 // TODO(cparsons): Any logic in this method occurring prior to querying Bazel should be
1665 // requested from Bazel instead.
1666
1667 // Handle the case of a test module split by `test_per_src` mutator.
1668 //
1669 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1670 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1671 // module and return early, as this module does not produce an output file per se.
1672 if c.IsTestPerSrcAllTestsVariation() {
1673 c.outputFile = android.OptionalPath{}
1674 return
1675 }
1676
1677 c.setSubnameProperty(actx)
1678 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1679 if !apexInfo.IsForPlatform() {
1680 c.hideApexVariantFromMake = true
1681 }
1682
Chris Parsonseefc9e62021-04-02 17:36:47 -04001683 c.makeLinkType = GetMakeLinkType(actx, c)
1684
Colin Crossca860ac2016-01-04 14:34:37 -08001685 ctx := &moduleContext{
Colin Cross635c3b02016-05-18 15:37:25 -07001686 ModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001687 moduleContextImpl: moduleContextImpl{
1688 mod: c,
1689 },
1690 }
1691 ctx.ctx = ctx
1692
Chris Parsons94a0bba2021-06-04 15:03:47 -04001693 if c.maybeGenerateBazelActions(actx) {
1694 c.maybeInstall(ctx, apexInfo)
1695 return
1696 }
1697
Colin Crossf18e1102017-11-16 14:33:08 -08001698 deps := c.depsToPaths(ctx)
1699 if ctx.Failed() {
1700 return
1701 }
1702
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001703 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1704 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
1705 }
1706
Colin Crossca860ac2016-01-04 14:34:37 -08001707 flags := Flags{
1708 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001709 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001710 }
Colin Crossca860ac2016-01-04 14:34:37 -08001711 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001712 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001713 }
1714 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001715 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001716 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001717 if c.stl != nil {
1718 flags = c.stl.flags(ctx, flags)
1719 }
Colin Cross16b23492016-01-06 14:41:07 -08001720 if c.sanitize != nil {
1721 flags = c.sanitize.flags(ctx, flags)
1722 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001723 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07001724 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08001725 }
Stephen Craneba090d12017-05-09 15:44:35 -07001726 if c.lto != nil {
1727 flags = c.lto.flags(ctx, flags)
1728 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001729 if c.pgo != nil {
1730 flags = c.pgo.flags(ctx, flags)
1731 }
Colin Crossca860ac2016-01-04 14:34:37 -08001732 for _, feature := range c.features {
1733 flags = feature.flags(ctx, flags)
1734 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001735 if ctx.Failed() {
1736 return
1737 }
1738
Colin Cross4af21ed2019-11-04 09:37:55 -08001739 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
1740 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
1741 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08001742
Colin Cross4af21ed2019-11-04 09:37:55 -08001743 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09001744
1745 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001746 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001747 }
1748 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08001749 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09001750 }
1751
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001752 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07001753 // We need access to all the flags seen by a source file.
1754 if c.sabi != nil {
1755 flags = c.sabi.flags(ctx, flags)
1756 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07001757
Colin Cross4af21ed2019-11-04 09:37:55 -08001758 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07001759
Colin Crossca860ac2016-01-04 14:34:37 -08001760 // Optimization to reduce size of build.ninja
1761 // Replace the long list of flags for each file with a module-local variable
Colin Cross4af21ed2019-11-04 09:37:55 -08001762 ctx.Variable(pctx, "cflags", strings.Join(flags.Local.CFlags, " "))
1763 ctx.Variable(pctx, "cppflags", strings.Join(flags.Local.CppFlags, " "))
1764 ctx.Variable(pctx, "asflags", strings.Join(flags.Local.AsFlags, " "))
1765 flags.Local.CFlags = []string{"$cflags"}
1766 flags.Local.CppFlags = []string{"$cppflags"}
1767 flags.Local.AsFlags = []string{"$asflags"}
Colin Crossca860ac2016-01-04 14:34:37 -08001768
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001769 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08001770 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001771 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001772 if ctx.Failed() {
1773 return
1774 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001775 c.kytheFiles = objs.kytheFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08001776 }
1777
Colin Crossca860ac2016-01-04 14:34:37 -08001778 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07001779 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08001780 if ctx.Failed() {
1781 return
1782 }
Colin Cross635c3b02016-05-18 15:37:25 -07001783 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09001784
Chris Parsons94a0bba2021-06-04 15:03:47 -04001785 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001786
Jose Galmes6f843bc2020-12-11 13:36:29 -08001787 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
1788 // RECOVERY_SNAPSHOT_VERSION is current.
1789 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001790 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09001791 i.collectHeadersForSnapshot(ctx)
1792 }
1793 }
Colin Crossce75d2c2016-10-06 16:12:58 -07001794 }
Colin Cross5049f022015-03-18 13:28:46 -07001795
Chris Parsons94a0bba2021-06-04 15:03:47 -04001796 c.maybeInstall(ctx, apexInfo)
1797}
1798
1799func (c *Module) maybeUnhideFromMake() {
1800 // If a lib is directly included in any of the APEXes or is not available to the
1801 // platform (which is often the case when the stub is provided as a prebuilt),
1802 // unhide the stubs variant having the latest version gets visible to make. In
1803 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
1804 // force anything in the make world to link against the stubs library. (unless it
1805 // is explicitly referenced via .bootstrap suffix or the module is marked with
1806 // 'bootstrap: true').
1807 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
1808 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
1809 c.IsStubs() && !c.InVendorRamdisk() {
1810 c.Properties.HideFromMake = false // unhide
1811 // Note: this is still non-installable
1812 }
1813}
1814
1815func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08001816 if !proptools.BoolDefault(c.Properties.Installable, true) {
1817 // If the module has been specifically configure to not be installed then
1818 // hide from make as otherwise it will break when running inside make
1819 // as the output path to install will not be specified. Not all uninstallable
1820 // modules can be hidden from make as some are needed for resolving make side
1821 // dependencies.
1822 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001823 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08001824 c.SkipInstall()
1825 }
1826
1827 // Still call c.installer.install though, the installs will be stored as PackageSpecs
1828 // to allow using the outputs in a genrule.
1829 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07001830 c.installer.install(ctx, c.outputFile.Path())
1831 if ctx.Failed() {
1832 return
Colin Crossca860ac2016-01-04 14:34:37 -08001833 }
Dan Albertc403f7c2015-03-18 14:01:18 -07001834 }
Colin Cross3f40fa42015-01-30 17:27:36 -08001835}
1836
Colin Cross0ea8ba82019-06-06 14:33:29 -07001837func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001838 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05001839 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08001840 }
Colin Crossca860ac2016-01-04 14:34:37 -08001841 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08001842}
1843
Colin Crossca860ac2016-01-04 14:34:37 -08001844func (c *Module) begin(ctx BaseModuleContext) {
1845 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001846 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07001847 }
Colin Crossca860ac2016-01-04 14:34:37 -08001848 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001849 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08001850 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001851 if c.stl != nil {
1852 c.stl.begin(ctx)
1853 }
Colin Cross16b23492016-01-06 14:41:07 -08001854 if c.sanitize != nil {
1855 c.sanitize.begin(ctx)
1856 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001857 if c.coverage != nil {
1858 c.coverage.begin(ctx)
1859 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001860 if c.sabi != nil {
1861 c.sabi.begin(ctx)
1862 }
Justin Yun8effde42017-06-23 19:24:43 +09001863 if c.vndkdep != nil {
1864 c.vndkdep.begin(ctx)
1865 }
Stephen Craneba090d12017-05-09 15:44:35 -07001866 if c.lto != nil {
1867 c.lto.begin(ctx)
1868 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001869 if c.pgo != nil {
1870 c.pgo.begin(ctx)
1871 }
Colin Crossca860ac2016-01-04 14:34:37 -08001872 for _, feature := range c.features {
1873 feature.begin(ctx)
1874 }
Dan Albert92fe7402020-07-15 13:33:30 -07001875 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07001876 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001877 if err != nil {
1878 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07001879 c.Properties.Sdk_version = nil
1880 } else {
1881 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001882 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07001883 }
Colin Crossca860ac2016-01-04 14:34:37 -08001884}
1885
Colin Cross37047f12016-12-13 17:06:13 -08001886func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07001887 deps := Deps{}
1888
1889 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001890 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001891 }
1892 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001893 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07001894 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001895 if c.stl != nil {
1896 deps = c.stl.deps(ctx, deps)
1897 }
Colin Cross16b23492016-01-06 14:41:07 -08001898 if c.sanitize != nil {
1899 deps = c.sanitize.deps(ctx, deps)
1900 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00001901 if c.coverage != nil {
1902 deps = c.coverage.deps(ctx, deps)
1903 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001904 if c.sabi != nil {
1905 deps = c.sabi.deps(ctx, deps)
1906 }
Justin Yun8effde42017-06-23 19:24:43 +09001907 if c.vndkdep != nil {
1908 deps = c.vndkdep.deps(ctx, deps)
1909 }
Stephen Craneba090d12017-05-09 15:44:35 -07001910 if c.lto != nil {
1911 deps = c.lto.deps(ctx, deps)
1912 }
Colin Crossc99deeb2016-04-11 15:06:20 -07001913 for _, feature := range c.features {
1914 deps = feature.deps(ctx, deps)
1915 }
1916
Colin Crossb6715442017-10-24 11:13:31 -07001917 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
1918 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
1919 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
1920 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
1921 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
1922 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08001923 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07001924
Liz Kammer356f7d42021-01-26 09:18:53 -05001925 // In Bazel conversion mode, we dependency and build validations will occur in Bazel, so there is
1926 // no need to do so in Soong.
1927 if ctx.BazelConversionMode() {
1928 return deps
1929 }
1930
Dan Willemsen490a8dc2016-06-06 18:22:19 -07001931 for _, lib := range deps.ReexportSharedLibHeaders {
1932 if !inList(lib, deps.SharedLibs) {
1933 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
1934 }
1935 }
1936
1937 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00001938 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
1939 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 -07001940 }
1941 }
1942
Colin Cross5950f382016-12-13 12:50:57 -08001943 for _, lib := range deps.ReexportHeaderLibHeaders {
1944 if !inList(lib, deps.HeaderLibs) {
1945 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
1946 }
1947 }
1948
Dan Willemsenb3454ab2016-09-28 17:34:58 -07001949 for _, gen := range deps.ReexportGeneratedHeaders {
1950 if !inList(gen, deps.GeneratedHeaders) {
1951 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
1952 }
1953 }
1954
Colin Crossc99deeb2016-04-11 15:06:20 -07001955 return deps
1956}
1957
Dan Albert7e9d2952016-08-04 13:02:36 -07001958func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08001959 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07001960 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08001961 moduleContextImpl: moduleContextImpl{
1962 mod: c,
1963 },
1964 }
1965 ctx.ctx = ctx
1966
Colin Crossca860ac2016-01-04 14:34:37 -08001967 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07001968}
1969
Jiyong Park7ed9de32018-10-15 22:25:07 +09001970// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09001971func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09001972 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
1973 version := name[sharp+1:]
1974 libname := name[:sharp]
1975 return libname, version
1976 }
1977 return name, ""
1978}
1979
Dan Albert92fe7402020-07-15 13:33:30 -07001980func GetCrtVariations(ctx android.BottomUpMutatorContext,
1981 m LinkableInterface) []blueprint.Variation {
1982 if ctx.Os() != android.Android {
1983 return nil
1984 }
1985 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001986 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
1987 minSdkVersion := m.MinSdkVersion()
1988 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
1989 minSdkVersion = m.SdkVersion()
1990 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09001991 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
1992 if err != nil {
1993 ctx.PropertyErrorf("min_sdk_version", err.Error())
1994 }
Dan Albert92fe7402020-07-15 13:33:30 -07001995 return []blueprint.Variation{
1996 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09001997 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07001998 }
1999 }
2000 return []blueprint.Variation{
2001 {Mutator: "sdk", Variation: ""},
2002 }
2003}
2004
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002005func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2006 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002007
2008 variations = append([]blueprint.Variation(nil), variations...)
2009
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002010 if version != "" && CanBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002011 // Version is explicitly specified. i.e. libFoo#30
2012 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002013 if tag, ok := depTag.(libraryDependencyTag); ok {
2014 tag.explicitlyVersioned = true
2015 } else {
2016 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2017 }
Colin Crosse7257d22020-09-24 09:56:18 -07002018 }
Colin Crosse7257d22020-09-24 09:56:18 -07002019
Colin Cross0de8a1e2020-09-18 14:15:30 -07002020 if far {
2021 ctx.AddFarVariationDependencies(variations, depTag, name)
2022 } else {
2023 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002024 }
2025}
2026
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002027func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
2028 // Only modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
2029 // SnapshotInfo, which provides no mappings.
2030 if *snapshotInfo == nil {
2031 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2032 // between the modules in the snapshot and the snapshot itself.
2033 var snapshotModule []blueprint.Module
2034 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2035 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2036 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2037 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2038 }
2039 if len(snapshotModule) > 0 {
2040 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2041 *snapshotInfo = &snapshot
2042 // republish the snapshot for use in later mutators on this module
2043 actx.SetProvider(SnapshotInfoProvider, snapshot)
2044 } else {
2045 *snapshotInfo = &SnapshotInfo{}
2046 }
2047 }
2048
2049 return **snapshotInfo
2050}
2051
2052func RewriteSnapshotLib(lib string, snapshotMap map[string]string) string {
2053 if snapshot, ok := snapshotMap[lib]; ok {
2054 return snapshot
2055 }
2056
2057 return lib
2058}
2059
2060// RewriteLibs takes a list of names of shared libraries and scans it for three types
2061// of names:
2062//
2063// 1. Name of an NDK library that refers to a prebuilt module.
2064// For each of these, it adds the name of the prebuilt module (which will be in
2065// prebuilts/ndk) to the list of nonvariant libs.
2066// 2. Name of an NDK library that refers to an ndk_library module.
2067// For each of these, it adds the name of the ndk_library module to the list of
2068// variant libs.
2069// 3. Anything else (so anything that isn't an NDK library).
2070// It adds these to the nonvariantLibs list.
2071//
2072// The caller can then know to add the variantLibs dependencies differently from the
2073// nonvariantLibs
2074func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2075 variantLibs = []string{}
2076
2077 nonvariantLibs = []string{}
2078 for _, entry := range list {
2079 // strip #version suffix out
2080 name, _ := StubsLibNameAndVersion(entry)
2081 if c.InRecovery() {
2082 nonvariantLibs = append(nonvariantLibs, RewriteSnapshotLib(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
2083 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2084 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2085 } else if c.UseVndk() {
2086 nonvariantLibs = append(nonvariantLibs, RewriteSnapshotLib(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
2087 } else {
2088 // put name#version back
2089 nonvariantLibs = append(nonvariantLibs, entry)
2090 }
2091 }
2092 return nonvariantLibs, variantLibs
2093}
2094
Colin Cross1e676be2016-10-12 14:38:15 -07002095func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002096 if !c.Enabled() {
2097 return
2098 }
2099
Colin Cross37047f12016-12-13 17:06:13 -08002100 ctx := &depsContext{
2101 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002102 moduleContextImpl: moduleContextImpl{
2103 mod: c,
2104 },
2105 }
2106 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002107
Colin Crossc99deeb2016-04-11 15:06:20 -07002108 deps := c.deps(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002109
Yo Chiang219968c2020-09-22 18:45:04 +08002110 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2111
Colin Crosse0edaf92021-01-11 17:31:17 -08002112 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002113
Dan Albert914449f2016-06-17 16:45:24 -07002114 variantNdkLibs := []string{}
2115 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002116 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002117 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2118 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2119 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002120
2121 for idx, lib := range deps.RuntimeLibs {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002122 deps.RuntimeLibs[idx] = RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002123 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002124 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002125
Colin Cross32ec36c2016-12-15 07:39:51 -08002126 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002127 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002128 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002129 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002130 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002131
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002132 lib = RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002133
Jiyong Park1ad8e162020-12-01 23:40:09 +09002134 if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002135 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002136 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002137 } else {
2138 actx.AddVariationDependencies(nil, depTag, lib)
2139 }
2140 }
2141
Dan Albertf1d14c72020-07-30 14:32:55 -07002142 if c.isNDKStubLibrary() {
2143 // NDK stubs depend on their implementation because the ABI dumps are
2144 // generated from the implementation library.
2145 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2146 c.ImageVariation(),
2147 blueprint.Variation{Mutator: "link", Variation: "shared"},
2148 ), stubImplementation, c.BaseModuleName())
2149 }
2150
Inseob Kim07def122020-11-23 14:43:02 +09002151 // sysprop_library has to support both C++ and Java. So sysprop_library internally creates one
2152 // C++ implementation library and one Java implementation library. When a module links against
2153 // sysprop_library, the C++ implementation library has to be linked. syspropImplLibraries is a
2154 // map from sysprop_library to implementation library; it will be used in whole_static_libs,
2155 // static_libs, and shared_libs.
Inseob Kimc0907f12019-02-08 21:00:45 +09002156 syspropImplLibraries := syspropImplLibraries(actx.Config())
2157
Jiyong Park5d1598f2019-02-25 22:14:17 +09002158 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002159 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Jiyong Park5d1598f2019-02-25 22:14:17 +09002160 if impl, ok := syspropImplLibraries[lib]; ok {
2161 lib = impl
2162 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002163
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002164 lib = RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002165
Jiyong Park5d1598f2019-02-25 22:14:17 +09002166 actx.AddVariationDependencies([]blueprint.Variation{
2167 {Mutator: "link", Variation: "static"},
2168 }, depTag, lib)
2169 }
2170
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002171 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002172 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002173 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002174 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002175 }
Jiyong Parke3867542020-12-03 17:28:25 +09002176 if inList(lib, deps.ExcludeLibsForApex) {
2177 depTag.excludeInApex = true
2178 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002179
2180 if impl, ok := syspropImplLibraries[lib]; ok {
2181 lib = impl
2182 }
2183
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002184 lib = RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002185
Dan Willemsen59339a22018-07-22 21:18:45 -07002186 actx.AddVariationDependencies([]blueprint.Variation{
2187 {Mutator: "link", Variation: "static"},
2188 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002189 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002190
Jooyung Han75568392020-03-20 04:29:24 +09002191 // staticUnwinderDep is treated as staticDep for Q apexes
2192 // so that native libraries/binaries are linked with static unwinder
2193 // because Q libc doesn't have unwinder APIs
2194 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002195 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002196 actx.AddVariationDependencies([]blueprint.Variation{
2197 {Mutator: "link", Variation: "static"},
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002198 }, depTag, RewriteSnapshotLib(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002199 }
2200
Inseob Kimeec88e12020-01-22 11:11:29 +09002201 for _, lib := range deps.LateStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002202 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Inseob Kimeec88e12020-01-22 11:11:29 +09002203 actx.AddVariationDependencies([]blueprint.Variation{
2204 {Mutator: "link", Variation: "static"},
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002205 }, depTag, RewriteSnapshotLib(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Inseob Kimeec88e12020-01-22 11:11:29 +09002206 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002207
Jiyong Park7ed9de32018-10-15 22:25:07 +09002208 // shared lib names without the #version suffix
2209 var sharedLibNames []string
2210
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002211 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002212 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002213 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002214 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002215 }
Jiyong Parke3867542020-12-03 17:28:25 +09002216 if inList(lib, deps.ExcludeLibsForApex) {
2217 depTag.excludeInApex = true
2218 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002219
2220 if impl, ok := syspropImplLibraries[lib]; ok {
2221 lib = impl
2222 }
2223
Jiyong Park73c54ee2019-10-22 20:31:18 +09002224 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002225 sharedLibNames = append(sharedLibNames, name)
2226
Colin Crosse7257d22020-09-24 09:56:18 -07002227 variations := []blueprint.Variation{
2228 {Mutator: "link", Variation: "shared"},
2229 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002230 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002231 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002232
Jiyong Park7ed9de32018-10-15 22:25:07 +09002233 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002234 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002235 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2236 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2237 // linking against both the stubs lib and the non-stubs lib at the same time.
2238 continue
2239 }
Colin Cross6e511a92020-07-27 21:26:48 -07002240 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002241 variations := []blueprint.Variation{
2242 {Mutator: "link", Variation: "shared"},
2243 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002244 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002245 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002246
Dan Willemsen59339a22018-07-22 21:18:45 -07002247 actx.AddVariationDependencies([]blueprint.Variation{
2248 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002249 }, dataLibDepTag, deps.DataLibs...)
2250
2251 actx.AddVariationDependencies([]blueprint.Variation{
2252 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002253 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002254
Colin Cross68861832016-07-08 10:41:41 -07002255 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002256
2257 for _, gen := range deps.GeneratedHeaders {
2258 depTag := genHeaderDepTag
2259 if inList(gen, deps.ReexportGeneratedHeaders) {
2260 depTag = genHeaderExportDepTag
2261 }
2262 actx.AddDependency(c, depTag, gen)
2263 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002264
Dan Albert92fe7402020-07-15 13:33:30 -07002265 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002266 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc99deeb2016-04-11 15:06:20 -07002267 if deps.CrtBegin != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002268 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002269 RewriteSnapshotLib(deps.CrtBegin, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002270 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002271 if deps.CrtEnd != "" {
Dan Albert92fe7402020-07-15 13:33:30 -07002272 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002273 RewriteSnapshotLib(deps.CrtEnd, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002274 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002275 if deps.LinkerFlagsFile != "" {
2276 actx.AddDependency(c, linkerFlagsDepTag, deps.LinkerFlagsFile)
2277 }
2278 if deps.DynamicLinker != "" {
2279 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002280 }
Dan Albert914449f2016-06-17 16:45:24 -07002281
2282 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002283
2284 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002285 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002286 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002287 {Mutator: "link", Variation: "shared"},
2288 }, ndkStubDepTag, variantNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002289
2290 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002291 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002292 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002293 {Mutator: "link", Variation: "shared"},
2294 }, ndkLateStubDepTag, variantLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002295
2296 if vndkdep := c.vndkdep; vndkdep != nil {
2297 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002298 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002299 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002300 {Mutator: "link", Variation: "shared"},
2301 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002302 }
2303 }
Colin Cross6362e272015-10-29 15:25:03 -07002304}
Colin Cross21b9a242015-03-24 14:15:58 -07002305
Colin Crosse40b4ea2018-10-02 22:25:58 -07002306func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002307 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2308 c.beginMutator(ctx)
2309 }
2310}
2311
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002312// Whether a module can link to another module, taking into
2313// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002314func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002315 tag blueprint.DependencyTag) {
2316
2317 switch t := tag.(type) {
2318 case dependencyTag:
2319 if t != vndkExtDepTag {
2320 return
2321 }
2322 case libraryDependencyTag:
2323 default:
2324 return
2325 }
2326
Ivan Lozanof9e21722020-12-02 09:00:51 -05002327 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002328 // Host code is not restricted
2329 return
2330 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002331
2332 // VNDK is cc.Module supported only for now.
2333 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002334 // Though allowed dependency is limited by the image mutator,
2335 // each vendor and product module needs to check link-type
2336 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002337 if ccTo, ok := to.(*Module); ok {
2338 if ccFrom.vndkdep != nil {
2339 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2340 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002341 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002342 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002343 }
2344 return
2345 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002346 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002347 // Platform code can link to anything
2348 return
2349 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002350 if from.InRamdisk() {
2351 // Ramdisk code is not NDK
2352 return
2353 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002354 if from.InVendorRamdisk() {
2355 // Vendor ramdisk code is not NDK
2356 return
2357 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002358 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002359 // Recovery code is not NDK
2360 return
2361 }
Colin Cross31076b32020-10-23 17:22:06 -07002362 if c, ok := to.(*Module); ok {
2363 if c.ToolchainLibrary() {
2364 // These are always allowed
2365 return
2366 }
2367 if c.NdkPrebuiltStl() {
2368 // These are allowed, but they don't set sdk_version
2369 return
2370 }
2371 if c.StubDecorator() {
2372 // These aren't real libraries, but are the stub shared libraries that are included in
2373 // the NDK.
2374 return
2375 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002376 }
Logan Chien834b9a62019-01-14 15:39:03 +08002377
Ivan Lozano52767be2019-10-18 14:49:46 -07002378 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002379 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2380 // to link to libc++ (non-NDK and without sdk_version).
2381 return
2382 }
2383
Ivan Lozano52767be2019-10-18 14:49:46 -07002384 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002385 // NDK code linking to platform code is never okay.
2386 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002387 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002388 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002389 }
2390
2391 // At this point we know we have two NDK libraries, but we need to
2392 // check that we're not linking against anything built against a higher
2393 // API level, as it is only valid to link against older or equivalent
2394 // APIs.
2395
Inseob Kim01a28722018-04-11 09:48:45 +09002396 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002397 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002398 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002399 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002400 // Current can't be linked against by anything else.
2401 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002402 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002403 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002404 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002405 if err != nil {
2406 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002407 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002408 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002409 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002410 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002411 if err != nil {
2412 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002413 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002414 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002415 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002416
Inseob Kim01a28722018-04-11 09:48:45 +09002417 if toApi > fromApi {
2418 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002419 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002420 }
2421 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002422 }
Dan Albert202fe492017-12-15 13:56:59 -08002423
2424 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002425 fromStl := from.SelectedStl()
2426 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002427 if fromStl == "" || toStl == "" {
2428 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002429 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002430 // We can be permissive with the system "STL" since it is only the C++
2431 // ABI layer, but in the future we should make sure that everyone is
2432 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002433 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002434 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002435 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2436 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002437 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002438}
2439
Jooyung Han479ca172020-10-19 18:51:07 +09002440func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2441 if c, ok := ctx.Module().(*Module); ok {
2442 ctx.VisitDirectDeps(func(dep android.Module) {
2443 depTag := ctx.OtherModuleDependencyTag(dep)
2444 ccDep, ok := dep.(LinkableInterface)
2445 if ok {
2446 checkLinkType(ctx, c, ccDep, depTag)
2447 }
2448 })
2449 }
2450}
2451
Jiyong Park5fb8c102018-04-09 12:03:06 +09002452// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002453// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2454// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002455// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002456func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2457 check := func(child, parent android.Module) bool {
2458 to, ok := child.(*Module)
2459 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002460 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002461 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002462
Jooyung Hana70f0672019-01-18 15:20:43 +09002463 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2464 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002465 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002466
Jiyong Park0474e1f2021-01-14 14:26:06 +09002467 // These dependencies are not excercised at runtime. Tracking these will give us
2468 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002469 depTag := ctx.OtherModuleDependencyTag(child)
2470 if IsHeaderDepTag(depTag) {
2471 return false
2472 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002473 if depTag == staticVariantTag {
2474 return false
2475 }
2476 if depTag == stubImplDepTag {
2477 return false
2478 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002479
Justin Yun63e9ec72020-10-29 16:49:43 +09002480 // Even if target lib has no vendor variant, keep checking dependency
2481 // graph in case it depends on vendor_available or product_available
2482 // but not double_loadable transtively.
2483 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002484 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002485 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002486
Jiyong Park0474e1f2021-01-14 14:26:06 +09002487 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2488 // one.
2489 if Bool(to.VendorProperties.Double_loadable) {
2490 return true
2491 }
2492
Ivan Lozanod7586b62021-04-01 09:49:36 -04002493 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002494 return false
2495 }
2496
Jooyung Hana70f0672019-01-18 15:20:43 +09002497 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2498 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002499 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002500 return false
2501 }
2502 if module, ok := ctx.Module().(*Module); ok {
2503 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002504 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002505 ctx.WalkDeps(check)
2506 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002507 }
2508 }
2509}
2510
Colin Crossc99deeb2016-04-11 15:06:20 -07002511// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002512func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002513 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002514
Colin Cross0de8a1e2020-09-18 14:15:30 -07002515 var directStaticDeps []StaticLibraryInfo
2516 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002517
Colin Cross0de8a1e2020-09-18 14:15:30 -07002518 reexportExporter := func(exporter FlagExporterInfo) {
2519 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2520 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2521 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2522 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2523 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002524 }
2525
Jooyung Hande34d232020-07-23 13:04:15 +09002526 // For the dependency from platform to apex, use the latest stubs
2527 c.apexSdkVersion = android.FutureApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07002528 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2529 if !apexInfo.IsForPlatform() {
Jiyong Park4eab21d2021-04-15 15:17:54 +09002530 c.apexSdkVersion = apexInfo.MinSdkVersion
Jooyung Hande34d232020-07-23 13:04:15 +09002531 }
2532
2533 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2534 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2535 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2536 // (b/144430859)
2537 c.apexSdkVersion = android.FutureApiLevel
2538 }
2539
Colin Crossd11fcda2017-10-23 17:59:01 -07002540 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002541 depName := ctx.OtherModuleName(dep)
2542 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002543
Ivan Lozano52767be2019-10-18 14:49:46 -07002544 ccDep, ok := dep.(LinkableInterface)
2545 if !ok {
2546
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002547 // handling for a few module types that aren't cc Module but that are also supported
2548 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002549 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002550 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07002551 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
2552 genRule.GeneratedSourceFiles()...)
2553 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002554 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002555 }
Colin Crosse90bfd12017-04-26 16:59:26 -07002556 // Support exported headers from a generated_sources dependency
2557 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002558 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002559 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09002560 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08002561 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09002562 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09002563 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002564 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09002565 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09002566 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
2567 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09002568 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002569 // 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 +09002570 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07002571
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002572 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002573 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002574 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07002575 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002576 case linkerFlagsDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002577 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002578 files := genRule.GeneratedSourceFiles()
2579 if len(files) == 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002580 depPaths.LinkerFlagsFile = android.OptionalPathForPath(files[0])
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002581 } else if len(files) > 1 {
Dan Willemsena0790e32018-10-12 00:24:23 -07002582 ctx.ModuleErrorf("module %q can only generate a single file if used for a linker flag file", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002583 }
2584 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002585 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002586 }
Colin Crossca860ac2016-01-04 14:34:37 -08002587 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002588 return
2589 }
2590
Colin Crossfe17f6f2019-03-28 19:30:56 -07002591 if depTag == android.ProtoPluginDepTag {
2592 return
2593 }
2594
Colin Crossd11fcda2017-10-23 17:59:01 -07002595 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002596 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
2597 return
2598 }
Colin Crossd11fcda2017-10-23 17:59:01 -07002599 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00002600 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
2601 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07002602 return
2603 }
2604
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002605 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07002606 // Skip reused objects for stub libraries, they use their own stub object file instead.
2607 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
2608 // version mutator, so the stubs variant is created from the shared variant that
2609 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07002610 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07002611 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2612 objs := staticAnalogue.ReuseObjects
2613 depPaths.Objs = depPaths.Objs.Append(objs)
2614 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
2615 reexportExporter(depExporterInfo)
2616 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07002617 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09002618 }
2619
Colin Cross6e511a92020-07-27 21:26:48 -07002620 linkFile := ccDep.OutputFile()
2621
2622 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
2623 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07002624 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002625 return
2626 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002627
Jiyong Parke3867542020-12-03 17:28:25 +09002628 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
2629 return
2630 }
2631
Colin Cross0de8a1e2020-09-18 14:15:30 -07002632 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07002633
Colin Cross6e511a92020-07-27 21:26:48 -07002634 var ptr *android.Paths
2635 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07002636
Colin Cross6e511a92020-07-27 21:26:48 -07002637 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07002638
Colin Cross6e511a92020-07-27 21:26:48 -07002639 switch {
2640 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08002641 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
2642 if !ctx.Config().AllowMissingDependencies() {
2643 ctx.ModuleErrorf("module %q is not a header library", depName)
2644 } else {
2645 ctx.AddMissingDependencies([]string{depName})
2646 }
2647 return
2648 }
Colin Cross6e511a92020-07-27 21:26:48 -07002649 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002650 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
2651 if !ctx.Config().AllowMissingDependencies() {
2652 ctx.ModuleErrorf("module %q is not a shared library", depName)
2653 } else {
2654 ctx.AddMissingDependencies([]string{depName})
2655 }
2656 return
2657 }
Jiyong Parke3867542020-12-03 17:28:25 +09002658
Colin Cross0de8a1e2020-09-18 14:15:30 -07002659 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
Chris Parsons3c27ca32020-11-20 12:42:07 -05002660 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002661
Chris Parsons3c27ca32020-11-20 12:42:07 -05002662 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002663 useStubs := false
Colin Cross31076b32020-10-23 17:22:06 -07002664
2665 if lib := moduleLibraryInterface(dep); lib.buildStubs() && c.UseVndk() { // LLNDK
Colin Cross0de8a1e2020-09-18 14:15:30 -07002666 if !apexInfo.IsForPlatform() {
2667 // For platform libraries, use current version of LLNDK
2668 // If this is for use_vendor apex we will apply the same rules
2669 // of apex sdk enforcement below to choose right version.
2670 useStubs = true
2671 }
2672 } else if apexInfo.IsForPlatform() {
2673 // If not building for APEX, use stubs only when it is from
2674 // an APEX (and not from platform)
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002675 // However, for host, ramdisk, vendor_ramdisk, recovery or bootstrap modules,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002676 // always link to non-stub variant
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09002677 useStubs = dep.(android.ApexModule).NotInPlatform() && !c.bootstrap()
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00002678 if useStubs {
2679 // Another exception: if this module is a test for an APEX, then
2680 // it is linked with the non-stub variant of a module in the APEX
2681 // as if this is part of the APEX.
2682 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
2683 for _, apexContents := range testFor.ApexContents {
2684 if apexContents.DirectlyInApex(depName) {
2685 useStubs = false
2686 break
2687 }
2688 }
2689 }
2690 if useStubs {
2691 // Yet another exception: If this module and the dependency are
2692 // available to the same APEXes then skip stubs between their
2693 // platform variants. This complements the test_for case above,
2694 // which avoids the stubs on a direct APEX library dependency, by
2695 // avoiding stubs for indirect test dependencies as well.
2696 //
2697 // TODO(b/183882457): This doesn't work if the two libraries have
2698 // only partially overlapping apex_available. For that test_for
2699 // modules would need to be split into APEX variants and resolved
2700 // separately for each APEX they have access to.
2701 if android.AvailableToSameApexes(c, dep.(android.ApexModule)) {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002702 useStubs = false
Colin Cross0de8a1e2020-09-18 14:15:30 -07002703 }
2704 }
2705 } else {
2706 // If building for APEX, use stubs when the parent is in any APEX that
2707 // the child is not in.
2708 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
2709 }
2710
Jiyong Park55549df2021-02-26 23:57:23 +09002711 // when to use (unspecified) stubs, use the latest one.
Colin Cross0de8a1e2020-09-18 14:15:30 -07002712 if useStubs {
Jiyong Park55549df2021-02-26 23:57:23 +09002713 stubs := sharedLibraryStubsInfo.SharedStubLibraries
2714 toUse := stubs[len(stubs)-1]
2715 sharedLibraryInfo = toUse.SharedLibraryInfo
2716 depExporterInfo = toUse.FlagExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07002717 }
2718 }
2719
Jiyong Park1ad8e162020-12-01 23:40:09 +09002720 // Stubs lib doesn't link to the shared lib dependencies. Don't set
2721 // linkFile, depFile, and ptr.
2722 if c.IsStubs() {
2723 break
2724 }
2725
Colin Cross0de8a1e2020-09-18 14:15:30 -07002726 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
2727 depFile = sharedLibraryInfo.TableOfContents
2728
Colin Cross6e511a92020-07-27 21:26:48 -07002729 ptr = &depPaths.SharedLibs
2730 switch libDepTag.Order {
2731 case earlyLibraryDependency:
2732 ptr = &depPaths.EarlySharedLibs
2733 depPtr = &depPaths.EarlySharedLibsDeps
2734 case normalLibraryDependency:
2735 ptr = &depPaths.SharedLibs
2736 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07002737 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002738 case lateLibraryDependency:
2739 ptr = &depPaths.LateSharedLibs
2740 depPtr = &depPaths.LateSharedLibsDeps
2741 default:
2742 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07002743 }
Colin Cross6e511a92020-07-27 21:26:48 -07002744 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07002745 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
2746 if !ctx.Config().AllowMissingDependencies() {
2747 ctx.ModuleErrorf("module %q is not a static library", depName)
2748 } else {
2749 ctx.AddMissingDependencies([]string{depName})
2750 }
2751 return
2752 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002753
2754 // Stubs lib doesn't link to the static lib dependencies. Don't set
2755 // linkFile, depFile, and ptr.
2756 if c.IsStubs() {
2757 break
2758 }
2759
Colin Cross0de8a1e2020-09-18 14:15:30 -07002760 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
2761 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07002762 if libDepTag.wholeStatic {
2763 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07002764 if len(staticLibraryInfo.Objects.objFiles) > 0 {
2765 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09002766 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07002767 // This case normally catches prebuilt static
2768 // libraries, but it can also occur when
2769 // AllowMissingDependencies is on and the
2770 // dependencies has no sources of its own
2771 // but has a whole_static_libs dependency
2772 // on a missing library. We want to depend
2773 // on the .a file so that there is something
2774 // in the dependency tree that contains the
2775 // error rule for the missing transitive
2776 // dependency.
2777 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07002778 }
Colin Cross6e511a92020-07-27 21:26:48 -07002779 } else {
2780 switch libDepTag.Order {
2781 case earlyLibraryDependency:
2782 panic(fmt.Errorf("early static libs not suppported"))
2783 case normalLibraryDependency:
2784 // static dependencies will be handled separately so they can be ordered
2785 // using transitive dependencies.
2786 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07002787 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07002788 case lateLibraryDependency:
2789 ptr = &depPaths.LateStaticLibs
2790 default:
2791 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09002792 }
2793 }
2794 }
2795
Colin Cross6e511a92020-07-27 21:26:48 -07002796 if libDepTag.static() && !libDepTag.wholeStatic {
2797 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
2798 ctx.ModuleErrorf("module %q not a static library", depName)
2799 return
2800 }
Logan Chien43d34c32017-12-20 01:17:32 +08002801
Colin Cross6e511a92020-07-27 21:26:48 -07002802 // When combining coverage files for shared libraries and executables, coverage files
2803 // in static libraries act as if they were whole static libraries. The same goes for
2804 // source based Abi dump files.
2805 if c, ok := ccDep.(*Module); ok {
2806 staticLib := c.linker.(libraryInterface)
2807 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
2808 staticLib.objs().coverageFiles...)
2809 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
2810 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002811 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07002812 // Handle non-CC modules here
2813 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07002814 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09002815 }
2816 }
2817
Colin Cross6e511a92020-07-27 21:26:48 -07002818 if ptr != nil {
2819 if !linkFile.Valid() {
2820 if !ctx.Config().AllowMissingDependencies() {
2821 ctx.ModuleErrorf("module %q missing output file", depName)
2822 } else {
2823 ctx.AddMissingDependencies([]string{depName})
2824 }
2825 return
2826 }
2827 *ptr = append(*ptr, linkFile.Path())
2828 }
2829
2830 if depPtr != nil {
2831 dep := depFile
2832 if !dep.Valid() {
2833 dep = linkFile
2834 }
2835 *depPtr = append(*depPtr, dep.Path())
2836 }
2837
Colin Cross0de8a1e2020-09-18 14:15:30 -07002838 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
2839 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
2840 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
2841 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
2842
2843 if libDepTag.reexportFlags {
2844 reexportExporter(depExporterInfo)
2845 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
2846 // Re-exported shared library headers must be included as well since they can help us with type information
2847 // about template instantiations (instantiated from their headers).
2848 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
2849 // scripts.
2850 c.sabi.Properties.ReexportedIncludes = append(
2851 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
2852 }
2853
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002854 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07002855 switch {
2856 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07002857 c.Properties.AndroidMkHeaderLibs = append(
2858 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07002859 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07002860 if lib := moduleLibraryInterface(dep); lib != nil {
2861 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07002862 // Add the dependency to the APEX(es) providing the library so that
2863 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07002864 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09002865 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07002866 c.Properties.ApexesProvidingSharedLibs = append(
2867 c.Properties.ApexesProvidingSharedLibs, an)
2868 }
2869 }
2870 }
2871
2872 // Note: the order of libs in this list is not important because
2873 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07002874 c.Properties.AndroidMkSharedLibs = append(
2875 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002876 // Record BaseLibName for snapshots.
2877 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07002878 case libDepTag.static():
2879 if libDepTag.wholeStatic {
2880 c.Properties.AndroidMkWholeStaticLibs = append(
2881 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
2882 } else {
2883 c.Properties.AndroidMkStaticLibs = append(
2884 c.Properties.AndroidMkStaticLibs, makeLibName)
2885 }
2886 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002887 } else if !c.IsStubs() {
2888 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
2889
Colin Cross6e511a92020-07-27 21:26:48 -07002890 switch depTag {
2891 case runtimeDepTag:
2892 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002893 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002894 // Record BaseLibName for snapshots.
2895 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07002896 case objDepTag:
2897 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
2898 case CrtBeginDepTag:
2899 depPaths.CrtBegin = linkFile
2900 case CrtEndDepTag:
2901 depPaths.CrtEnd = linkFile
2902 case dynamicLinkerDepTag:
2903 depPaths.DynamicLinker = linkFile
2904 }
Jiyong Park27b188b2017-07-18 13:23:39 +09002905 }
Colin Crossca860ac2016-01-04 14:34:37 -08002906 })
2907
Jeff Gaston294356f2017-09-27 17:05:30 -07002908 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07002909 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
2910 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
2911 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07002912
Colin Crossdd84e052017-05-17 13:44:16 -07002913 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07002914 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09002915 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
2916 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09002917 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09002918 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
2919 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07002920 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09002921 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09002922 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002923
2924 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09002925 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07002926 }
Colin Crossdd84e052017-05-17 13:44:16 -07002927
Colin Crossca860ac2016-01-04 14:34:37 -08002928 return depPaths
2929}
2930
Colin Cross0de8a1e2020-09-18 14:15:30 -07002931// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
2932// to match the topological order of the dependency tree, including any static analogues of
2933// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
2934// of the transitive dependencies.
2935func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
2936 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
2937 var staticPaths android.Paths
2938 for _, staticDep := range staticDeps {
2939 staticPaths = append(staticPaths, staticDep.StaticLibrary)
2940 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
2941 }
2942 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04002943 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
2944 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07002945 }
2946 }
2947 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
2948
2949 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
2950
2951 // reorder the dependencies based on transitive dependencies
2952 staticPaths = android.FirstUniquePaths(staticPaths)
2953 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
2954
2955 if len(orderedStaticPaths) != len(staticPaths) {
2956 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
2957 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
2958 }
2959
2960 return orderedStaticPaths, transitiveStaticLibs
2961}
2962
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002963// BaseLibName trims known prefixes and suffixes
2964func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07002965 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
2966 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00002967 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07002968 return libName
2969}
2970
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002971func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002972 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08002973 ccDepModule, _ := ccDep.(*Module)
2974 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09002975 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07002976
Justin Yuncbca3732021-02-03 19:24:13 +09002977 if ccDepModule != nil {
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002978 // TODO(ivanlozano) Support snapshots for Rust-produced C library variants.
Colin Cross6e511a92020-07-27 21:26:48 -07002979 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04002980 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09002981 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07002982
Ivan Lozanod1dec542021-05-26 15:33:11 -04002983 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07002984 }
2985 }
2986
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002987 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
2988 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07002989 // The vendor module is a no-vendor-variant VNDK library. Depend on the
2990 // core module instead.
2991 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002992 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09002993 // The vendor and product modules in Make will have been renamed to not conflict with the
2994 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002995 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07002996 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
2997 return libName + ramdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002998 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05002999 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003000 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
3001 return libName + recoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003002 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Colin Cross6e511a92020-07-27 21:26:48 -07003003 return libName + nativeBridgeSuffix
3004 } else {
3005 return libName
3006 }
3007}
3008
Colin Crossca860ac2016-01-04 14:34:37 -08003009func (c *Module) InstallInData() bool {
3010 if c.installer == nil {
3011 return false
3012 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003013 return c.installer.inData()
3014}
3015
3016func (c *Module) InstallInSanitizerDir() bool {
3017 if c.installer == nil {
3018 return false
3019 }
3020 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003021 return true
3022 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003023 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003024}
3025
Yifan Hong1b3348d2020-01-21 15:53:22 -08003026func (c *Module) InstallInRamdisk() bool {
3027 return c.InRamdisk()
3028}
3029
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003030func (c *Module) InstallInVendorRamdisk() bool {
3031 return c.InVendorRamdisk()
3032}
3033
Jiyong Parkf9332f12018-02-01 00:54:12 +09003034func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003035 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003036}
3037
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003038func (c *Module) MakeUninstallable() {
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003039 if c.installer == nil {
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003040 c.ModuleBase.MakeUninstallable()
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003041 return
3042 }
Martin Stjernholm9e9bb7f2020-08-06 22:34:42 +01003043 c.installer.makeUninstallable(c)
Martin Stjernholmbf37d162020-03-31 16:05:34 +01003044}
3045
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003046func (c *Module) HostToolPath() android.OptionalPath {
3047 if c.installer == nil {
3048 return android.OptionalPath{}
3049 }
3050 return c.installer.hostToolPath()
3051}
3052
Nan Zhangd4e641b2017-07-12 12:55:28 -07003053func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3054 return c.outputFile
3055}
3056
Colin Cross41955e82019-05-29 14:40:35 -07003057func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3058 switch tag {
3059 case "":
3060 if c.outputFile.Valid() {
3061 return android.Paths{c.outputFile.Path()}, nil
3062 }
3063 return android.Paths{}, nil
3064 default:
3065 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003066 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003067}
3068
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003069func (c *Module) static() bool {
3070 if static, ok := c.linker.(interface {
3071 static() bool
3072 }); ok {
3073 return static.static()
3074 }
3075 return false
3076}
3077
Jiyong Park379de2f2018-12-19 02:47:14 +09003078func (c *Module) staticBinary() bool {
3079 if static, ok := c.linker.(interface {
3080 staticBinary() bool
3081 }); ok {
3082 return static.staticBinary()
3083 }
3084 return false
3085}
3086
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003087func (c *Module) testBinary() bool {
3088 if test, ok := c.linker.(interface {
3089 testBinary() bool
3090 }); ok {
3091 return test.testBinary()
3092 }
3093 return false
3094}
3095
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003096// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3097func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003098 if h, ok := c.linker.(interface {
3099 header() bool
3100 }); ok {
3101 return h.header()
3102 }
3103 return false
3104}
3105
Ivan Lozanod7586b62021-04-01 09:49:36 -04003106func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003107 if b, ok := c.linker.(interface {
3108 binary() bool
3109 }); ok {
3110 return b.binary()
3111 }
3112 return false
3113}
3114
Ivan Lozanod7586b62021-04-01 09:49:36 -04003115func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003116 if o, ok := c.linker.(interface {
3117 object() bool
3118 }); ok {
3119 return o.object()
3120 }
3121 return false
3122}
3123
Ivan Lozanof9e21722020-12-02 09:00:51 -05003124func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003125 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003126 if c.IsLlndk() {
3127 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003128 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003129 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003130 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003131 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003132 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003133 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003134 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003135 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003136 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003137 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003138 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003139 return "native:product"
3140 }
Jooyung Han38002912019-05-16 04:01:54 +09003141 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003142 } else if c.InRamdisk() {
3143 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003144 } else if c.InVendorRamdisk() {
3145 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003146 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003147 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003148 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003149 return "native:ndk:none:none"
3150 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3151 //family, link := getNdkStlFamilyAndLinkType(c)
3152 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003153 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003154 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003155 } else {
3156 return "native:platform"
3157 }
3158}
3159
Jiyong Park9d452992018-10-03 00:38:19 +09003160// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003161// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003162func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003163 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003164 // Stub libs and prebuilt libs in a versioned SDK are not
3165 // installable to APEX even though they are shared libs.
Colin Cross31076b32020-10-23 17:22:06 -07003166 return lib.shared() && !lib.buildStubs() && c.ContainingSdk().Unversioned()
Roland Levillainf89cd092019-07-29 16:22:59 +01003167 } else if _, ok := c.linker.(testPerSrc); ok {
3168 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003169 }
3170 return false
3171}
3172
Jiyong Parka90ca002019-10-07 15:47:24 +09003173func (c *Module) AvailableFor(what string) bool {
3174 if linker, ok := c.linker.(interface {
3175 availableFor(string) bool
3176 }); ok {
3177 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3178 } else {
3179 return c.ApexModuleBase.AvailableFor(what)
3180 }
3181}
3182
Jiyong Park62304bb2020-04-13 16:19:48 +09003183func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003184 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003185}
3186
Colin Crossaede88c2020-08-11 12:17:01 -07003187func (c *Module) UniqueApexVariations() bool {
3188 if u, ok := c.compiler.(interface {
3189 uniqueApexVariations() bool
3190 }); ok {
3191 return u.uniqueApexVariations()
3192 } else {
3193 return false
3194 }
3195}
3196
Paul Duffin0cb37b92020-03-04 14:52:46 +00003197func (c *Module) EverInstallable() bool {
3198 return c.installer != nil &&
3199 // Check to see whether the module is actually ever installable.
3200 c.installer.everInstallable()
3201}
3202
Ivan Lozanod7586b62021-04-01 09:49:36 -04003203func (c *Module) PreventInstall() bool {
3204 return c.Properties.PreventInstall
3205}
3206
3207func (c *Module) Installable() *bool {
3208 return c.Properties.Installable
3209}
3210
3211func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003212 ret := c.EverInstallable() &&
3213 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003214 proptools.BoolDefault(c.Installable(), true) &&
3215 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003216
3217 // The platform variant doesn't need further condition. Apex variants however might not
3218 // be installable because it will likely to be included in the APEX and won't appear
3219 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003220 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003221 return ret
3222 }
3223
3224 // Special case for modules that are configured to be installed to /data, which includes
3225 // test modules. For these modules, both APEX and non-APEX variants are considered as
3226 // installable. This is because even the APEX variants won't be included in the APEX, but
3227 // will anyway be installed to /data/*.
3228 // See b/146995717
3229 if c.InstallInData() {
3230 return ret
3231 }
3232
3233 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003234}
3235
Logan Chien41eabe62019-04-10 13:33:58 +08003236func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3237 if c.linker != nil {
3238 if library, ok := c.linker.(*libraryDecorator); ok {
3239 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3240 }
3241 }
3242}
3243
Jiyong Park45bf82e2020-12-15 22:29:02 +09003244var _ android.ApexModule = (*Module)(nil)
3245
3246// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003247func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003248 depTag := ctx.OtherModuleDependencyTag(dep)
3249 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3250
3251 if cc, ok := dep.(*Module); ok {
3252 if cc.HasStubsVariants() {
3253 if isLibDepTag && libDepTag.shared() {
3254 // dynamic dep to a stubs lib crosses APEX boundary
3255 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003256 }
Colin Cross6e511a92020-07-27 21:26:48 -07003257 if IsRuntimeDepTag(depTag) {
3258 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003259 return false
3260 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003261 }
Zhijun Heec285872021-04-24 10:47:08 -07003262 if cc.IsLlndk() {
3263 return false
3264 }
Colin Crossaac32222020-07-29 12:51:56 -07003265 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003266 // shared_lib dependency from a static lib is considered as crossing
3267 // the APEX boundary because the dependency doesn't actually is
3268 // linked; the dependency is used only during the compilation phase.
3269 return false
3270 }
Jiyong Parke3867542020-12-03 17:28:25 +09003271
3272 if isLibDepTag && libDepTag.excludeInApex {
3273 return false
3274 }
Colin Cross6e511a92020-07-27 21:26:48 -07003275 }
Colin Crossc1b36442021-05-06 13:42:48 -07003276 if depTag == stubImplDepTag {
3277 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003278 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003279 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003280 if depTag == staticVariantTag {
3281 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3282 // actually mean that the static lib (and its dependencies) are copied into the
3283 // APEX.
3284 return false
3285 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003286 return true
3287}
3288
Jiyong Park45bf82e2020-12-15 22:29:02 +09003289// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003290func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3291 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003292 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3293 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3294 return nil
3295 }
3296 // b/154569636: set min_sdk_version correctly for toolchain_libraries
3297 if c.ToolchainLibrary() {
3298 return nil
3299 }
3300 // We don't check for prebuilt modules
3301 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3302 return nil
3303 }
3304 minSdkVersion := c.MinSdkVersion()
3305 if minSdkVersion == "apex_inherit" {
3306 return nil
3307 }
3308 if minSdkVersion == "" {
3309 // JNI libs within APK-in-APEX fall into here
3310 // Those are okay to set sdk_version instead
3311 // We don't have to check if this is a SDK variant because
3312 // non-SDK variant resets sdk_version, which works too.
3313 minSdkVersion = c.SdkVersion()
3314 }
Dan Albertc8060532020-07-22 22:32:17 -07003315 if minSdkVersion == "" {
3316 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3317 }
3318 // Not using nativeApiLevelFromUser because the context here is not
3319 // necessarily a native context.
3320 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003321 if err != nil {
3322 return err
3323 }
Dan Albertc8060532020-07-22 22:32:17 -07003324
3325 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003326 return fmt.Errorf("newer SDK(%v)", ver)
3327 }
3328 return nil
3329}
3330
Paul Duffinb5769c12021-05-12 16:16:51 +01003331// Implements android.ApexModule
3332func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3333 // stub libraries and native bridge libraries are always available to platform
3334 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3335}
3336
Colin Cross2ba19d92015-05-07 15:44:20 -07003337//
Colin Crosscfad1192015-11-02 16:43:11 -08003338// Defaults
3339//
Colin Crossca860ac2016-01-04 14:34:37 -08003340type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07003341 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07003342 android.DefaultsModuleBase
Liz Kammer3cf52112021-03-31 15:42:03 -04003343 // Included to support setting bazel_module.label for multiple Soong modules to the same Bazel
3344 // target. This is primarily useful for modules that were architecture specific and instead are
3345 // handled in Bazel as a select().
3346 android.BazelModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09003347 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08003348}
3349
Patrice Arrudac249c712019-03-19 17:00:29 -07003350// cc_defaults provides a set of properties that can be inherited by other cc
3351// modules. A module can use the properties from a cc_defaults using
3352// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3353// merged (when possible) by prepending the default module's values to the
3354// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003355func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003356 return DefaultsFactory()
3357}
3358
Colin Cross36242852017-06-23 15:06:31 -07003359func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003360 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003361
Colin Cross36242852017-06-23 15:06:31 -07003362 module.AddProperties(props...)
3363 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003364 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003365 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003366 &BaseCompilerProperties{},
3367 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003368 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003369 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003370 &StaticProperties{},
3371 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003372 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003373 &BinaryLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003374 &TestProperties{},
3375 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003376 &BenchmarkProperties{},
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -07003377 &FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003378 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003379 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003380 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003381 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003382 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003383 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003384 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09003385 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003386 &LTOProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07003387 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003388 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003389 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3390 &RustBindgenClangProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003391 )
Colin Crosscfad1192015-11-02 16:43:11 -08003392
Liz Kammer3cf52112021-03-31 15:42:03 -04003393 // Bazel module must be initialized _before_ Defaults to be included in cc_defaults module.
3394 android.InitBazelModule(module)
Jooyung Hancc372c52019-09-25 15:18:44 +09003395 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003396
3397 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003398}
3399
Jiyong Park2286afd2020-06-16 21:58:53 +09003400func (c *Module) IsSdkVariant() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07003401 return c.Properties.IsSdkVariant || c.AlwaysSdk()
Jiyong Park2286afd2020-06-16 21:58:53 +09003402}
3403
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003404func kytheExtractAllFactory() android.Singleton {
3405 return &kytheExtractAllSingleton{}
3406}
3407
3408type kytheExtractAllSingleton struct {
3409}
3410
3411func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3412 var xrefTargets android.Paths
3413 ctx.VisitAllModules(func(module android.Module) {
3414 if ccModule, ok := module.(xref); ok {
3415 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
3416 }
3417 })
3418 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
3419 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07003420 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003421 }
3422}
3423
Colin Cross06a931b2015-10-28 17:23:31 -07003424var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07003425var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08003426var BoolPtr = proptools.BoolPtr
3427var String = proptools.String
3428var StringPtr = proptools.StringPtr