blob: f2c852573b25c73317bcd9b2708c21ebc7013328 [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
Vinh Tran367d89d2023-04-28 11:21:25 -040030 "android/soong/aidl_library"
Colin Cross635c3b02016-05-18 15:37:25 -070031 "android/soong/android"
Sam Delmerico5fb794a2023-01-27 16:01:37 -050032 "android/soong/bazel/cquery"
Colin Crossb98c8b02016-07-29 13:44:28 -070033 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070034 "android/soong/fuzz"
Colin Cross5049f022015-03-18 13:28:46 -070035 "android/soong/genrule"
Kiyoung Kim487689e2022-07-26 09:48:22 +090036 "android/soong/multitree"
Rob Seymour925aa092021-08-10 20:42:03 +000037 "android/soong/snapshot"
Colin Cross3f40fa42015-01-30 17:27:36 -080038)
39
Colin Cross463a90e2015-06-17 14:20:06 -070040func init() {
Paul Duffin036e7002019-12-19 19:16:28 +000041 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -070042
Paul Duffin036e7002019-12-19 19:16:28 +000043 pctx.Import("android/soong/cc/config")
44}
45
46func RegisterCCBuildComponents(ctx android.RegistrationContext) {
47 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
48
49 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossc511bc52020-04-07 16:50:32 +000050 ctx.BottomUp("sdk", sdkMutator).Parallel()
Inseob Kim64c43952019-08-26 16:52:35 +090051 ctx.BottomUp("vndk", VndkMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070052 ctx.BottomUp("link", LinkageMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +010053 ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
Colin Crossd1f898e2020-08-18 18:35:15 -070054 ctx.BottomUp("version", versionMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070055 ctx.BottomUp("begin", BeginMutator).Parallel()
Vinh Tran44cb78c2023-03-09 22:07:19 -050056 ctx.BottomUp("fdo_profile", fdoProfileMutator)
Colin Cross1e676be2016-10-12 14:38:15 -070057 })
Colin Cross16b23492016-01-06 14:41:07 -080058
Paul Duffin036e7002019-12-19 19:16:28 +000059 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -040060 for _, san := range Sanitizers {
61 san.registerMutators(ctx)
62 }
Dan Willemsen581341d2017-02-09 16:16:31 -080063
Colin Cross0b908332019-06-19 23:00:20 -070064 ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel()
Jiyong Park379de2f2018-12-19 02:47:14 +090065 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
Ivan Lozano30c5db22018-02-21 15:49:20 -080066
Cory Barkera1da26f2022-06-07 20:12:06 +000067 ctx.TopDown("fuzz_deps", fuzzMutatorDeps)
Cory Barkera1da26f2022-06-07 20:12:06 +000068
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -080069 ctx.BottomUp("coverage", coverageMutator).Parallel()
Stephen Craneba090d12017-05-09 15:44:35 -070070
Yi Kongeb8efc92021-12-09 18:06:29 +080071 ctx.TopDown("afdo_deps", afdoDepsMutator)
72 ctx.BottomUp("afdo", afdoMutator).Parallel()
73
Stephen Craneba090d12017-05-09 15:44:35 -070074 ctx.TopDown("lto_deps", ltoDepsMutator)
75 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090076
Jooyung Han479ca172020-10-19 18:51:07 +090077 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090078 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070079 })
Colin Crossb98c8b02016-07-29 13:44:28 -070080
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080081 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
82 // sabi mutator needs to be run after apex mutator finishes.
83 ctx.TopDown("sabi_deps", sabiDepsMutator)
84 })
85
LaMont Jones0c10e4d2023-05-16 00:58:37 +000086 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070087}
88
Chris Parsonsef6e0cf2020-12-01 18:26:21 -050089// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
90// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
91// edges to these modules.
92// This object is constructed in DepsMutator, by calling to various module delegates to set
93// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
94// dependencies.
95// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
96// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -080097type Deps struct {
98 SharedLibs, LateSharedLibs []string
99 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800100 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800101 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700102
Colin Cross3e5e7782022-06-17 22:17:05 +0000103 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
104 // prevent automatically exporting symbols.
105 UnexportedStaticLibs []string
106
Chris Parsons79d66a52020-06-05 17:26:16 -0400107 // Used for data dependencies adjacent to tests
108 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700109 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400110
Yo Chiang219968c2020-09-22 18:45:04 +0800111 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
112 SystemSharedLibs []string
113
Vinh Tran367d89d2023-04-28 11:21:25 -0400114 // Used by DepMutator to pass aidl_library modules to aidl compiler
115 AidlLibs []string
116
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500117 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800118 StaticUnwinderIfLegacy bool
119
Colin Cross5950f382016-12-13 12:50:57 -0800120 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700121
Colin Cross81413472016-04-11 14:37:39 -0700122 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700123
Dan Willemsenb40aab62016-04-20 14:21:14 -0700124 GeneratedSources []string
125 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900126 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700127
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700128 ReexportGeneratedHeaders []string
129
Colin Crossc465efd2021-06-11 18:00:04 -0700130 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700131
132 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700133 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
Colin Cross3e5e7782022-06-17 22:17:05 +0000171 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900172 IncludeDirs android.Paths
173 SystemIncludeDirs android.Paths
174 ReexportedDirs android.Paths
175 ReexportedSystemDirs android.Paths
176 ReexportedFlags []string
177 ReexportedGeneratedHeaders android.Paths
178 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700179
Colin Cross26c34ed2016-09-30 17:10:16 -0700180 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700181 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700182
Dan Willemsena0790e32018-10-12 00:24:23 -0700183 // Path to the dynamic linker binary
184 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700185
186 // For Darwin builds, the path to the second architecture's output that should
187 // be combined with this architectures's output into a FAT MachO file.
188 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400189
190 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
191 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700192}
193
Colin Cross4af21ed2019-11-04 09:37:55 -0800194// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
195// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
196// command line so they can be overridden by the local module flags).
197type LocalOrGlobalFlags struct {
198 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700199 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800200 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700201 CFlags []string // Flags that apply to C and C++ source files
202 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
203 ConlyFlags []string // Flags that apply to C source files
204 CppFlags []string // Flags that apply to C++ source files
205 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700206 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800207}
208
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500209// Flags contains various types of command line flags (and settings) for use in building build
210// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800211type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500212 // Local flags (which individual modules are responsible for). These may override global flags.
213 Local LocalOrGlobalFlags
214 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800215 Global LocalOrGlobalFlags
216
217 aidlFlags []string // Flags that apply to aidl source files
218 rsFlags []string // Flags that apply to renderscript source files
219 libFlags []string // Flags to add libraries early to the link order
220 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
221 TidyFlags []string // Flags that apply to clang-tidy
222 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700223
Colin Crossc3199482017-03-30 15:03:04 -0700224 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800225 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700226 SystemIncludeFlags []string
227
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800228 Toolchain config.Toolchain
229 Tidy bool // True if ninja .tidy rules should be generated.
230 NeedTidyFiles bool // True if module link should depend on .tidy files
231 GcovCoverage bool // True if coverage files should be generated.
232 SAbiDump bool // True if header abi dumps should be generated.
233 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800234
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500235 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800236 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500237 // The target-device system path to the dynamic linker.
238 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800239
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700240 CFlagsDeps android.Paths // Files depended on by compiler flags
241 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800242
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500243 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700244 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800245
Colin Cross19878da2019-03-28 14:45:07 -0700246 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700247 protoC bool // Whether to use C instead of C++
248 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700249
250 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200251 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700252}
253
Colin Crossca860ac2016-01-04 14:34:37 -0800254// Properties used to compile all C or C++ modules
255type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700256 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800257 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700258
Jiyong Parkb35a8192020-08-10 15:59:36 +0900259 // The API level that this module is built against. The APIs of this API level will be
260 // visible at build time, but use of any APIs newer than min_sdk_version will render the
261 // module unloadable on older devices. In the future it will be possible to weakly-link new
262 // APIs, making the behavior match Java: such modules will load on older devices, but
263 // calling new APIs on devices that do not support them will result in a crash.
264 //
265 // This property has the same behavior as sdk_version does for Java modules. For those
266 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
267 // does for Java code.
268 //
269 // In addition, setting this property causes two variants to be built, one for the platform
270 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800271 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700272
Jiyong Parkb35a8192020-08-10 15:59:36 +0900273 // Minimum OS API level supported by this C or C++ module. This property becomes the value
274 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
275 // this property is also used to ensure that the min_sdk_version of the containing module is
276 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
277 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
278 // min_sdk_version of the containing APEX. When the module
279 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900280 Min_sdk_version *string
281
Colin Crossc511bc52020-04-07 16:50:32 +0000282 // If true, always create an sdk variant and don't create a platform variant.
283 Sdk_variant_only *bool
284
Jiyong Parkde866cb2018-12-07 23:08:36 +0900285 AndroidMkSharedLibs []string `blueprint:"mutated"`
286 AndroidMkStaticLibs []string `blueprint:"mutated"`
287 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
288 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700289 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900290 HideFromMake bool `blueprint:"mutated"`
291 PreventInstall bool `blueprint:"mutated"`
292 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700293
Yo Chiang219968c2020-09-22 18:45:04 +0800294 // Set by DepsMutator.
295 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
296
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200297 // The name of the image this module is built for, suffixed with a '.'
Justin Yun5f7f7e82019-11-18 19:52:14 +0900298 ImageVariationPrefix string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200299
300 // The VNDK version this module is built against. If empty, the module is not
301 // build against the VNDK.
302 VndkVersion string `blueprint:"mutated"`
303
304 // Suffix for the name of Android.mk entries generated by this module
305 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800306
307 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
308 // file
309 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900310
Yifan Hong39143a92020-10-26 12:43:12 -0700311 // Make this module available when building for ramdisk.
312 // On device without a dedicated recovery partition, the module is only
313 // available after switching root into
314 // /first_stage_ramdisk. To expose the module before switching root, install
315 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800316 Ramdisk_available *bool
317
Yifan Hong39143a92020-10-26 12:43:12 -0700318 // Make this module available when building for vendor ramdisk.
319 // On device without a dedicated recovery partition, the module is only
320 // available after switching root into
321 // /first_stage_ramdisk. To expose the module before switching root, install
322 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700323 Vendor_ramdisk_available *bool
324
Jiyong Parkf9332f12018-02-01 00:54:12 +0900325 // Make this module available when building for recovery
326 Recovery_available *bool
327
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200328 // Used by imageMutator, set by ImageMutatorBegin()
329 CoreVariantNeeded bool `blueprint:"mutated"`
330 RamdiskVariantNeeded bool `blueprint:"mutated"`
331 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
332 RecoveryVariantNeeded bool `blueprint:"mutated"`
333
334 // A list of variations for the "image" mutator of the form
335 //<image name> '.' <version char>, for example, 'vendor.S'
336 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900337
338 // Allows this module to use non-APEX version of libraries. Useful
339 // for building binaries that are started before APEXes are activated.
340 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900341
342 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
343 // see soong/cc/config/vndk.go
344 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900345
346 // Used by vendor snapshot to record dependencies from snapshot modules.
347 SnapshotSharedLibs []string `blueprint:"mutated"`
Justin Yun5e035862021-06-29 20:50:37 +0900348 SnapshotStaticLibs []string `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900349 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000350
Colin Cross1bc94122021-10-28 13:25:54 -0700351 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000352
353 // Set by factories of module types that can only be referenced from variants compiled against
354 // the SDK.
355 AlwaysSdk bool `blueprint:"mutated"`
356
357 // Variant is an SDK variant created by sdkMutator
358 IsSdkVariant bool `blueprint:"mutated"`
359 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
360 // variant to have a ".sdk" suffix.
361 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700362
363 // Normally Soong uses the directory structure to decide which modules
364 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800365 // different snapshots (vendor, recovery, etc.), but this property
366 // allows a partner to exclude a module normally thought of as a
367 // framework module from the vendor snapshot.
368 Exclude_from_vendor_snapshot *bool
369
370 // Normally Soong uses the directory structure to decide which modules
371 // should be included (framework) or excluded (non-framework) from the
372 // different snapshots (vendor, recovery, etc.), but this property
373 // allows a partner to exclude a module normally thought of as a
374 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800375 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900376
377 // List of APEXes that this module has private access to for testing purpose. The module
378 // can depend on libraries that are not exported by the APEXes and use private symbols
379 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000380 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800381
382 Target struct {
383 Platform struct {
384 // List of modules required by the core variant.
385 Required []string `android:"arch_variant"`
386
387 // List of modules not required by the core variant.
388 Exclude_required []string `android:"arch_variant"`
389 } `android:"arch_variant"`
390
391 Recovery struct {
392 // List of modules required by the recovery variant.
393 Required []string `android:"arch_variant"`
394
395 // List of modules not required by the recovery variant.
396 Exclude_required []string `android:"arch_variant"`
397 } `android:"arch_variant"`
398 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700399}
400
401type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900402 // whether this module should be allowed to be directly depended by other
403 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900404 // If set to true, two variants will be built separately, one like
405 // normal, and the other limited to the set of libraries and headers
406 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700407 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900408 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700409 // so it shouldn't have any unversioned runtime dependencies, or
410 // make assumptions about the system that may not be true in the
411 // future.
412 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900413 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900414 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900415 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900416 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900417 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700418 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
419 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900420
Justin Yunebcf0c52021-01-08 18:00:19 +0900421 // This is the same as the "vendor_available" except that the install path
422 // of the vendor variant is /odm or /vendor/odm.
423 // By replacing "vendor_available: true" with "odm_available: true", the
424 // module will install its vendor variant to the /odm partition or /vendor/odm.
425 // As the modules with "odm_available: true" still create the vendor variants,
426 // they can link to the other vendor modules as the vendor_available modules do.
427 // Also, the vendor modules can link to odm_available modules.
428 //
429 // It may not be used for VNDK modules.
430 Odm_available *bool
431
Justin Yun63e9ec72020-10-29 16:49:43 +0900432 // whether this module should be allowed to be directly depended by other
433 // modules with `product_specific: true` or `product_available: true`.
434 // If set to true, an additional product variant will be built separately
435 // that is limited to the set of libraries and headers that are exposed to
436 // /product modules.
437 //
438 // The product variant may be used with a different (newer) /system,
439 // so it shouldn't have any unversioned runtime dependencies, or
440 // make assumptions about the system that may not be true in the
441 // future.
442 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900443 // If set to false, this module becomes inaccessible from /product modules.
444 //
445 // Different from the 'vendor_available' property, the modules with
446 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
447 // library without 'product_available' may not be depended on by any other
448 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900449 //
450 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
451 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
452 Product_available *bool
453
Jiyong Park5fb8c102018-04-09 12:03:06 +0900454 // whether this module is capable of being loaded with other instance
455 // (possibly an older version) of the same module in the same process.
456 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
457 // can be double loaded in a vendor process if the library is also a
458 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
459 // explicitly marked as `double_loadable: true` by the owner, or the dependency
460 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
461 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800462
463 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
464 IsLLNDK bool `blueprint:"mutated"`
465
Colin Cross78212242021-01-06 14:51:30 -0800466 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
467 // set and the module is not listed in VndkMustUseVendorVariantList.
468 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
469
470 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
471 IsVNDKCore bool `blueprint:"mutated"`
472
473 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
474 IsVNDKSP bool `blueprint:"mutated"`
475
476 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
477 // module sets the llndk.private property.
478 IsVNDKPrivate bool `blueprint:"mutated"`
479
480 // IsVNDKProduct is set if a VNDK module sets the product_available property.
481 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700482
483 // IsVendorPublicLibrary is set for the core and product variants of a library that has
484 // vendor_public_library stubs.
485 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800486}
487
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500488// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
489// to understanding details about the type of the current module.
490// For example, one might call these functions to determine whether the current module is a static
491// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800492type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800493 static() bool
494 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700495 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800496 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900497 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900498 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900499 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700500 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900501 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700502 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800503 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900504 minSdkVersion() string
505 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700506 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700507 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800508 IsLlndk() bool
509 IsLlndkPublic() bool
510 isImplementationForLLNDKPublic() bool
511 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900512 isVndk() bool
513 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500514 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700515 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900516 inProduct() bool
517 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800518 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700519 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900520 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700521 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700522 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800523 getVndkExtendsModuleName() string
Yi Kong4ef54592022-02-14 20:00:10 +0800524 isAfdoCompile() bool
Yi Kong7e53c572018-02-14 18:16:12 +0800525 isPgoCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800526 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900527 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800528 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800529 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800530 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700531 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700532 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900533 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800534 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700535 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700536 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800537 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800538 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800539 getSharedFlags() *SharedFlags
540}
541
542type SharedFlags struct {
543 numSharedFlags int
544 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800545}
546
547type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700548 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800549 ModuleContextIntf
550}
551
552type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700553 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800554 ModuleContextIntf
555}
556
Colin Cross37047f12016-12-13 17:06:13 -0800557type DepsContext interface {
558 android.BottomUpMutatorContext
559 ModuleContextIntf
560}
561
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500562// feature represents additional (optional) steps to building cc-related modules, such as invocation
563// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800564type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800565 flags(ctx ModuleContext, flags Flags) Flags
566 props() []interface{}
567}
568
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500569// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500570// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800571type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700572 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800573 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800574 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700575 compilerProps() []interface{}
576
Colin Cross76fada02016-07-27 10:31:13 -0700577 appendCflags([]string)
578 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700579 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800580}
581
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500582// linker is the interface for a linker decorator object. Individual module types can provide
583// their own implementation for this decorator, and thus specify custom logic regarding build
584// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800585type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700586 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800587 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700588 linkerFlags(ctx ModuleContext, flags Flags) Flags
589 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800590 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700591
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700592 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700593 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900594 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700595
596 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900597 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000598
599 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000600 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
601}
602
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500603// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000604type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500605 sharedLibs []string
606 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
607 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700608 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800609}
610
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500611// installer is the interface for an installer helper object. This helper is responsible for
612// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800613type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700614 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700615 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000616 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800617 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700618 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700619 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900620 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000621 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900622 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800623}
624
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800625type xref interface {
626 XrefCcFiles() android.Paths
627}
628
Inseob Kima1888ce2022-10-04 14:42:02 +0900629type overridable interface {
630 overriddenModules() []string
631}
632
Colin Cross6e511a92020-07-27 21:26:48 -0700633type libraryDependencyKind int
634
635const (
636 headerLibraryDependency = iota
637 sharedLibraryDependency
638 staticLibraryDependency
639)
640
641func (k libraryDependencyKind) String() string {
642 switch k {
643 case headerLibraryDependency:
644 return "headerLibraryDependency"
645 case sharedLibraryDependency:
646 return "sharedLibraryDependency"
647 case staticLibraryDependency:
648 return "staticLibraryDependency"
649 default:
650 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
651 }
652}
653
654type libraryDependencyOrder int
655
656const (
657 earlyLibraryDependency = -1
658 normalLibraryDependency = 0
659 lateLibraryDependency = 1
660)
661
662func (o libraryDependencyOrder) String() string {
663 switch o {
664 case earlyLibraryDependency:
665 return "earlyLibraryDependency"
666 case normalLibraryDependency:
667 return "normalLibraryDependency"
668 case lateLibraryDependency:
669 return "lateLibraryDependency"
670 default:
671 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
672 }
673}
674
675// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
676// tags that have a set of predefined tag objects that are reused for each dependency, a
677// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
678// That means that comparing a libraryDependencyTag for equality will only be equal if all
679// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
680// then check individual metadata fields instead.
681type libraryDependencyTag struct {
682 blueprint.BaseDependencyTag
683
684 // These are exported so that fmt.Printf("%#v") can call their String methods.
685 Kind libraryDependencyKind
686 Order libraryDependencyOrder
687
688 wholeStatic bool
689
690 reexportFlags bool
691 explicitlyVersioned bool
692 dataLib bool
693 ndk bool
694
695 staticUnwinder bool
696
697 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900698
Cindy Zhou18417cb2020-12-10 07:12:38 -0800699 // Whether or not this dependency should skip the apex dependency check
700 skipApexAllowedDependenciesCheck bool
701
Jiyong Parke3867542020-12-03 17:28:25 +0900702 // Whether or not this dependency has to be followed for the apex variants
703 excludeInApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000704
705 // If true, don't automatically export symbols from the static library into a shared library.
706 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700707}
708
709// header returns true if the libraryDependencyTag is tagging a header lib dependency.
710func (d libraryDependencyTag) header() bool {
711 return d.Kind == headerLibraryDependency
712}
713
714// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
715func (d libraryDependencyTag) shared() bool {
716 return d.Kind == sharedLibraryDependency
717}
718
719// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
720func (d libraryDependencyTag) static() bool {
721 return d.Kind == staticLibraryDependency
722}
723
Colin Cross65cb3142021-12-10 23:05:02 +0000724func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
725 if d.shared() {
726 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
727 }
728 return nil
729}
730
731var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
732
Colin Crosse9fe2942020-11-10 18:12:15 -0800733// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
734// binaries or other shared libraries are installed as dependencies.
735func (d libraryDependencyTag) InstallDepNeeded() bool {
736 return d.shared()
737}
738
739var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
740
741// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700742// libraryDependencyTag. Each tag object is created globally and reused for multiple
743// dependencies (although since the object contains no references, assigning a tag to a
744// variable and modifying it will not modify the original). Users can compare the tag
745// returned by ctx.OtherModuleDependencyTag against the global original
746type dependencyTag struct {
747 blueprint.BaseDependencyTag
748 name string
749}
750
Colin Crosse9fe2942020-11-10 18:12:15 -0800751// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
752// libraryDependencyTag, but where the dependency needs to be installed when the parent is
753// installed.
754type installDependencyTag struct {
755 blueprint.BaseDependencyTag
756 android.InstallAlwaysNeededDependencyTag
757 name string
758}
759
Colin Crossc99deeb2016-04-11 15:06:20 -0700760var (
Colin Cross6e511a92020-07-27 21:26:48 -0700761 genSourceDepTag = dependencyTag{name: "gen source"}
762 genHeaderDepTag = dependencyTag{name: "gen header"}
763 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
764 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900765 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700766 reuseObjTag = dependencyTag{name: "reuse objects"}
767 staticVariantTag = dependencyTag{name: "static variant"}
768 vndkExtDepTag = dependencyTag{name: "vndk extends"}
769 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700770 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800771 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700772 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700773 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000774 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500775 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400776 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700777)
778
Roland Levillainf89cd092019-07-29 16:22:59 +0100779func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700780 ccLibDepTag, ok := depTag.(libraryDependencyTag)
781 return ok && ccLibDepTag.shared()
782}
783
784func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
785 ccLibDepTag, ok := depTag.(libraryDependencyTag)
786 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100787}
788
Zach Johnson3df4e632020-11-06 11:56:27 -0800789func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
790 ccLibDepTag, ok := depTag.(libraryDependencyTag)
791 return ok && ccLibDepTag.header()
792}
793
Roland Levillainf89cd092019-07-29 16:22:59 +0100794func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800795 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100796}
797
798func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700799 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100800 return ok && ccDepTag == testPerSrcDepTag
801}
802
Chris Parsonsf874e462022-05-10 13:50:12 -0400803// bazelHandler is the interface for a helper object related to deferring to Bazel for
804// processing a cc module (during Bazel mixed builds). Individual module types should define
805// their own bazel handler if they support being handled by Bazel.
806type BazelHandler interface {
807 // QueueBazelCall invokes request-queueing functions on the BazelContext
808 //so that these requests are handled when Bazel's cquery is invoked.
809 QueueBazelCall(ctx android.BaseModuleContext, label string)
810
811 // ProcessBazelQueryResponse uses information retrieved from Bazel to set properties
812 // on the current module with given label.
813 ProcessBazelQueryResponse(ctx android.ModuleContext, label string)
814}
815
Colin Crossca860ac2016-01-04 14:34:37 -0800816// Module contains the properties and members used by all C/C++ module types, and implements
817// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500818// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
819// interface.
820//
821// To define a C/C++ related module, construct a new Module object and point its delegates to
822// type-specific structs. These delegates will be invoked to register module-specific build
823// statements which may be unique to the module type. For example, module.compiler.compile() should
824// be defined so as to register build statements which are responsible for compiling the module.
825//
826// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
827// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
828// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
829// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800830type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700831 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700832
Liz Kammerea6666f2021-02-17 10:17:28 -0500833 android.BazelModuleBase
Colin Crossc472d572015-03-17 15:06:21 -0700834
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700835 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700836 Properties BaseProperties
Colin Crossfa138792015-04-24 17:31:52 -0700837
Colin Crossca860ac2016-01-04 14:34:37 -0800838 // initialize before calling Init
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400839 hod android.HostOrDeviceSupported
840 multilib android.Multilib
841 bazelable bool
Colin Crossc472d572015-03-17 15:06:21 -0700842
Paul Duffina0843f62019-12-13 19:50:38 +0000843 // Allowable SdkMemberTypes of this module type.
844 sdkMemberTypes []android.SdkMemberType
845
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500846 // decorator delegates, initialize before calling Init
847 // these may contain module-specific implementations, and effectively allow for custom
848 // type-specific logic. These members may reference different objects or the same object.
849 // Functions of these decorators will be invoked to initialize and register type-specific
850 // build statements.
Chris Parsons8d6e4332021-02-22 16:13:50 -0500851 compiler compiler
852 linker linker
853 installer installer
Chris Parsonsf874e462022-05-10 13:50:12 -0400854 bazelHandler BazelHandler
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500855
856 features []feature
857 stl *stl
858 sanitize *sanitize
859 coverage *coverage
Cory Barkera1da26f2022-06-07 20:12:06 +0000860 fuzzer *fuzzer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500861 sabi *sabi
862 vndkdep *vndkdep
863 lto *lto
Yi Kongeb8efc92021-12-09 18:06:29 +0800864 afdo *afdo
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500865 pgo *pgo
Colin Cross16b23492016-01-06 14:41:07 -0800866
Colin Cross31076b32020-10-23 17:22:06 -0700867 library libraryInterface
868
Colin Cross635c3b02016-05-18 15:37:25 -0700869 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800870
Colin Crossb98c8b02016-07-29 13:44:28 -0700871 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700872
873 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800874
875 // Flags used to compile this module
876 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700877
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800878 // Shared flags among build rules of this module
879 sharedFlags SharedFlags
880
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800881 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700882 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900883
884 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800885 // Kythe (source file indexer) paths for this compilation module
886 kytheFiles android.Paths
Chih-Hung Hsieh80783772021-10-11 16:46:56 -0700887 // Object .o file output paths for this compilation module
888 objFiles android.Paths
889 // Tidy .tidy file output paths for this compilation module
890 tidyFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900891
892 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700893 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700894
895 hideApexVariantFromMake bool
Colin Crossc472d572015-03-17 15:06:21 -0700896}
897
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200898func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400899 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
900 if b, ok := c.compiler.(*baseCompiler); ok {
901 hasAidl = b.hasSrcExt(".aidl")
902 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
903 hasProto = b.hasSrcExt(".proto")
904 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
905 hasSysprop = b.hasSrcExt(".sysprop")
906 hasWinMsg = b.hasSrcExt(".mc")
907 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
908 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200909 c.AndroidModuleBase().AddJSONData(d)
910 (*d)["Cc"] = map[string]interface{}{
911 "SdkVersion": c.SdkVersion(),
912 "MinSdkVersion": c.MinSdkVersion(),
913 "VndkVersion": c.VndkVersion(),
914 "ProductSpecific": c.ProductSpecific(),
915 "SocSpecific": c.SocSpecific(),
916 "DeviceSpecific": c.DeviceSpecific(),
917 "InProduct": c.InProduct(),
918 "InVendor": c.InVendor(),
919 "InRamdisk": c.InRamdisk(),
920 "InVendorRamdisk": c.InVendorRamdisk(),
921 "InRecovery": c.InRecovery(),
922 "VendorAvailable": c.VendorAvailable(),
923 "ProductAvailable": c.ProductAvailable(),
924 "RamdiskAvailable": c.RamdiskAvailable(),
925 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
926 "RecoveryAvailable": c.RecoveryAvailable(),
927 "OdmAvailable": c.OdmAvailable(),
928 "InstallInData": c.InstallInData(),
929 "InstallInRamdisk": c.InstallInRamdisk(),
930 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
931 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
932 "InstallInRecovery": c.InstallInRecovery(),
933 "InstallInRoot": c.InstallInRoot(),
934 "IsVndk": c.IsVndk(),
935 "IsVndkExt": c.IsVndkExt(),
936 "IsVndkPrivate": c.IsVndkPrivate(),
937 "IsVndkSp": c.IsVndkSp(),
938 "IsLlndk": c.IsLlndk(),
939 "IsLlndkPublic": c.IsLlndkPublic(),
940 "IsSnapshotLibrary": c.IsSnapshotLibrary(),
941 "IsSnapshotPrebuilt": c.IsSnapshotPrebuilt(),
942 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
943 "ApexSdkVersion": c.apexSdkVersion,
944 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400945 "AidlSrcs": hasAidl,
946 "LexSrcs": hasLex,
947 "ProtoSrcs": hasProto,
948 "RenderscriptSrcs": hasRenderscript,
949 "SyspropSrcs": hasSysprop,
950 "WinMsgSrcs": hasWinMsg,
951 "YaccSrsc": hasYacc,
952 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200953 }
954}
955
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500956func (c *Module) SetPreventInstall() {
957 c.Properties.PreventInstall = true
958}
959
960func (c *Module) SetHideFromMake() {
961 c.Properties.HideFromMake = true
962}
963
Ivan Lozanod7586b62021-04-01 09:49:36 -0400964func (c *Module) HiddenFromMake() bool {
965 return c.Properties.HideFromMake
966}
967
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800968func (c *Module) RequiredModuleNames() []string {
969 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
970 if c.ImageVariation().Variation == android.CoreVariation {
971 required = append(required, c.Properties.Target.Platform.Required...)
972 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
973 } else if c.InRecovery() {
974 required = append(required, c.Properties.Target.Recovery.Required...)
975 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
976 }
977 return android.FirstUniqueStrings(required)
978}
979
Ivan Lozano52767be2019-10-18 14:49:46 -0700980func (c *Module) Toc() android.OptionalPath {
981 if c.linker != nil {
982 if library, ok := c.linker.(libraryInterface); ok {
983 return library.toc()
984 }
985 }
986 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
987}
988
989func (c *Module) ApiLevel() string {
990 if c.linker != nil {
991 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700992 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700993 }
994 }
995 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
996}
997
998func (c *Module) Static() bool {
999 if c.linker != nil {
1000 if library, ok := c.linker.(libraryInterface); ok {
1001 return library.static()
1002 }
1003 }
1004 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1005}
1006
1007func (c *Module) Shared() bool {
1008 if c.linker != nil {
1009 if library, ok := c.linker.(libraryInterface); ok {
1010 return library.shared()
1011 }
1012 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001013
Ivan Lozano52767be2019-10-18 14:49:46 -07001014 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1015}
1016
1017func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001018 if c.stl != nil {
1019 return c.stl.Properties.SelectedStl
1020 }
1021 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001022}
1023
Ivan Lozano52767be2019-10-18 14:49:46 -07001024func (c *Module) NdkPrebuiltStl() bool {
1025 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1026 return true
1027 }
1028 return false
1029}
1030
1031func (c *Module) StubDecorator() bool {
1032 if _, ok := c.linker.(*stubDecorator); ok {
1033 return true
1034 }
1035 return false
1036}
1037
1038func (c *Module) SdkVersion() string {
1039 return String(c.Properties.Sdk_version)
1040}
1041
Artur Satayev480e25b2020-04-27 18:53:18 +01001042func (c *Module) MinSdkVersion() string {
1043 return String(c.Properties.Min_sdk_version)
1044}
1045
Jiyong Park5df7bd32021-08-25 16:18:46 +09001046func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001047 if linker, ok := c.linker.(*objectLinker); ok {
1048 return linker.isCrt()
1049 }
1050 return false
1051}
1052
Jiyong Park5df7bd32021-08-25 16:18:46 +09001053func (c *Module) SplitPerApiLevel() bool {
1054 return c.canUseSdk() && c.isCrt()
1055}
1056
Colin Crossc511bc52020-04-07 16:50:32 +00001057func (c *Module) AlwaysSdk() bool {
1058 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1059}
1060
Ivan Lozano183a3212019-10-18 14:18:45 -07001061func (c *Module) CcLibrary() bool {
1062 if c.linker != nil {
1063 if _, ok := c.linker.(*libraryDecorator); ok {
1064 return true
1065 }
Colin Crossd48fe732020-09-23 20:37:24 -07001066 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1067 return true
1068 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001069 }
1070 return false
1071}
1072
1073func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001074 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001075 return true
1076 }
1077 return false
1078}
1079
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001080func (c *Module) IsFuzzModule() bool {
1081 if _, ok := c.compiler.(*fuzzBinary); ok {
1082 return true
1083 }
1084 return false
1085}
1086
1087func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1088 return c.FuzzModule
1089}
1090
1091func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1092 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1093 return fuzzer.fuzzPackagedModule
1094 }
1095 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1096}
1097
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001098func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001099 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1100 return fuzzer.sharedLibraries
1101 }
1102 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1103}
1104
Ivan Lozano2b262972019-11-21 12:30:50 -08001105func (c *Module) NonCcVariants() bool {
1106 return false
1107}
1108
Ivan Lozano183a3212019-10-18 14:18:45 -07001109func (c *Module) SetStatic() {
1110 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001111 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001112 library.setStatic()
1113 return
1114 }
1115 }
1116 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1117}
1118
1119func (c *Module) SetShared() {
1120 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001121 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001122 library.setShared()
1123 return
1124 }
1125 }
1126 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1127}
1128
1129func (c *Module) BuildStaticVariant() bool {
1130 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001131 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001132 return library.buildStatic()
1133 }
1134 }
1135 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1136}
1137
1138func (c *Module) BuildSharedVariant() bool {
1139 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001140 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001141 return library.buildShared()
1142 }
1143 }
1144 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1145}
1146
1147func (c *Module) Module() android.Module {
1148 return c
1149}
1150
Jiyong Parkc20eee32018-09-05 22:36:17 +09001151func (c *Module) OutputFile() android.OptionalPath {
1152 return c.outputFile
1153}
1154
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001155func (c *Module) CoverageFiles() android.Paths {
1156 if c.linker != nil {
1157 if library, ok := c.linker.(libraryInterface); ok {
1158 return library.objs().coverageFiles
1159 }
1160 }
1161 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1162}
1163
Ivan Lozano183a3212019-10-18 14:18:45 -07001164var _ LinkableInterface = (*Module)(nil)
1165
Jiyong Park719b4462019-01-13 00:39:51 +09001166func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001167 if c.linker != nil {
1168 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001169 }
1170 return nil
1171}
1172
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001173func (c *Module) CoverageOutputFile() android.OptionalPath {
1174 if c.linker != nil {
1175 return c.linker.coverageOutputFilePath()
1176 }
1177 return android.OptionalPath{}
1178}
1179
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001180func (c *Module) RelativeInstallPath() string {
1181 if c.installer != nil {
1182 return c.installer.relativeInstallPath()
1183 }
1184 return ""
1185}
1186
Jooyung Han344d5432019-08-23 11:17:39 +09001187func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001188 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001189}
1190
Colin Cross36242852017-06-23 15:06:31 -07001191func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001192 c.AddProperties(&c.Properties, &c.VendorProperties)
Colin Crossca860ac2016-01-04 14:34:37 -08001193 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001194 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001195 }
1196 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001197 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001198 }
1199 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001200 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001201 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001202 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001203 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001204 }
Colin Cross16b23492016-01-06 14:41:07 -08001205 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001206 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001207 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001208 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001209 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001210 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001211 if c.fuzzer != nil {
1212 c.AddProperties(c.fuzzer.props()...)
1213 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001214 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001215 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001216 }
Justin Yun8effde42017-06-23 19:24:43 +09001217 if c.vndkdep != nil {
1218 c.AddProperties(c.vndkdep.props()...)
1219 }
Stephen Craneba090d12017-05-09 15:44:35 -07001220 if c.lto != nil {
1221 c.AddProperties(c.lto.props()...)
1222 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001223 if c.afdo != nil {
1224 c.AddProperties(c.afdo.props()...)
1225 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001226 if c.pgo != nil {
1227 c.AddProperties(c.pgo.props()...)
1228 }
Colin Crossca860ac2016-01-04 14:34:37 -08001229 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001230 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001231 }
Colin Crossc472d572015-03-17 15:06:21 -07001232
Colin Cross36242852017-06-23 15:06:31 -07001233 android.InitAndroidArchModule(c, c.hod, c.multilib)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001234 if c.bazelable {
1235 android.InitBazelModule(c)
1236 }
Jiyong Park7916bfc2019-09-30 19:13:12 +09001237 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001238 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001239
Colin Cross36242852017-06-23 15:06:31 -07001240 return c
Colin Crossc472d572015-03-17 15:06:21 -07001241}
1242
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001243// UseVndk() returns true if this module is built against VNDK.
1244// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001245func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001246 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001247}
1248
Colin Crossc511bc52020-04-07 16:50:32 +00001249func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001250 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1251 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001252}
1253
1254func (c *Module) UseSdk() bool {
1255 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001256 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001257 }
1258 return false
1259}
1260
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001261func (c *Module) isCoverageVariant() bool {
1262 return c.coverage.Properties.IsCoverageVariant
1263}
1264
Colin Cross95f1ca02020-10-29 20:47:22 -07001265func (c *Module) IsNdk(config android.Config) bool {
1266 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001267}
1268
Colin Cross127bb8b2020-12-16 16:46:01 -08001269func (c *Module) IsLlndk() bool {
1270 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001271}
1272
Colin Cross127bb8b2020-12-16 16:46:01 -08001273func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001274 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001275}
1276
Colin Cross1f3f1302021-04-26 18:37:44 -07001277func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001278 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001279 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001280}
1281
Colin Cross5271fea2021-04-27 13:06:04 -07001282func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1283 lib := moduleLibraryInterface(m)
1284 return lib != nil && (lib.hasVendorPublicLibrary())
1285}
1286
1287// IsVendorPublicLibrary returns true for vendor public libraries.
1288func (c *Module) IsVendorPublicLibrary() bool {
1289 return c.VendorProperties.IsVendorPublicLibrary
1290}
1291
Ivan Lozanof1868af2022-04-12 13:08:36 -04001292func (c *Module) IsVndkPrebuiltLibrary() bool {
1293 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1294 return true
1295 }
1296 return false
1297}
1298
1299func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1300 return c.Properties.SdkAndPlatformVariantVisibleToMake
1301}
1302
Ivan Lozanod7586b62021-04-01 09:49:36 -04001303func (c *Module) HasLlndkStubs() bool {
1304 lib := moduleLibraryInterface(c)
1305 return lib != nil && lib.hasLLNDKStubs()
1306}
1307
1308func (c *Module) StubsVersion() string {
1309 if lib, ok := c.linker.(versionedInterface); ok {
1310 return lib.stubsVersion()
1311 }
1312 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1313}
1314
Colin Cross127bb8b2020-12-16 16:46:01 -08001315// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1316// and does not set llndk.vendor_available: false.
1317func (c *Module) isImplementationForLLNDKPublic() bool {
1318 library, _ := c.library.(*libraryDecorator)
1319 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001320 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001321}
1322
Justin Yunfd9e8042020-12-23 18:23:14 +09001323// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001324func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001325 // Check if VNDK-core-private or VNDK-SP-private
1326 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001327 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001328 }
1329
1330 // Check if LLNDK-private
1331 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001332 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001333 }
1334
1335 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001336}
1337
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001338// IsVndk() returns true if this module has a vndk variant.
1339// Note that IsVndk() returns true for all variants of vndk-enabled libraries. Not only vendor variant,
1340// but also platform and product variants of vndk-enabled libraries return true for IsVndk().
Ivan Lozano52767be2019-10-18 14:49:46 -07001341func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001342 if vndkdep := c.vndkdep; vndkdep != nil {
1343 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001344 }
1345 return false
1346}
1347
Yi Kong4ef54592022-02-14 20:00:10 +08001348func (c *Module) isAfdoCompile() bool {
1349 if afdo := c.afdo; afdo != nil {
Vinh Tran44cb78c2023-03-09 22:07:19 -05001350 return afdo.Properties.FdoProfilePath != nil
Yi Kong4ef54592022-02-14 20:00:10 +08001351 }
1352 return false
1353}
1354
Yi Kong7e53c572018-02-14 18:16:12 +08001355func (c *Module) isPgoCompile() bool {
1356 if pgo := c.pgo; pgo != nil {
1357 return pgo.Properties.PgoCompile
1358 }
1359 return false
1360}
1361
Yi Kongc702ebd2022-08-19 16:02:45 +08001362func (c *Module) isCfi() bool {
1363 if sanitize := c.sanitize; sanitize != nil {
1364 return Bool(sanitize.Properties.Sanitize.Cfi)
1365 }
1366 return false
1367}
1368
Yi Konged79fa32023-06-04 17:15:42 +09001369func (c *Module) isFuzzer() bool {
1370 if sanitize := c.sanitize; sanitize != nil {
1371 return Bool(sanitize.Properties.SanitizeMutated.Fuzzer)
1372 }
1373 return false
1374}
1375
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001376func (c *Module) isNDKStubLibrary() bool {
1377 if _, ok := c.compiler.(*stubDecorator); ok {
1378 return true
1379 }
1380 return false
1381}
1382
Ivan Lozanod7586b62021-04-01 09:49:36 -04001383func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001384 if vndkdep := c.vndkdep; vndkdep != nil {
1385 return vndkdep.isVndkSp()
1386 }
1387 return false
1388}
1389
Ivan Lozanof9e21722020-12-02 09:00:51 -05001390func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001391 if vndkdep := c.vndkdep; vndkdep != nil {
1392 return vndkdep.isVndkExt()
1393 }
1394 return false
1395}
1396
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001397func (c *Module) SubName() string {
1398 return c.Properties.SubName
1399}
1400
Ivan Lozano52767be2019-10-18 14:49:46 -07001401func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001402 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001403}
1404
Logan Chienf3511742017-10-31 18:04:35 +08001405func (c *Module) getVndkExtendsModuleName() string {
1406 if vndkdep := c.vndkdep; vndkdep != nil {
1407 return vndkdep.getVndkExtendsModuleName()
1408 }
1409 return ""
1410}
1411
Jiyong Park25fc6a92018-11-18 18:02:45 +09001412func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001413 if lib := c.library; lib != nil {
1414 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001415 }
1416 return false
1417}
1418
1419func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001420 if lib := c.library; lib != nil {
1421 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001422 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001423 return false
1424}
1425
Alan Stokes73feba32022-11-14 12:21:24 +00001426func (c *Module) IsStubsImplementationRequired() bool {
1427 if lib := c.library; lib != nil {
1428 return lib.isStubsImplementationRequired()
1429 }
1430 return false
1431}
1432
Colin Cross0477b422020-10-13 18:43:54 -07001433// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1434// the implementation. If it is an implementation library it returns its own name.
1435func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1436 name := ctx.OtherModuleName(c)
1437 if versioned, ok := c.linker.(versionedInterface); ok {
1438 name = versioned.implementationModuleName(name)
1439 }
1440 return name
1441}
1442
Martin Stjernholm2856c662020-12-02 15:03:42 +00001443// Similar to ImplementationModuleName, but uses the Make variant of the module
1444// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1445// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1446// under the premise that the prebuilt module overrides its source counterpart
1447// if it is exposed to Make).
1448func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1449 name := c.BaseModuleName()
1450 if versioned, ok := c.linker.(versionedInterface); ok {
1451 name = versioned.implementationModuleName(name)
1452 }
1453 return name
1454}
1455
Jiyong Park7d55b612021-06-11 17:22:09 +09001456func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001457 return Bool(c.Properties.Bootstrap)
1458}
1459
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001460func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001461 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1462 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1463 return false
1464 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001465 return c.linker != nil && c.linker.nativeCoverage()
1466}
1467
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001468func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001469 if p, ok := c.linker.(SnapshotInterface); ok {
1470 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001471 }
1472 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001473}
1474
Bill Peckham945441c2020-08-31 16:07:58 -07001475func (c *Module) ExcludeFromVendorSnapshot() bool {
1476 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1477}
1478
Jose Galmesf7294582020-11-13 12:07:36 -08001479func (c *Module) ExcludeFromRecoverySnapshot() bool {
1480 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1481}
1482
Jiyong Parkf1194352019-02-25 11:05:47 +09001483func isBionic(name string) bool {
1484 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001485 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001486 return true
1487 }
1488 return false
1489}
1490
Martin Stjernholm279de572019-09-10 23:18:20 +01001491func InstallToBootstrap(name string, config android.Config) bool {
Jingwen Chen29743c82023-01-25 17:49:46 +00001492 // NOTE: also update //build/bazel/rules/apex/cc.bzl#_installed_to_bootstrap
1493 // if this list is updated.
Florian Mayer95cd6db2023-03-23 17:48:07 -07001494 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001495 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001496 }
1497 return isBionic(name)
1498}
1499
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001500func (c *Module) XrefCcFiles() android.Paths {
1501 return c.kytheFiles
1502}
1503
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001504func (c *Module) isCfiAssemblySupportEnabled() bool {
1505 return c.sanitize != nil &&
1506 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1507}
1508
Inseob Kim800d1142021-06-14 12:03:51 +09001509func (c *Module) InstallInRoot() bool {
1510 return c.installer != nil && c.installer.installInRoot()
1511}
1512
Colin Crossca860ac2016-01-04 14:34:37 -08001513type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001514 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001515 moduleContextImpl
1516}
1517
Colin Cross37047f12016-12-13 17:06:13 -08001518type depsContext struct {
1519 android.BottomUpMutatorContext
1520 moduleContextImpl
1521}
1522
Colin Crossca860ac2016-01-04 14:34:37 -08001523type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001524 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001525 moduleContextImpl
1526}
1527
1528type moduleContextImpl struct {
1529 mod *Module
1530 ctx BaseModuleContext
1531}
1532
Colin Crossb98c8b02016-07-29 13:44:28 -07001533func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001534 return ctx.mod.toolchain(ctx.ctx)
1535}
1536
1537func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001538 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001539}
1540
1541func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001542 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001543}
1544
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001545func (ctx *moduleContextImpl) testBinary() bool {
1546 return ctx.mod.testBinary()
1547}
1548
Yi Kong56fc1b62022-09-06 16:24:00 +08001549func (ctx *moduleContextImpl) testLibrary() bool {
1550 return ctx.mod.testLibrary()
1551}
1552
Jiyong Park1d1119f2019-07-29 21:27:18 +09001553func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001554 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001555}
1556
Inseob Kim7f283f42020-06-01 21:53:49 +09001557func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001558 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001559}
1560
Inseob Kim1042d292020-06-01 23:23:05 +09001561func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001562 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001563}
1564
Jooyung Hanccce2f22020-03-07 03:45:53 +09001565func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001566 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001567}
1568
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001569func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001570 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001571}
1572
1573func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001574 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001575 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001576 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001577 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001578 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001579 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001580 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001581 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001582 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001583 }
1584 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001585}
1586
Jiyong Parkb35a8192020-08-10 15:59:36 +09001587func (ctx *moduleContextImpl) minSdkVersion() string {
1588 ver := ctx.mod.MinSdkVersion()
1589 if ver == "apex_inherit" && !ctx.isForPlatform() {
1590 ver = ctx.apexSdkVersion().String()
1591 }
1592 if ver == "apex_inherit" || ver == "" {
1593 ver = ctx.sdkVersion()
1594 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001595 // For crt objects, the meaning of min_sdk_version is very different from other types of
1596 // module. For them, min_sdk_version defines the oldest version that the build system will
1597 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1598 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1599 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001600 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1601 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1602 // support such an old version. The version is set to the later version in case when the
1603 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1604 // it's for an APEX.
1605 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1606 if ctx.isForPlatform() {
1607 ver = strconv.Itoa(android.FutureApiLevelInt)
1608 } else { // for apex
1609 ver = ctx.apexSdkVersion().String()
1610 if ver == "" { // in case when min_sdk_version was not set by the APEX
1611 ver = ctx.sdkVersion()
1612 }
1613 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001614 }
1615
Jiyong Parkb35a8192020-08-10 15:59:36 +09001616 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1617 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1618 minSdkVersionInt, err2 := strconv.Atoi(ver)
1619 if err == nil && err2 == nil {
1620 if sdkVersionInt < minSdkVersionInt {
1621 return strconv.Itoa(sdkVersionInt)
1622 }
1623 }
1624 return ver
1625}
1626
1627func (ctx *moduleContextImpl) isSdkVariant() bool {
1628 return ctx.mod.IsSdkVariant()
1629}
1630
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001631func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001632 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001633}
Justin Yun8effde42017-06-23 19:24:43 +09001634
Colin Cross95f1ca02020-10-29 20:47:22 -07001635func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1636 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001637}
1638
Colin Cross127bb8b2020-12-16 16:46:01 -08001639func (ctx *moduleContextImpl) IsLlndk() bool {
1640 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001641}
1642
Colin Cross127bb8b2020-12-16 16:46:01 -08001643func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1644 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001645}
1646
Colin Cross127bb8b2020-12-16 16:46:01 -08001647func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1648 return ctx.mod.isImplementationForLLNDKPublic()
1649}
1650
1651func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1652 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001653}
1654
Logan Chienf3511742017-10-31 18:04:35 +08001655func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001656 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001657}
1658
Yi Kong4ef54592022-02-14 20:00:10 +08001659func (ctx *moduleContextImpl) isAfdoCompile() bool {
1660 return ctx.mod.isAfdoCompile()
1661}
1662
Yi Kong7e53c572018-02-14 18:16:12 +08001663func (ctx *moduleContextImpl) isPgoCompile() bool {
1664 return ctx.mod.isPgoCompile()
1665}
1666
Yi Kongc702ebd2022-08-19 16:02:45 +08001667func (ctx *moduleContextImpl) isCfi() bool {
1668 return ctx.mod.isCfi()
1669}
1670
Yi Konged79fa32023-06-04 17:15:42 +09001671func (ctx *moduleContextImpl) isFuzzer() bool {
1672 return ctx.mod.isFuzzer()
1673}
1674
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001675func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1676 return ctx.mod.isNDKStubLibrary()
1677}
1678
Justin Yun8effde42017-06-23 19:24:43 +09001679func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001680 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001681}
1682
Ivan Lozanof9e21722020-12-02 09:00:51 -05001683func (ctx *moduleContextImpl) IsVndkExt() bool {
1684 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001685}
1686
Colin Cross5271fea2021-04-27 13:06:04 -07001687func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1688 return ctx.mod.IsVendorPublicLibrary()
1689}
1690
Vic Yangefd249e2018-11-12 20:19:56 -08001691func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001692 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001693}
1694
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001695func (ctx *moduleContextImpl) selectedStl() string {
1696 if stl := ctx.mod.stl; stl != nil {
1697 return stl.Properties.SelectedStl
1698 }
1699 return ""
1700}
1701
Ivan Lozanobd721262018-11-27 14:33:03 -08001702func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1703 return ctx.mod.linker.useClangLld(actx)
1704}
1705
Colin Crossce75d2c2016-10-06 16:12:58 -07001706func (ctx *moduleContextImpl) baseModuleName() string {
1707 return ctx.mod.ModuleBase.BaseModuleName()
1708}
1709
Logan Chienf3511742017-10-31 18:04:35 +08001710func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1711 return ctx.mod.getVndkExtendsModuleName()
1712}
1713
Logan Chiene274fc92019-12-03 11:18:32 -08001714func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001715 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001716}
1717
Colin Crosse07f2312020-08-13 11:24:56 -07001718func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001719 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001720}
1721
Dan Albertc8060532020-07-22 22:32:17 -07001722func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001723 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001724}
1725
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001726func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001727 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001728}
1729
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001730func (ctx *moduleContextImpl) nativeCoverage() bool {
1731 return ctx.mod.nativeCoverage()
1732}
1733
Colin Cross56a83212020-09-15 18:30:11 -07001734func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1735 return ctx.mod.DirectlyInAnyApex()
1736}
1737
Colin Cross95b07f22020-12-16 11:06:50 -08001738func (ctx *moduleContextImpl) isPreventInstall() bool {
1739 return ctx.mod.Properties.PreventInstall
1740}
1741
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001742func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1743 shared := &ctx.mod.sharedFlags
1744 if shared.flagsMap == nil {
1745 shared.numSharedFlags = 0
1746 shared.flagsMap = make(map[string]string)
1747 }
1748 return shared
1749}
1750
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001751func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1752 return ctx.mod.isCfiAssemblySupportEnabled()
1753}
1754
Colin Cross635c3b02016-05-18 15:37:25 -07001755func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001756 return &Module{
1757 hod: hod,
1758 multilib: multilib,
1759 }
1760}
1761
Colin Cross635c3b02016-05-18 15:37:25 -07001762func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001763 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001764 module.features = []feature{
1765 &tidyFeature{},
1766 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001767 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001768 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001769 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001770 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001771 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001772 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001773 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001774 module.afdo = &afdo{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001775 module.pgo = &pgo{}
Colin Crossca860ac2016-01-04 14:34:37 -08001776 return module
1777}
1778
Colin Crossce75d2c2016-10-06 16:12:58 -07001779func (c *Module) Prebuilt() *android.Prebuilt {
1780 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1781 return p.prebuilt()
1782 }
1783 return nil
1784}
1785
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001786func (c *Module) IsPrebuilt() bool {
1787 return c.Prebuilt() != nil
1788}
1789
Colin Crossce75d2c2016-10-06 16:12:58 -07001790func (c *Module) Name() string {
1791 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001792 if p, ok := c.linker.(interface {
1793 Name(string) string
1794 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001795 name = p.Name(name)
1796 }
1797 return name
1798}
1799
Alex Light3d673592019-01-18 14:37:31 -08001800func (c *Module) Symlinks() []string {
1801 if p, ok := c.installer.(interface {
1802 symlinkList() []string
1803 }); ok {
1804 return p.symlinkList()
1805 }
1806 return nil
1807}
1808
Roland Levillainf89cd092019-07-29 16:22:59 +01001809func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1810 test, ok := c.linker.(testPerSrc)
1811 return ok && test.isAllTestsVariation()
1812}
1813
Chris Parsons216e10a2020-07-09 17:12:52 -04001814func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001815 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001816 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001817 }); ok {
1818 return p.dataPaths()
1819 }
1820 return nil
1821}
1822
Ivan Lozanof1868af2022-04-12 13:08:36 -04001823func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001824 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1825 // "current", it will append the VNDK version to the name suffix.
1826 var vndkVersion string
1827 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001828 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001829 if c.ProductSpecific() {
1830 // If the module is product specific with 'product_specific: true',
1831 // do not add a name suffix because it is a base module.
1832 return ""
1833 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001834 vndkVersion = ctx.DeviceConfig().ProductVndkVersion()
Matthew Maurer52af5b02021-05-27 10:01:36 -07001835 nameSuffix = ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001836 } else {
1837 vndkVersion = ctx.DeviceConfig().VndkVersion()
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001838 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001839 }
1840 if vndkVersion == "current" {
1841 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1842 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001843 if c.VndkVersion() != vndkVersion && c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001844 // add version suffix only if the module is using different vndk version than the
1845 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001846 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001847 }
1848 return nameSuffix
1849}
1850
Ivan Lozanof1868af2022-04-12 13:08:36 -04001851func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1852 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001853
1854 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001855 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001856 }
1857
Colin Cross127bb8b2020-12-16 16:46:01 -08001858 llndk := c.IsLlndk()
Colin Cross627280f2021-04-26 16:53:58 -07001859 if llndk || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001860 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1861 // added for product variant only when we have vendor and product variants with core
1862 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001863 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001864 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001865 subName += vendorPublicLibrarySuffix
1866 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001867 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1868 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001869 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001870 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001871 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001872 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001873 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001874 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001875 subName += RecoverySuffix
1876 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1877 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001878 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001879 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001880 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001881 } else if c.IsStubs() && c.IsSdkVariant() {
1882 // Public API surface (NDK)
1883 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1884 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001885 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001886
1887 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001888}
1889
Chris Parsonsf874e462022-05-10 13:50:12 -04001890var _ android.MixedBuildBuildable = (*Module)(nil)
1891
1892func (c *Module) getBazelModuleLabel(ctx android.BaseModuleContext) string {
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001893 var bazelModuleLabel string
Liz Kammer35ca77e2021-12-22 15:31:40 -05001894 if c.typ() == fullLibrary && c.static() {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001895 // cc_library is a special case in bp2build; two targets are generated -- one for each
1896 // of the shared and static variants. The shared variant keeps the module name, but the
1897 // static variant uses a different suffixed name.
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001898 bazelModuleLabel = bazelLabelForStaticModule(ctx, c)
1899 } else {
1900 bazelModuleLabel = c.GetBazelLabel(ctx, c)
Chris Parsonsf874e462022-05-10 13:50:12 -04001901 }
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001902 labelNoPrebuilt := bazelModuleLabel
1903 if c.IsPrebuilt() {
1904 labelNoPrebuilt = android.RemoveOptionalPrebuiltPrefixFromBazelLabel(bazelModuleLabel)
1905 }
1906 return labelNoPrebuilt
Chris Parsonsf874e462022-05-10 13:50:12 -04001907}
1908
1909func (c *Module) QueueBazelCall(ctx android.BaseModuleContext) {
1910 c.bazelHandler.QueueBazelCall(ctx, c.getBazelModuleLabel(ctx))
1911}
1912
Jingwen Chen3952a902022-12-12 12:20:58 +00001913// IsMixedBuildSupported returns true if the module should be analyzed by Bazel
Jingwen Chena485d092023-04-20 12:34:08 +00001914// in any of the --bazel-mode(s).
Chris Parsonsf874e462022-05-10 13:50:12 -04001915func (c *Module) IsMixedBuildSupported(ctx android.BaseModuleContext) bool {
Yu Liu8860c6c2023-06-07 12:43:26 -07001916 if !allEnabledSanitizersSupportedByBazel(ctx, c) {
Sam Delmericoef69d472023-04-18 17:32:43 -04001917 //TODO(b/278772861) support sanitizers in Bazel rules
Yu Liue4312402023-01-18 09:15:31 -08001918 return false
1919 }
Sam Delmericoef69d472023-04-18 17:32:43 -04001920 return c.bazelHandler != nil
1921}
1922
Yu Liu8860c6c2023-06-07 12:43:26 -07001923func allEnabledSanitizersSupportedByBazel(ctx android.BaseModuleContext, c *Module) bool {
Sam Delmericoef69d472023-04-18 17:32:43 -04001924 if c.sanitize == nil {
1925 return true
1926 }
Yu Liue4312402023-01-18 09:15:31 -08001927 sanitizeProps := &c.sanitize.Properties.SanitizeMutated
Sam Delmericoef69d472023-04-18 17:32:43 -04001928
1929 unsupportedSanitizers := []*bool{
1930 sanitizeProps.Safestack,
Sam Delmericoef69d472023-04-18 17:32:43 -04001931 sanitizeProps.Scudo,
1932 BoolPtr(len(c.sanitize.Properties.Sanitize.Recover) > 0),
1933 BoolPtr(c.sanitize.Properties.Sanitize.Blocklist != nil),
1934 }
1935 for _, san := range unsupportedSanitizers {
1936 if Bool(san) {
1937 return false
1938 }
1939 }
1940
1941 for _, san := range Sanitizers {
1942 if san == intOverflow {
1943 // TODO(b/261058727): enable mixed builds for all modules with UBSan
1944 // Currently we can only support ubsan when minimum runtime is used.
1945 ubsanEnabled := Bool(sanitizeProps.Integer_overflow) || len(sanitizeProps.Misc_undefined) > 0
Yu Liu8860c6c2023-06-07 12:43:26 -07001946 if !ubsanEnabled || c.MinimalRuntimeNeeded() {
1947 continue
Sam Delmericoef69d472023-04-18 17:32:43 -04001948 }
Yu Liu95497dc2023-05-25 11:15:07 -07001949 } else if san == cfi {
Yu Liu8860c6c2023-06-07 12:43:26 -07001950 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1951 // Only allow cfi if this is an apex variant
1952 if !apexInfo.IsForPlatform() {
1953 continue
1954 }
1955 }
1956 if c.sanitize.isSanitizerEnabled(san) {
Sam Delmericoef69d472023-04-18 17:32:43 -04001957 return false
1958 }
1959 }
1960
1961 return true
Yu Liue4312402023-01-18 09:15:31 -08001962}
1963
1964func GetApexConfigKey(ctx android.BaseModuleContext) *android.ApexConfigKey {
1965 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1966 if !apexInfo.IsForPlatform() {
Yu Liubfb23622023-02-22 10:42:15 -08001967 if !ctx.Config().BazelContext.IsModuleDclaAllowed(ctx.Module().Name()) {
1968 return nil
1969 }
Yu Liue4312402023-01-18 09:15:31 -08001970 apexKey := android.ApexConfigKey{
1971 WithinApex: true,
1972 ApexSdkVersion: findApexSdkVersion(ctx, apexInfo).String(),
1973 }
1974 return &apexKey
1975 }
1976
1977 return nil
Chris Parsonsf874e462022-05-10 13:50:12 -04001978}
1979
1980func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) {
1981 bazelModuleLabel := c.getBazelModuleLabel(ctx)
Chris Parsonsf874e462022-05-10 13:50:12 -04001982 c.bazelHandler.ProcessBazelQueryResponse(ctx, bazelModuleLabel)
1983
1984 c.Properties.SubName = GetSubnameProperty(ctx, c)
1985 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1986 if !apexInfo.IsForPlatform() {
1987 c.hideApexVariantFromMake = true
Chris Parsons77acf2e2021-12-03 17:27:16 -05001988 }
Liz Kammer35ca77e2021-12-22 15:31:40 -05001989
Chris Parsonsf874e462022-05-10 13:50:12 -04001990 c.makeLinkType = GetMakeLinkType(ctx, c)
1991
1992 mctx := &moduleContext{
1993 ModuleContext: ctx,
1994 moduleContextImpl: moduleContextImpl{
1995 mod: c,
1996 },
Chris Parsons8d6e4332021-02-22 16:13:50 -05001997 }
Chris Parsonsf874e462022-05-10 13:50:12 -04001998 mctx.ctx = mctx
1999
Jingwen Chen3952a902022-12-12 12:20:58 +00002000 // TODO(b/244432500): Get the tradefed config from the bazel target instead
2001 // of generating it with Soong.
Chris Parsonsf874e462022-05-10 13:50:12 -04002002 c.maybeInstall(mctx, apexInfo)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002003}
2004
Sam Delmerico75dbca22023-04-20 13:13:25 +00002005func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
2006 ctx := &moduleContext{
2007 ModuleContext: actx,
2008 moduleContextImpl: moduleContextImpl{
2009 mod: c,
2010 },
2011 }
2012 ctx.ctx = ctx
2013 return ctx
2014}
2015
Spandan Das20fce2d2023-04-12 17:21:39 +00002016// TODO (b/277651159): Remove this allowlist
2017var (
2018 skipStubLibraryMultipleApexViolation = map[string]bool{
2019 "libclang_rt.asan": true,
2020 "libclang_rt.hwasan": true,
2021 // runtime apex
2022 "libc": true,
2023 "libc_hwasan": true,
2024 "libdl_android": true,
2025 "libm": true,
2026 "libdl": true,
2027 // art apex
2028 "libandroidio": true,
2029 "libdexfile": true,
2030 "libnativebridge": true,
2031 "libnativehelper": true,
2032 "libnativeloader": true,
2033 "libsigchain": true,
2034 }
2035)
2036
2037// Returns true if a stub library could be installed in multiple apexes
2038func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2039 // If this is not an apex variant, no check necessary
2040 if !c.InAnyApex() {
2041 return false
2042 }
2043 // If this is not a stub library, no check necessary
2044 if !c.HasStubsVariants() {
2045 return false
2046 }
2047 // Skip the allowlist
2048 // Use BaseModuleName so that this matches prebuilts.
2049 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2050 return false
2051 }
2052
2053 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
2054 // Stub libraries should not have more than one apex_available
2055 if len(aaWithoutTestApexes) > 1 {
2056 return true
2057 }
2058 // Stub libraries should not use the wildcard
2059 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
2060 return true
2061 }
2062 // Default: no violation
2063 return false
2064}
2065
Chris Parsons8d6e4332021-02-22 16:13:50 -05002066func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05002067 // Handle the case of a test module split by `test_per_src` mutator.
2068 //
2069 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
2070 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
2071 // module and return early, as this module does not produce an output file per se.
2072 if c.IsTestPerSrcAllTestsVariation() {
2073 c.outputFile = android.OptionalPath{}
2074 return
2075 }
2076
Ivan Lozanof1868af2022-04-12 13:08:36 -04002077 c.Properties.SubName = GetSubnameProperty(actx, c)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002078 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2079 if !apexInfo.IsForPlatform() {
2080 c.hideApexVariantFromMake = true
2081 }
2082
Chris Parsonseefc9e62021-04-02 17:36:47 -04002083 c.makeLinkType = GetMakeLinkType(actx, c)
2084
Sam Delmerico75dbca22023-04-20 13:13:25 +00002085 ctx := moduleContextFromAndroidModuleContext(actx, c)
Colin Crossca860ac2016-01-04 14:34:37 -08002086
Colin Crossf18e1102017-11-16 14:33:08 -08002087 deps := c.depsToPaths(ctx)
2088 if ctx.Failed() {
2089 return
2090 }
2091
Spandan Das20fce2d2023-04-12 17:21:39 +00002092 if c.stubLibraryMultipleApexViolation(actx) {
2093 actx.PropertyErrorf("apex_available",
2094 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2095 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002096 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2097 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002098 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2099 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002100 }
2101
Colin Crossca860ac2016-01-04 14:34:37 -08002102 flags := Flags{
2103 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002104 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002105 }
Colin Crossca860ac2016-01-04 14:34:37 -08002106 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002107 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002108 }
2109 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002110 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002111 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002112 if c.stl != nil {
2113 flags = c.stl.flags(ctx, flags)
2114 }
Colin Cross16b23492016-01-06 14:41:07 -08002115 if c.sanitize != nil {
2116 flags = c.sanitize.flags(ctx, flags)
2117 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002118 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002119 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002120 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002121 if c.fuzzer != nil {
2122 flags = c.fuzzer.flags(ctx, flags)
2123 }
Stephen Craneba090d12017-05-09 15:44:35 -07002124 if c.lto != nil {
2125 flags = c.lto.flags(ctx, flags)
2126 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002127 if c.afdo != nil {
2128 flags = c.afdo.flags(ctx, flags)
2129 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002130 if c.pgo != nil {
2131 flags = c.pgo.flags(ctx, flags)
2132 }
Colin Crossca860ac2016-01-04 14:34:37 -08002133 for _, feature := range c.features {
2134 flags = feature.flags(ctx, flags)
2135 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002136 if ctx.Failed() {
2137 return
2138 }
2139
Colin Cross4af21ed2019-11-04 09:37:55 -08002140 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2141 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2142 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002143
Colin Cross4af21ed2019-11-04 09:37:55 -08002144 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002145
2146 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002147 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002148 }
2149 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002150 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002151 }
2152
Colin Cross3e5e7782022-06-17 22:17:05 +00002153 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2154
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002155 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002156 // We need access to all the flags seen by a source file.
2157 if c.sabi != nil {
2158 flags = c.sabi.flags(ctx, flags)
2159 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002160
Colin Cross4af21ed2019-11-04 09:37:55 -08002161 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002162
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002163 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002164 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002165 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002166 if ctx.Failed() {
2167 return
2168 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002169 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07002170 c.objFiles = objs.objFiles
2171 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08002172 }
2173
Colin Crossca860ac2016-01-04 14:34:37 -08002174 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002175 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002176 if ctx.Failed() {
2177 return
2178 }
Colin Cross635c3b02016-05-18 15:37:25 -07002179 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002180
Chris Parsons94a0bba2021-06-04 15:03:47 -04002181 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002182
Jose Galmes6f843bc2020-12-11 13:36:29 -08002183 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
2184 // RECOVERY_SNAPSHOT_VERSION is current.
2185 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04002186 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002187 i.collectHeadersForSnapshot(ctx)
2188 }
2189 }
Colin Crossce75d2c2016-10-06 16:12:58 -07002190 }
Colin Cross5049f022015-03-18 13:28:46 -07002191
Chris Parsons94a0bba2021-06-04 15:03:47 -04002192 c.maybeInstall(ctx, apexInfo)
2193}
2194
2195func (c *Module) maybeUnhideFromMake() {
2196 // If a lib is directly included in any of the APEXes or is not available to the
2197 // platform (which is often the case when the stub is provided as a prebuilt),
2198 // unhide the stubs variant having the latest version gets visible to make. In
2199 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2200 // force anything in the make world to link against the stubs library. (unless it
2201 // is explicitly referenced via .bootstrap suffix or the module is marked with
2202 // 'bootstrap: true').
2203 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
2204 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
2205 c.IsStubs() && !c.InVendorRamdisk() {
2206 c.Properties.HideFromMake = false // unhide
2207 // Note: this is still non-installable
2208 }
2209}
2210
Jingwen Chen3952a902022-12-12 12:20:58 +00002211// maybeInstall is called at the end of both GenerateAndroidBuildActions and
2212// ProcessBazelQueryResponse to run the install hooks for installable modules,
2213// like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002214func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002215 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002216 // If the module has been specifically configure to not be installed then
2217 // hide from make as otherwise it will break when running inside make
2218 // as the output path to install will not be specified. Not all uninstallable
2219 // modules can be hidden from make as some are needed for resolving make side
2220 // dependencies.
2221 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002222 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002223 c.SkipInstall()
2224 }
2225
2226 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2227 // to allow using the outputs in a genrule.
2228 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002229 c.installer.install(ctx, c.outputFile.Path())
2230 if ctx.Failed() {
2231 return
Colin Crossca860ac2016-01-04 14:34:37 -08002232 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002233 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002234}
2235
Sam Delmerico5fb794a2023-01-27 16:01:37 -05002236func (c *Module) setAndroidMkVariablesFromCquery(info cquery.CcAndroidMkInfo) {
2237 c.Properties.AndroidMkSharedLibs = info.LocalSharedLibs
2238 c.Properties.AndroidMkStaticLibs = info.LocalStaticLibs
2239 c.Properties.AndroidMkWholeStaticLibs = info.LocalWholeStaticLibs
2240}
2241
Colin Cross0ea8ba82019-06-06 14:33:29 -07002242func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002243 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002244 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002245 }
Colin Crossca860ac2016-01-04 14:34:37 -08002246 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002247}
2248
Colin Crossca860ac2016-01-04 14:34:37 -08002249func (c *Module) begin(ctx BaseModuleContext) {
2250 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002251 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002252 }
Colin Crossca860ac2016-01-04 14:34:37 -08002253 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002254 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002255 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002256 if c.stl != nil {
2257 c.stl.begin(ctx)
2258 }
Colin Cross16b23492016-01-06 14:41:07 -08002259 if c.sanitize != nil {
2260 c.sanitize.begin(ctx)
2261 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002262 if c.coverage != nil {
2263 c.coverage.begin(ctx)
2264 }
Stephen Craneba090d12017-05-09 15:44:35 -07002265 if c.lto != nil {
2266 c.lto.begin(ctx)
2267 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002268 if c.pgo != nil {
2269 c.pgo.begin(ctx)
2270 }
Dan Albert92fe7402020-07-15 13:33:30 -07002271 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002272 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002273 if err != nil {
2274 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002275 c.Properties.Sdk_version = nil
2276 } else {
2277 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002278 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002279 }
Colin Crossca860ac2016-01-04 14:34:37 -08002280}
2281
Colin Cross37047f12016-12-13 17:06:13 -08002282func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002283 deps := Deps{}
2284
2285 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002286 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002287 }
2288 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002289 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002290 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002291 if c.stl != nil {
2292 deps = c.stl.deps(ctx, deps)
2293 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002294 if c.coverage != nil {
2295 deps = c.coverage.deps(ctx, deps)
2296 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002297
Colin Crossb6715442017-10-24 11:13:31 -07002298 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2299 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2300 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2301 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2302 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2303 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002304 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002305
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002306 for _, lib := range deps.ReexportSharedLibHeaders {
2307 if !inList(lib, deps.SharedLibs) {
2308 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2309 }
2310 }
2311
2312 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002313 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2314 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 -07002315 }
2316 }
2317
Colin Cross5950f382016-12-13 12:50:57 -08002318 for _, lib := range deps.ReexportHeaderLibHeaders {
2319 if !inList(lib, deps.HeaderLibs) {
2320 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2321 }
2322 }
2323
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002324 for _, gen := range deps.ReexportGeneratedHeaders {
2325 if !inList(gen, deps.GeneratedHeaders) {
2326 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2327 }
2328 }
2329
Colin Crossc99deeb2016-04-11 15:06:20 -07002330 return deps
2331}
2332
Dan Albert7e9d2952016-08-04 13:02:36 -07002333func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002334 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002335 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002336 moduleContextImpl: moduleContextImpl{
2337 mod: c,
2338 },
2339 }
2340 ctx.ctx = ctx
2341
Vinh Tran44cb78c2023-03-09 22:07:19 -05002342 if !actx.Host() || !ctx.static() || ctx.staticBinary() {
2343 c.afdo.addDep(ctx, actx)
2344 }
2345
Colin Crossca860ac2016-01-04 14:34:37 -08002346 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002347}
2348
Jiyong Park7ed9de32018-10-15 22:25:07 +09002349// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002350func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002351 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2352 version := name[sharp+1:]
2353 libname := name[:sharp]
2354 return libname, version
2355 }
2356 return name, ""
2357}
2358
Dan Albert92fe7402020-07-15 13:33:30 -07002359func GetCrtVariations(ctx android.BottomUpMutatorContext,
2360 m LinkableInterface) []blueprint.Variation {
2361 if ctx.Os() != android.Android {
2362 return nil
2363 }
2364 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002365 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2366 minSdkVersion := m.MinSdkVersion()
2367 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2368 minSdkVersion = m.SdkVersion()
2369 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002370 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2371 if err != nil {
2372 ctx.PropertyErrorf("min_sdk_version", err.Error())
2373 }
Colin Cross363ec762023-01-13 13:45:14 -08002374
2375 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002376 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002377 if apiLevel.LessThan(minApiForArch) {
2378 apiLevel = minApiForArch
2379 }
2380
Dan Albert92fe7402020-07-15 13:33:30 -07002381 return []blueprint.Variation{
2382 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002383 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002384 }
2385 }
2386 return []blueprint.Variation{
2387 {Mutator: "sdk", Variation: ""},
2388 }
2389}
2390
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002391func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2392 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002393
2394 variations = append([]blueprint.Variation(nil), variations...)
2395
Liz Kammer23942242022-04-08 15:41:00 -04002396 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002397 // Version is explicitly specified. i.e. libFoo#30
2398 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002399 if tag, ok := depTag.(libraryDependencyTag); ok {
2400 tag.explicitlyVersioned = true
2401 } else {
2402 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2403 }
Colin Crosse7257d22020-09-24 09:56:18 -07002404 }
Colin Crosse7257d22020-09-24 09:56:18 -07002405
Colin Cross0de8a1e2020-09-18 14:15:30 -07002406 if far {
2407 ctx.AddFarVariationDependencies(variations, depTag, name)
2408 } else {
2409 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002410 }
2411}
2412
Kiyoung Kim487689e2022-07-26 09:48:22 +09002413func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2414 apiImportInfo := multitree.ApiImportInfo{}
2415
2416 if c.Device() {
2417 var apiImportModule []blueprint.Module
2418 if actx.OtherModuleExists("api_imports") {
2419 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2420 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
2421 apiInfo := actx.OtherModuleProvider(apiImportModule[0], multitree.ApiImportsProvider).(multitree.ApiImportInfo)
2422 apiImportInfo = apiInfo
2423 actx.SetProvider(multitree.ApiImportsProvider, apiInfo)
2424 }
2425 }
2426 }
2427
2428 return apiImportInfo
2429}
2430
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002431func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002432 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002433 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002434 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002435 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2436 // between the modules in the snapshot and the snapshot itself.
2437 var snapshotModule []blueprint.Module
2438 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2439 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2440 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2441 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2442 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002443 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002444 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2445 *snapshotInfo = &snapshot
2446 // republish the snapshot for use in later mutators on this module
2447 actx.SetProvider(SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002448 }
2449 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002450 if *snapshotInfo == nil {
2451 *snapshotInfo = &SnapshotInfo{}
2452 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002453 return **snapshotInfo
2454}
2455
Kiyoung Kim487689e2022-07-26 09:48:22 +09002456func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2457 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002458 return snapshot
2459 }
2460
2461 return lib
2462}
2463
2464// RewriteLibs takes a list of names of shared libraries and scans it for three types
2465// of names:
2466//
2467// 1. Name of an NDK library that refers to a prebuilt module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002468//
2469// For each of these, it adds the name of the prebuilt module (which will be in
2470// prebuilts/ndk) to the list of nonvariant libs.
2471//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002472// 2. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002473//
2474// For each of these, it adds the name of the ndk_library module to the list of
2475// variant libs.
2476//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002477// 3. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002478//
2479// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002480//
2481// The caller can then know to add the variantLibs dependencies differently from the
2482// nonvariantLibs
2483func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2484 variantLibs = []string{}
2485
2486 nonvariantLibs = []string{}
2487 for _, entry := range list {
2488 // strip #version suffix out
2489 name, _ := StubsLibNameAndVersion(entry)
2490 if c.InRecovery() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002491 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002492 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2493 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2494 } else if c.UseVndk() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002495 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002496 } else {
2497 // put name#version back
2498 nonvariantLibs = append(nonvariantLibs, entry)
2499 }
2500 }
2501 return nonvariantLibs, variantLibs
2502}
2503
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002504func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2505 nonVariantLibs := []string{}
2506 variantLibs := []string{}
2507
2508 for _, lib := range libs {
2509 replaceLibName := GetReplaceModuleName(lib, replaceList)
2510 if replaceLibName == lib {
2511 // Do not handle any libs which are not in API imports
2512 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2513 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2514 variantLibs = append(variantLibs, replaceLibName)
2515 } else {
2516 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2517 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002518 }
2519
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002520 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002521}
2522
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002523func (c *Module) shouldUseApiSurface() bool {
2524 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2525 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2526 // LLNDK Variant
2527 return true
2528 }
2529
2530 if c.Properties.IsSdkVariant {
2531 // NDK Variant
2532 return true
2533 }
2534
2535 if c.isImportedApiLibrary() {
2536 // API Library should depend on API headers
2537 return true
2538 }
2539 }
2540
2541 return false
2542}
2543
Colin Cross1e676be2016-10-12 14:38:15 -07002544func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002545 if !c.Enabled() {
2546 return
2547 }
2548
Colin Cross37047f12016-12-13 17:06:13 -08002549 ctx := &depsContext{
2550 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002551 moduleContextImpl: moduleContextImpl{
2552 mod: c,
2553 },
2554 }
2555 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002556
Colin Crossc99deeb2016-04-11 15:06:20 -07002557 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002558 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002559
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002560 apiNdkLibs := []string{}
2561 apiLateNdkLibs := []string{}
2562
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002563 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002564 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2565 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2566 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2567 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2568 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002569 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002570
Yo Chiang219968c2020-09-22 18:45:04 +08002571 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2572
Colin Crosse0edaf92021-01-11 17:31:17 -08002573 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002574
Dan Albert914449f2016-06-17 16:45:24 -07002575 variantNdkLibs := []string{}
2576 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002577 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002578 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2579 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2580 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002581
2582 for idx, lib := range deps.RuntimeLibs {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002583 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002584 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002585 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002586
Colin Cross32ec36c2016-12-15 07:39:51 -08002587 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002588 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002589 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002590 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002591 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002592
Kiyoung Kim51279d32022-08-24 14:10:46 +09002593 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002594 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002595 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2596 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002597 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002598
Spandan Das73bcafc2022-08-18 23:26:00 +00002599 if c.isNDKStubLibrary() {
2600 // ndk_headers do not have any variations
2601 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002602 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002603 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002604 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002605 } else {
2606 actx.AddVariationDependencies(nil, depTag, lib)
2607 }
2608 }
2609
Dan Albertf1d14c72020-07-30 14:32:55 -07002610 if c.isNDKStubLibrary() {
2611 // NDK stubs depend on their implementation because the ABI dumps are
2612 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002613
Spandan Das8b08aea2023-03-14 19:29:34 +00002614 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2615 c.ImageVariation(),
2616 blueprint.Variation{Mutator: "link", Variation: "shared"},
2617 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002618 }
2619
Jiyong Park5d1598f2019-02-25 22:14:17 +09002620 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002621 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002622
Kiyoung Kim487689e2022-07-26 09:48:22 +09002623 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002624
Jiyong Park5d1598f2019-02-25 22:14:17 +09002625 actx.AddVariationDependencies([]blueprint.Variation{
2626 {Mutator: "link", Variation: "static"},
2627 }, depTag, lib)
2628 }
2629
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002630 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002631 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002632 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002633 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002634 }
Jiyong Parke3867542020-12-03 17:28:25 +09002635 if inList(lib, deps.ExcludeLibsForApex) {
2636 depTag.excludeInApex = true
2637 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002638
Kiyoung Kim487689e2022-07-26 09:48:22 +09002639 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002640
Dan Willemsen59339a22018-07-22 21:18:45 -07002641 actx.AddVariationDependencies([]blueprint.Variation{
2642 {Mutator: "link", Variation: "static"},
2643 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002644 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002645
Jooyung Han75568392020-03-20 04:29:24 +09002646 // staticUnwinderDep is treated as staticDep for Q apexes
2647 // so that native libraries/binaries are linked with static unwinder
2648 // because Q libc doesn't have unwinder APIs
2649 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002650 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002651 actx.AddVariationDependencies([]blueprint.Variation{
2652 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002653 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002654 }
2655
Jiyong Park7ed9de32018-10-15 22:25:07 +09002656 // shared lib names without the #version suffix
2657 var sharedLibNames []string
2658
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002659 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002660 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002661 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002662 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002663 }
Jiyong Parke3867542020-12-03 17:28:25 +09002664 if inList(lib, deps.ExcludeLibsForApex) {
2665 depTag.excludeInApex = true
2666 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002667
Jiyong Park73c54ee2019-10-22 20:31:18 +09002668 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002669 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2670 name = apiLibraryName
2671 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002672 sharedLibNames = append(sharedLibNames, name)
2673
Colin Crosse7257d22020-09-24 09:56:18 -07002674 variations := []blueprint.Variation{
2675 {Mutator: "link", Variation: "shared"},
2676 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002677
2678 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2679 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2680 }
2681
2682 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2683 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2684 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002685 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002686
Colin Crossfe9acfe2021-06-14 16:13:03 -07002687 for _, lib := range deps.LateStaticLibs {
2688 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2689 actx.AddVariationDependencies([]blueprint.Variation{
2690 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002691 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Crossfe9acfe2021-06-14 16:13:03 -07002692 }
2693
Colin Cross3e5e7782022-06-17 22:17:05 +00002694 for _, lib := range deps.UnexportedStaticLibs {
2695 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2696 actx.AddVariationDependencies([]blueprint.Variation{
2697 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002698 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Cross3e5e7782022-06-17 22:17:05 +00002699 }
2700
Jiyong Park7ed9de32018-10-15 22:25:07 +09002701 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002702 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002703 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2704 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2705 // linking against both the stubs lib and the non-stubs lib at the same time.
2706 continue
2707 }
Colin Cross6e511a92020-07-27 21:26:48 -07002708 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002709 variations := []blueprint.Variation{
2710 {Mutator: "link", Variation: "shared"},
2711 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002712 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002713 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002714
Dan Willemsen59339a22018-07-22 21:18:45 -07002715 actx.AddVariationDependencies([]blueprint.Variation{
2716 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002717 }, dataLibDepTag, deps.DataLibs...)
2718
Colin Crossc8caa062021-09-24 16:50:14 -07002719 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2720
Chris Parsons79d66a52020-06-05 17:26:16 -04002721 actx.AddVariationDependencies([]blueprint.Variation{
2722 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002723 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002724
Colin Cross68861832016-07-08 10:41:41 -07002725 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002726
2727 for _, gen := range deps.GeneratedHeaders {
2728 depTag := genHeaderDepTag
2729 if inList(gen, deps.ReexportGeneratedHeaders) {
2730 depTag = genHeaderExportDepTag
2731 }
2732 actx.AddDependency(c, depTag, gen)
2733 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002734
Dan Albert92fe7402020-07-15 13:33:30 -07002735 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002736 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002737 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002738 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002739 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002740 }
Colin Crossc465efd2021-06-11 18:00:04 -07002741 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002742 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002743 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002744 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002745 if deps.DynamicLinker != "" {
2746 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002747 }
Dan Albert914449f2016-06-17 16:45:24 -07002748
2749 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002750
2751 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002752 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002753 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002754 {Mutator: "link", Variation: "shared"},
2755 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002756 actx.AddVariationDependencies([]blueprint.Variation{
2757 {Mutator: "version", Variation: version},
2758 {Mutator: "link", Variation: "shared"},
2759 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002760
2761 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002762 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002763 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002764 {Mutator: "link", Variation: "shared"},
2765 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002766 actx.AddVariationDependencies([]blueprint.Variation{
2767 {Mutator: "version", Variation: version},
2768 {Mutator: "link", Variation: "shared"},
2769 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002770
2771 if vndkdep := c.vndkdep; vndkdep != nil {
2772 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002773 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002774 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002775 {Mutator: "link", Variation: "shared"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002776 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002777 }
2778 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002779
Vinh Tran367d89d2023-04-28 11:21:25 -04002780 if len(deps.AidlLibs) > 0 {
2781 actx.AddDependency(
2782 c,
2783 aidlLibraryTag,
2784 deps.AidlLibs...,
2785 )
2786 }
2787
Kiyoung Kimee58c932022-10-25 22:59:41 +09002788 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002789}
Colin Cross21b9a242015-03-24 14:15:58 -07002790
Colin Crosse40b4ea2018-10-02 22:25:58 -07002791func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002792 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2793 c.beginMutator(ctx)
2794 }
2795}
2796
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002797// Whether a module can link to another module, taking into
2798// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002799func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002800 tag blueprint.DependencyTag) {
2801
2802 switch t := tag.(type) {
2803 case dependencyTag:
2804 if t != vndkExtDepTag {
2805 return
2806 }
2807 case libraryDependencyTag:
2808 default:
2809 return
2810 }
2811
Ivan Lozanof9e21722020-12-02 09:00:51 -05002812 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002813 // Host code is not restricted
2814 return
2815 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002816
2817 // VNDK is cc.Module supported only for now.
2818 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002819 // Though allowed dependency is limited by the image mutator,
2820 // each vendor and product module needs to check link-type
2821 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002822 if ccTo, ok := to.(*Module); ok {
2823 if ccFrom.vndkdep != nil {
2824 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2825 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002826 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002827 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002828 }
2829 return
2830 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002831 // TODO(b/244244438) : Remove this once all variants are implemented
2832 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2833 return
2834 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002835 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002836 // Platform code can link to anything
2837 return
2838 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002839 if from.InRamdisk() {
2840 // Ramdisk code is not NDK
2841 return
2842 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002843 if from.InVendorRamdisk() {
2844 // Vendor ramdisk code is not NDK
2845 return
2846 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002847 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002848 // Recovery code is not NDK
2849 return
2850 }
Colin Cross31076b32020-10-23 17:22:06 -07002851 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002852 if c.NdkPrebuiltStl() {
2853 // These are allowed, but they don't set sdk_version
2854 return
2855 }
2856 if c.StubDecorator() {
2857 // These aren't real libraries, but are the stub shared libraries that are included in
2858 // the NDK.
2859 return
2860 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002861 if c.isImportedApiLibrary() {
2862 // Imported library from the API surface is a stub library built against interface definition.
2863 return
2864 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002865 }
Logan Chien834b9a62019-01-14 15:39:03 +08002866
Ivan Lozano52767be2019-10-18 14:49:46 -07002867 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002868 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2869 // to link to libc++ (non-NDK and without sdk_version).
2870 return
2871 }
2872
Ivan Lozano52767be2019-10-18 14:49:46 -07002873 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002874 // NDK code linking to platform code is never okay.
2875 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002876 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002877 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002878 }
2879
2880 // At this point we know we have two NDK libraries, but we need to
2881 // check that we're not linking against anything built against a higher
2882 // API level, as it is only valid to link against older or equivalent
2883 // APIs.
2884
Inseob Kim01a28722018-04-11 09:48:45 +09002885 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002886 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002887 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002888 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002889 // Current can't be linked against by anything else.
2890 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002891 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002892 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002893 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002894 if err != nil {
2895 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002896 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002897 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002898 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002899 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002900 if err != nil {
2901 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002902 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002903 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002904 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002905
Inseob Kim01a28722018-04-11 09:48:45 +09002906 if toApi > fromApi {
2907 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002908 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002909 }
2910 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002911 }
Dan Albert202fe492017-12-15 13:56:59 -08002912
2913 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002914 fromStl := from.SelectedStl()
2915 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002916 if fromStl == "" || toStl == "" {
2917 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002918 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002919 // We can be permissive with the system "STL" since it is only the C++
2920 // ABI layer, but in the future we should make sure that everyone is
2921 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002922 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002923 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002924 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2925 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002926 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002927}
2928
Jooyung Han479ca172020-10-19 18:51:07 +09002929func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2930 if c, ok := ctx.Module().(*Module); ok {
2931 ctx.VisitDirectDeps(func(dep android.Module) {
2932 depTag := ctx.OtherModuleDependencyTag(dep)
2933 ccDep, ok := dep.(LinkableInterface)
2934 if ok {
2935 checkLinkType(ctx, c, ccDep, depTag)
2936 }
2937 })
2938 }
2939}
2940
Jiyong Park5fb8c102018-04-09 12:03:06 +09002941// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002942// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2943// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002944// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002945func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2946 check := func(child, parent android.Module) bool {
2947 to, ok := child.(*Module)
2948 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002949 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002950 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002951
Jooyung Hana70f0672019-01-18 15:20:43 +09002952 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2953 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002954 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002955
Jiyong Park0474e1f2021-01-14 14:26:06 +09002956 // These dependencies are not excercised at runtime. Tracking these will give us
2957 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002958 depTag := ctx.OtherModuleDependencyTag(child)
2959 if IsHeaderDepTag(depTag) {
2960 return false
2961 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002962 if depTag == staticVariantTag {
2963 return false
2964 }
2965 if depTag == stubImplDepTag {
2966 return false
2967 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002968
Justin Yun63e9ec72020-10-29 16:49:43 +09002969 // Even if target lib has no vendor variant, keep checking dependency
2970 // graph in case it depends on vendor_available or product_available
2971 // but not double_loadable transtively.
2972 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002973 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002974 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002975
Jiyong Park0474e1f2021-01-14 14:26:06 +09002976 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2977 // one.
2978 if Bool(to.VendorProperties.Double_loadable) {
2979 return true
2980 }
2981
Ivan Lozanod7586b62021-04-01 09:49:36 -04002982 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002983 return false
2984 }
2985
Jooyung Hana70f0672019-01-18 15:20:43 +09002986 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2987 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002988 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002989 return false
2990 }
2991 if module, ok := ctx.Module().(*Module); ok {
2992 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002993 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002994 ctx.WalkDeps(check)
2995 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002996 }
2997 }
2998}
2999
Yu Liue4312402023-01-18 09:15:31 -08003000func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3001 // For the dependency from platform to apex, use the latest stubs
3002 apexSdkVersion := android.FutureApiLevel
3003 if !apexInfo.IsForPlatform() {
3004 apexSdkVersion = apexInfo.MinSdkVersion
3005 }
3006
3007 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3008 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3009 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3010 // (b/144430859)
3011 apexSdkVersion = android.FutureApiLevel
3012 }
3013
3014 return apexSdkVersion
3015}
3016
Colin Crossc99deeb2016-04-11 15:06:20 -07003017// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003018func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003019 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003020
Colin Cross0de8a1e2020-09-18 14:15:30 -07003021 var directStaticDeps []StaticLibraryInfo
3022 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003023
Colin Cross0de8a1e2020-09-18 14:15:30 -07003024 reexportExporter := func(exporter FlagExporterInfo) {
3025 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3026 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3027 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3028 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3029 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003030 }
3031
Colin Cross56a83212020-09-15 18:30:11 -07003032 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
Yu Liue4312402023-01-18 09:15:31 -08003033 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003034
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003035 skipModuleList := map[string]bool{}
3036
3037 var apiImportInfo multitree.ApiImportInfo
3038 hasApiImportInfo := false
3039
3040 ctx.VisitDirectDeps(func(dep android.Module) {
3041 if dep.Name() == "api_imports" {
3042 apiImportInfo = ctx.OtherModuleProvider(dep, multitree.ApiImportsProvider).(multitree.ApiImportInfo)
3043 hasApiImportInfo = true
3044 }
3045 })
3046
3047 if hasApiImportInfo {
3048 targetStubModuleList := map[string]string{}
3049 targetOrigModuleList := map[string]string{}
3050
3051 // Search for dependency which both original module and API imported library with APEX stub exists
3052 ctx.VisitDirectDeps(func(dep android.Module) {
3053 depName := ctx.OtherModuleName(dep)
3054 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
3055 targetStubModuleList[apiLibrary] = depName
3056 }
3057 })
3058 ctx.VisitDirectDeps(func(dep android.Module) {
3059 depName := ctx.OtherModuleName(dep)
3060 if origLibrary, ok := targetStubModuleList[depName]; ok {
3061 targetOrigModuleList[origLibrary] = depName
3062 }
3063 })
3064
3065 // Decide which library should be used between original and API imported library
3066 ctx.VisitDirectDeps(func(dep android.Module) {
3067 depName := ctx.OtherModuleName(dep)
3068 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003069 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003070 skipModuleList[depName] = true
3071 } else {
3072 skipModuleList[apiLibrary] = true
3073 }
3074 }
3075 })
3076 }
3077
Colin Crossd11fcda2017-10-23 17:59:01 -07003078 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003079 depName := ctx.OtherModuleName(dep)
3080 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003081
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003082 if _, ok := skipModuleList[depName]; ok {
3083 // skip this module because original module or API imported module matching with this should be used instead.
3084 return
3085 }
3086
Dan Willemsen47450072021-10-19 20:24:49 -07003087 if depTag == android.DarwinUniversalVariantTag {
3088 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3089 return
3090 }
3091
Vinh Tran367d89d2023-04-28 11:21:25 -04003092 if depTag == aidlLibraryTag {
3093 if ctx.OtherModuleHasProvider(dep, aidl_library.AidlLibraryProvider) {
3094 depPaths.AidlLibraryInfos = append(
3095 depPaths.AidlLibraryInfos,
3096 ctx.OtherModuleProvider(
3097 dep,
3098 aidl_library.AidlLibraryProvider).(aidl_library.AidlLibraryInfo),
3099 )
3100 }
3101 }
3102
Ivan Lozano52767be2019-10-18 14:49:46 -07003103 ccDep, ok := dep.(LinkableInterface)
3104 if !ok {
3105
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003106 // handling for a few module types that aren't cc Module but that are also supported
3107 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003108 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003109 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003110 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3111 genRule.GeneratedSourceFiles()...)
3112 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003113 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003114 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003115 // Support exported headers from a generated_sources dependency
3116 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003117 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003118 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003119 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003120 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003121 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003122 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003123 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003124 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003125 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3126 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003127 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003128 // 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 +09003129 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003130
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003131 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003132 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003133 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003134 }
Colin Crosscef792e2021-06-11 18:01:26 -07003135 case CrtBeginDepTag:
3136 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3137 case CrtEndDepTag:
3138 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003139 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003140 return
3141 }
3142
Colin Crossfe17f6f2019-03-28 19:30:56 -07003143 if depTag == android.ProtoPluginDepTag {
3144 return
3145 }
3146
Colin Crossd11fcda2017-10-23 17:59:01 -07003147 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003148 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3149 return
3150 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003151 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003152 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3153 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003154 return
3155 }
3156
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003157 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003158 // Skip reused objects for stub libraries, they use their own stub object file instead.
3159 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3160 // version mutator, so the stubs variant is created from the shared variant that
3161 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003162 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07003163 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3164 objs := staticAnalogue.ReuseObjects
3165 depPaths.Objs = depPaths.Objs.Append(objs)
3166 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3167 reexportExporter(depExporterInfo)
3168 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003169 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003170 }
3171
Colin Cross6e511a92020-07-27 21:26:48 -07003172 linkFile := ccDep.OutputFile()
3173
3174 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3175 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003176 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003177 return
3178 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003179
Jiyong Parke3867542020-12-03 17:28:25 +09003180 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3181 return
3182 }
3183
Colin Cross0de8a1e2020-09-18 14:15:30 -07003184 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07003185
Colin Cross6e511a92020-07-27 21:26:48 -07003186 var ptr *android.Paths
3187 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003188
Colin Cross6e511a92020-07-27 21:26:48 -07003189 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003190
Colin Cross6e511a92020-07-27 21:26:48 -07003191 switch {
3192 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08003193 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
3194 if !ctx.Config().AllowMissingDependencies() {
3195 ctx.ModuleErrorf("module %q is not a header library", depName)
3196 } else {
3197 ctx.AddMissingDependencies([]string{depName})
3198 }
3199 return
3200 }
Colin Cross6e511a92020-07-27 21:26:48 -07003201 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003202 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
3203 if !ctx.Config().AllowMissingDependencies() {
3204 ctx.ModuleErrorf("module %q is not a shared library", depName)
3205 } else {
3206 ctx.AddMissingDependencies([]string{depName})
3207 }
3208 return
3209 }
Jiyong Parke3867542020-12-03 17:28:25 +09003210
Jiyong Park7d55b612021-06-11 17:22:09 +09003211 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3212 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003213
Jiyong Park1ad8e162020-12-01 23:40:09 +09003214 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3215 // linkFile, depFile, and ptr.
3216 if c.IsStubs() {
3217 break
3218 }
3219
Colin Cross0de8a1e2020-09-18 14:15:30 -07003220 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3221 depFile = sharedLibraryInfo.TableOfContents
3222
Colin Cross6e511a92020-07-27 21:26:48 -07003223 ptr = &depPaths.SharedLibs
3224 switch libDepTag.Order {
3225 case earlyLibraryDependency:
3226 ptr = &depPaths.EarlySharedLibs
3227 depPtr = &depPaths.EarlySharedLibsDeps
3228 case normalLibraryDependency:
3229 ptr = &depPaths.SharedLibs
3230 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003231 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003232 case lateLibraryDependency:
3233 ptr = &depPaths.LateSharedLibs
3234 depPtr = &depPaths.LateSharedLibsDeps
3235 default:
3236 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003237 }
Colin Cross6e511a92020-07-27 21:26:48 -07003238 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003239 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
3240 if !ctx.Config().AllowMissingDependencies() {
3241 ctx.ModuleErrorf("module %q is not a static library", depName)
3242 } else {
3243 ctx.AddMissingDependencies([]string{depName})
3244 }
3245 return
3246 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003247
3248 // Stubs lib doesn't link to the static lib dependencies. Don't set
3249 // linkFile, depFile, and ptr.
3250 if c.IsStubs() {
3251 break
3252 }
3253
Colin Cross0de8a1e2020-09-18 14:15:30 -07003254 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3255 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003256 if libDepTag.wholeStatic {
3257 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003258 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3259 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003260 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003261 // This case normally catches prebuilt static
3262 // libraries, but it can also occur when
3263 // AllowMissingDependencies is on and the
3264 // dependencies has no sources of its own
3265 // but has a whole_static_libs dependency
3266 // on a missing library. We want to depend
3267 // on the .a file so that there is something
3268 // in the dependency tree that contains the
3269 // error rule for the missing transitive
3270 // dependency.
3271 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003272 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003273 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3274 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003275 } else {
3276 switch libDepTag.Order {
3277 case earlyLibraryDependency:
3278 panic(fmt.Errorf("early static libs not suppported"))
3279 case normalLibraryDependency:
3280 // static dependencies will be handled separately so they can be ordered
3281 // using transitive dependencies.
3282 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003283 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003284 case lateLibraryDependency:
3285 ptr = &depPaths.LateStaticLibs
3286 default:
3287 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003288 }
3289 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003290 if libDepTag.unexportedSymbols {
3291 depPaths.LdFlags = append(depPaths.LdFlags,
3292 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3293 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003294 }
3295
Colin Cross6e511a92020-07-27 21:26:48 -07003296 if libDepTag.static() && !libDepTag.wholeStatic {
3297 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3298 ctx.ModuleErrorf("module %q not a static library", depName)
3299 return
3300 }
Logan Chien43d34c32017-12-20 01:17:32 +08003301
Colin Cross6e511a92020-07-27 21:26:48 -07003302 // When combining coverage files for shared libraries and executables, coverage files
3303 // in static libraries act as if they were whole static libraries. The same goes for
3304 // source based Abi dump files.
3305 if c, ok := ccDep.(*Module); ok {
3306 staticLib := c.linker.(libraryInterface)
3307 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3308 staticLib.objs().coverageFiles...)
3309 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3310 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003311 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003312 // Handle non-CC modules here
3313 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003314 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003315 }
3316 }
3317
Colin Cross6e511a92020-07-27 21:26:48 -07003318 if ptr != nil {
3319 if !linkFile.Valid() {
3320 if !ctx.Config().AllowMissingDependencies() {
3321 ctx.ModuleErrorf("module %q missing output file", depName)
3322 } else {
3323 ctx.AddMissingDependencies([]string{depName})
3324 }
3325 return
3326 }
3327 *ptr = append(*ptr, linkFile.Path())
3328 }
3329
3330 if depPtr != nil {
3331 dep := depFile
3332 if !dep.Valid() {
3333 dep = linkFile
3334 }
3335 *depPtr = append(*depPtr, dep.Path())
3336 }
3337
Colin Cross0de8a1e2020-09-18 14:15:30 -07003338 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3339 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3340 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3341 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3342
3343 if libDepTag.reexportFlags {
3344 reexportExporter(depExporterInfo)
3345 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3346 // Re-exported shared library headers must be included as well since they can help us with type information
3347 // about template instantiations (instantiated from their headers).
3348 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
3349 // scripts.
3350 c.sabi.Properties.ReexportedIncludes = append(
3351 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3352 }
3353
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003354 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003355 switch {
3356 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003357 c.Properties.AndroidMkHeaderLibs = append(
3358 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003359 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003360 if lib := moduleLibraryInterface(dep); lib != nil {
3361 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003362 // Add the dependency to the APEX(es) providing the library so that
3363 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07003364 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09003365 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003366 c.Properties.ApexesProvidingSharedLibs = append(
3367 c.Properties.ApexesProvidingSharedLibs, an)
3368 }
3369 }
3370 }
3371
3372 // Note: the order of libs in this list is not important because
3373 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003374 c.Properties.AndroidMkSharedLibs = append(
3375 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003376 // Record BaseLibName for snapshots.
3377 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003378 case libDepTag.static():
3379 if libDepTag.wholeStatic {
3380 c.Properties.AndroidMkWholeStaticLibs = append(
3381 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3382 } else {
3383 c.Properties.AndroidMkStaticLibs = append(
3384 c.Properties.AndroidMkStaticLibs, makeLibName)
3385 }
Justin Yun5e035862021-06-29 20:50:37 +09003386 // Record BaseLibName for snapshots.
3387 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003388 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003389 } else if !c.IsStubs() {
3390 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3391
Colin Cross6e511a92020-07-27 21:26:48 -07003392 switch depTag {
3393 case runtimeDepTag:
3394 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003395 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003396 // Record BaseLibName for snapshots.
3397 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003398 case objDepTag:
3399 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3400 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003401 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003402 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003403 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003404 case dynamicLinkerDepTag:
3405 depPaths.DynamicLinker = linkFile
3406 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003407 }
Colin Crossca860ac2016-01-04 14:34:37 -08003408 })
3409
Jeff Gaston294356f2017-09-27 17:05:30 -07003410 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003411 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3412 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3413 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003414
Colin Crossdd84e052017-05-17 13:44:16 -07003415 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003416 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003417 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3418 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003419 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003420 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3421 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003422 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003423 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003424 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003425
3426 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003427 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003428 }
Colin Crossdd84e052017-05-17 13:44:16 -07003429
Colin Crossca860ac2016-01-04 14:34:37 -08003430 return depPaths
3431}
3432
Spandan Das604f3762023-03-16 22:51:40 +00003433func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003434 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003435 thisModule, ok := ctx.Module().(android.ApexModule)
3436 if !ok {
3437 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3438 }
3439
3440 useVndk := false
3441 bootstrap := false
3442 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3443 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3444 } else {
3445 useVndk = linkable.UseVndk()
3446 bootstrap = linkable.Bootstrap()
3447 }
3448
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003449 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
3450
3451 useStubs := false
3452
3453 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3454 if !apexInfo.IsForPlatform() {
3455 // For platform libraries, use current version of LLNDK
3456 // If this is for use_vendor apex we will apply the same rules
3457 // of apex sdk enforcement below to choose right version.
3458 useStubs = true
3459 }
3460 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3461 // If not building for APEX or the containing APEX allows the use of
3462 // platform APIs, use stubs only when it is from an APEX (and not from
3463 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3464 // bootstrap modules, always link to non-stub variant
3465 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3466
3467 isApexImportedApiLibrary := false
3468
3469 if cc, ok := dep.(*Module); ok {
3470 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3471 if apiLibrary.hasApexStubs() {
3472 isApexImportedApiLibrary = true
3473 }
3474 }
3475 }
3476
3477 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3478
3479 if useStubs {
3480 // Another exception: if this module is a test for an APEX, then
3481 // it is linked with the non-stub variant of a module in the APEX
3482 // as if this is part of the APEX.
3483 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
3484 for _, apexContents := range testFor.ApexContents {
3485 if apexContents.DirectlyInApex(depName) {
3486 useStubs = false
3487 break
3488 }
3489 }
3490 }
3491 if useStubs {
3492 // Yet another exception: If this module and the dependency are
3493 // available to the same APEXes then skip stubs between their
3494 // platform variants. This complements the test_for case above,
3495 // which avoids the stubs on a direct APEX library dependency, by
3496 // avoiding stubs for indirect test dependencies as well.
3497 //
3498 // TODO(b/183882457): This doesn't work if the two libraries have
3499 // only partially overlapping apex_available. For that test_for
3500 // modules would need to be split into APEX variants and resolved
3501 // separately for each APEX they have access to.
3502 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3503 useStubs = false
3504 }
3505 }
3506 } else {
3507 // If building for APEX, use stubs when the parent is in any APEX that
3508 // the child is not in.
3509 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3510 }
3511
3512 return useStubs
3513}
3514
3515// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3516// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3517// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3518// has different level of updatability. For example, if a library foo in an APEX depends on a
3519// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3520// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3521// same APEX as foo, the non-stub variant of bar is used.
3522func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3523 depTag := ctx.OtherModuleDependencyTag(dep)
3524 libDepTag, ok := depTag.(libraryDependencyTag)
3525 if !ok || !libDepTag.shared() {
3526 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3527 }
3528
Jiyong Park7d55b612021-06-11 17:22:09 +09003529 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
3530 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3531 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Jiyong Park7d55b612021-06-11 17:22:09 +09003532
3533 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003534 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003535 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003536 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3537 toUse := stubs[len(stubs)-1]
3538 sharedLibraryInfo = toUse.SharedLibraryInfo
3539 depExporterInfo = toUse.FlagExporterInfo
3540 }
3541 }
3542 return sharedLibraryInfo, depExporterInfo
3543}
3544
Colin Cross0de8a1e2020-09-18 14:15:30 -07003545// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3546// to match the topological order of the dependency tree, including any static analogues of
3547// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3548// of the transitive dependencies.
3549func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
3550 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
3551 var staticPaths android.Paths
3552 for _, staticDep := range staticDeps {
3553 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3554 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3555 }
3556 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003557 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3558 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003559 }
3560 }
3561 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3562
3563 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3564
3565 // reorder the dependencies based on transitive dependencies
3566 staticPaths = android.FirstUniquePaths(staticPaths)
3567 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3568
3569 if len(orderedStaticPaths) != len(staticPaths) {
3570 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3571 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3572 }
3573
3574 return orderedStaticPaths, transitiveStaticLibs
3575}
3576
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003577// BaseLibName trims known prefixes and suffixes
3578func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003579 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3580 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003581 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003582 return libName
3583}
3584
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003585func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003586 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003587 ccDepModule, _ := ccDep.(*Module)
3588 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003589 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003590
Justin Yuncbca3732021-02-03 19:24:13 +09003591 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003592 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003593 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003594 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003595
Ivan Lozanod1dec542021-05-26 15:33:11 -04003596 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003597 }
3598 }
3599
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003600 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3601 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003602 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3603 // core module instead.
3604 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003605 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003606 // The vendor and product modules in Make will have been renamed to not conflict with the
3607 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003608 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003609 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003610 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003611 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003612 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003613 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003614 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003615 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003616 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003617 } else {
3618 return libName
3619 }
3620}
3621
Colin Crossca860ac2016-01-04 14:34:37 -08003622func (c *Module) InstallInData() bool {
3623 if c.installer == nil {
3624 return false
3625 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003626 return c.installer.inData()
3627}
3628
3629func (c *Module) InstallInSanitizerDir() bool {
3630 if c.installer == nil {
3631 return false
3632 }
3633 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003634 return true
3635 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003636 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003637}
3638
Yifan Hong1b3348d2020-01-21 15:53:22 -08003639func (c *Module) InstallInRamdisk() bool {
3640 return c.InRamdisk()
3641}
3642
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003643func (c *Module) InstallInVendorRamdisk() bool {
3644 return c.InVendorRamdisk()
3645}
3646
Jiyong Parkf9332f12018-02-01 00:54:12 +09003647func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003648 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003649}
3650
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003651func (c *Module) MakeUninstallable() {
3652 if c.installer == nil {
3653 c.ModuleBase.MakeUninstallable()
3654 return
3655 }
3656 c.installer.makeUninstallable(c)
3657}
3658
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003659func (c *Module) HostToolPath() android.OptionalPath {
3660 if c.installer == nil {
3661 return android.OptionalPath{}
3662 }
3663 return c.installer.hostToolPath()
3664}
3665
Nan Zhangd4e641b2017-07-12 12:55:28 -07003666func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3667 return c.outputFile
3668}
3669
Colin Cross41955e82019-05-29 14:40:35 -07003670func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3671 switch tag {
3672 case "":
3673 if c.outputFile.Valid() {
3674 return android.Paths{c.outputFile.Path()}, nil
3675 }
3676 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003677 case "unstripped":
3678 if c.linker != nil {
3679 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3680 }
3681 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003682 default:
3683 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003684 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003685}
3686
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003687func (c *Module) static() bool {
3688 if static, ok := c.linker.(interface {
3689 static() bool
3690 }); ok {
3691 return static.static()
3692 }
3693 return false
3694}
3695
Jiyong Park379de2f2018-12-19 02:47:14 +09003696func (c *Module) staticBinary() bool {
3697 if static, ok := c.linker.(interface {
3698 staticBinary() bool
3699 }); ok {
3700 return static.staticBinary()
3701 }
3702 return false
3703}
3704
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003705func (c *Module) testBinary() bool {
3706 if test, ok := c.linker.(interface {
3707 testBinary() bool
3708 }); ok {
3709 return test.testBinary()
3710 }
3711 return false
3712}
3713
Jingwen Chen537242c2022-08-24 11:53:27 +00003714func (c *Module) testLibrary() bool {
3715 if test, ok := c.linker.(interface {
3716 testLibrary() bool
3717 }); ok {
3718 return test.testLibrary()
3719 }
3720 return false
3721}
3722
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003723func (c *Module) benchmarkBinary() bool {
3724 if b, ok := c.linker.(interface {
3725 benchmarkBinary() bool
3726 }); ok {
3727 return b.benchmarkBinary()
3728 }
3729 return false
3730}
3731
3732func (c *Module) fuzzBinary() bool {
3733 if f, ok := c.linker.(interface {
3734 fuzzBinary() bool
3735 }); ok {
3736 return f.fuzzBinary()
3737 }
3738 return false
3739}
3740
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003741// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3742func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003743 if h, ok := c.linker.(interface {
3744 header() bool
3745 }); ok {
3746 return h.header()
3747 }
3748 return false
3749}
3750
Ivan Lozanod7586b62021-04-01 09:49:36 -04003751func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003752 if b, ok := c.linker.(interface {
3753 binary() bool
3754 }); ok {
3755 return b.binary()
3756 }
3757 return false
3758}
3759
Justin Yun5e035862021-06-29 20:50:37 +09003760func (c *Module) StaticExecutable() bool {
3761 if b, ok := c.linker.(*binaryDecorator); ok {
3762 return b.static()
3763 }
3764 return false
3765}
3766
Ivan Lozanod7586b62021-04-01 09:49:36 -04003767func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003768 if o, ok := c.linker.(interface {
3769 object() bool
3770 }); ok {
3771 return o.object()
3772 }
3773 return false
3774}
3775
Ivan Lozanof9e21722020-12-02 09:00:51 -05003776func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003777 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003778 if c.IsLlndk() {
3779 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003780 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003781 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003782 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003783 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003784 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003785 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003786 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003787 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003788 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003789 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003790 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003791 return "native:product"
3792 }
Jooyung Han38002912019-05-16 04:01:54 +09003793 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003794 } else if c.InRamdisk() {
3795 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003796 } else if c.InVendorRamdisk() {
3797 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003798 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003799 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003800 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003801 return "native:ndk:none:none"
3802 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3803 //family, link := getNdkStlFamilyAndLinkType(c)
3804 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003805 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003806 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003807 } else {
3808 return "native:platform"
3809 }
3810}
3811
Jiyong Park9d452992018-10-03 00:38:19 +09003812// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003813// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003814func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003815 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003816 // Stub libs and prebuilt libs in a versioned SDK are not
3817 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003818 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003819 } else if _, ok := c.linker.(testPerSrc); ok {
3820 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003821 }
3822 return false
3823}
3824
Jiyong Parka90ca002019-10-07 15:47:24 +09003825func (c *Module) AvailableFor(what string) bool {
3826 if linker, ok := c.linker.(interface {
3827 availableFor(string) bool
3828 }); ok {
3829 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3830 } else {
3831 return c.ApexModuleBase.AvailableFor(what)
3832 }
3833}
3834
Jiyong Park62304bb2020-04-13 16:19:48 +09003835func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003836 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003837}
3838
Paul Duffin0cb37b92020-03-04 14:52:46 +00003839func (c *Module) EverInstallable() bool {
3840 return c.installer != nil &&
3841 // Check to see whether the module is actually ever installable.
3842 c.installer.everInstallable()
3843}
3844
Ivan Lozanod7586b62021-04-01 09:49:36 -04003845func (c *Module) PreventInstall() bool {
3846 return c.Properties.PreventInstall
3847}
3848
3849func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003850 if c.library != nil {
3851 if i := c.library.installable(); i != nil {
3852 return i
3853 }
3854 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003855 return c.Properties.Installable
3856}
3857
3858func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003859 ret := c.EverInstallable() &&
3860 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003861 proptools.BoolDefault(c.Installable(), true) &&
3862 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003863
3864 // The platform variant doesn't need further condition. Apex variants however might not
3865 // be installable because it will likely to be included in the APEX and won't appear
3866 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003867 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003868 return ret
3869 }
3870
3871 // Special case for modules that are configured to be installed to /data, which includes
3872 // test modules. For these modules, both APEX and non-APEX variants are considered as
3873 // installable. This is because even the APEX variants won't be included in the APEX, but
3874 // will anyway be installed to /data/*.
3875 // See b/146995717
3876 if c.InstallInData() {
3877 return ret
3878 }
3879
3880 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003881}
3882
Logan Chien41eabe62019-04-10 13:33:58 +08003883func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3884 if c.linker != nil {
3885 if library, ok := c.linker.(*libraryDecorator); ok {
3886 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3887 }
3888 }
3889}
3890
Jiyong Park45bf82e2020-12-15 22:29:02 +09003891var _ android.ApexModule = (*Module)(nil)
3892
3893// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003894func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003895 depTag := ctx.OtherModuleDependencyTag(dep)
3896 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3897
3898 if cc, ok := dep.(*Module); ok {
3899 if cc.HasStubsVariants() {
3900 if isLibDepTag && libDepTag.shared() {
3901 // dynamic dep to a stubs lib crosses APEX boundary
3902 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003903 }
Colin Cross6e511a92020-07-27 21:26:48 -07003904 if IsRuntimeDepTag(depTag) {
3905 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003906 return false
3907 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003908 }
Zhijun Heec285872021-04-24 10:47:08 -07003909 if cc.IsLlndk() {
3910 return false
3911 }
Colin Crossaac32222020-07-29 12:51:56 -07003912 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003913 // shared_lib dependency from a static lib is considered as crossing
3914 // the APEX boundary because the dependency doesn't actually is
3915 // linked; the dependency is used only during the compilation phase.
3916 return false
3917 }
Jiyong Parke3867542020-12-03 17:28:25 +09003918
3919 if isLibDepTag && libDepTag.excludeInApex {
3920 return false
3921 }
Colin Cross6e511a92020-07-27 21:26:48 -07003922 }
Colin Crossc1b36442021-05-06 13:42:48 -07003923 if depTag == stubImplDepTag {
3924 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003925 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003926 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003927 if depTag == staticVariantTag {
3928 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3929 // actually mean that the static lib (and its dependencies) are copied into the
3930 // APEX.
3931 return false
3932 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003933 return true
3934}
3935
Jiyong Park45bf82e2020-12-15 22:29:02 +09003936// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003937func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3938 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003939 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3940 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3941 return nil
3942 }
Jooyung Han749dc692020-04-15 11:03:39 +09003943 // We don't check for prebuilt modules
3944 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3945 return nil
3946 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003947
Jooyung Han749dc692020-04-15 11:03:39 +09003948 minSdkVersion := c.MinSdkVersion()
3949 if minSdkVersion == "apex_inherit" {
3950 return nil
3951 }
3952 if minSdkVersion == "" {
3953 // JNI libs within APK-in-APEX fall into here
3954 // Those are okay to set sdk_version instead
3955 // We don't have to check if this is a SDK variant because
3956 // non-SDK variant resets sdk_version, which works too.
3957 minSdkVersion = c.SdkVersion()
3958 }
Dan Albertc8060532020-07-22 22:32:17 -07003959 if minSdkVersion == "" {
3960 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3961 }
3962 // Not using nativeApiLevelFromUser because the context here is not
3963 // necessarily a native context.
3964 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003965 if err != nil {
3966 return err
3967 }
Dan Albertc8060532020-07-22 22:32:17 -07003968
Colin Cross8ca61c12022-10-06 21:00:14 -07003969 // A dependency only needs to support a min_sdk_version at least
3970 // as high as the api level that the architecture was introduced in.
3971 // This allows introducing new architectures in the platform that
3972 // need to be included in apexes that normally require an older
3973 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08003974 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07003975 if sdkVersion.LessThan(minApiForArch) {
3976 sdkVersion = minApiForArch
3977 }
3978
Dan Albertc8060532020-07-22 22:32:17 -07003979 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003980 return fmt.Errorf("newer SDK(%v)", ver)
3981 }
3982 return nil
3983}
3984
Paul Duffinb5769c12021-05-12 16:16:51 +01003985// Implements android.ApexModule
3986func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3987 // stub libraries and native bridge libraries are always available to platform
3988 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3989}
3990
Jooyung Han91f92032022-02-04 12:36:33 +09003991// Overrides android.ApexModuleBase.UniqueApexVariations
3992func (c *Module) UniqueApexVariations() bool {
3993 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
3994 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
3995 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09003996 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09003997 return c.UseVndk() && c.IsVndk()
3998}
3999
Inseob Kima1888ce2022-10-04 14:42:02 +09004000func (c *Module) overriddenModules() []string {
4001 if o, ok := c.linker.(overridable); ok {
4002 return o.overriddenModules()
4003 }
4004 return nil
4005}
4006
Rob Seymour925aa092021-08-10 20:42:03 +00004007var _ snapshot.RelativeInstallPath = (*Module)(nil)
4008
Liz Kammer35ca77e2021-12-22 15:31:40 -05004009type moduleType int
4010
4011const (
4012 unknownType moduleType = iota
4013 binary
4014 object
4015 fullLibrary
4016 staticLibrary
4017 sharedLibrary
4018 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004019 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004020 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004021)
4022
4023func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004024 if c.testBinary() {
4025 // testBinary is also a binary, so this comes before the c.Binary()
4026 // conditional. A testBinary has additional implicit dependencies and
4027 // other test-only semantics.
4028 return testBin
4029 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004030 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004031 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004032 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004033 } else if c.testLibrary() {
4034 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4035 // will let them add implicit compile deps on gtest, for example.
4036 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004037 // For now, treat them as regular libraries.
4038 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004039 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004040 static := false
4041 shared := false
4042 if library, ok := c.linker.(*libraryDecorator); ok {
4043 static = library.MutatedProperties.BuildStatic
4044 shared = library.MutatedProperties.BuildShared
4045 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4046 static = library.MutatedProperties.BuildStatic
4047 shared = library.MutatedProperties.BuildShared
4048 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004049 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004050 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004051 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004052 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004053 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004054 return staticLibrary
4055 }
4056 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004057 } else if c.isNDKStubLibrary() {
4058 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004059 }
4060 return unknownType
4061}
4062
4063// ConvertWithBp2build converts Module to Bazel for bp2build.
4064func (c *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
4065 prebuilt := c.IsPrebuilt()
4066 switch c.typ() {
4067 case binary:
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxb12ff592022-09-01 15:04:04 +00004068 if prebuilt {
4069 prebuiltBinaryBp2Build(ctx, c)
4070 } else {
Jingwen Chen537242c2022-08-24 11:53:27 +00004071 binaryBp2build(ctx, c)
4072 }
4073 case testBin:
4074 if !prebuilt {
4075 testBinaryBp2build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004076 }
4077 case object:
Colin Crossc5075e92022-12-05 16:46:39 -08004078 if prebuilt {
4079 prebuiltObjectBp2Build(ctx, c)
4080 } else {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004081 objectBp2Build(ctx, c)
4082 }
4083 case fullLibrary:
4084 if !prebuilt {
4085 libraryBp2Build(ctx, c)
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004086 } else {
4087 prebuiltLibraryBp2Build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004088 }
4089 case headerLibrary:
4090 libraryHeadersBp2Build(ctx, c)
4091 case staticLibrary:
Liz Kammer35ca77e2021-12-22 15:31:40 -05004092 if prebuilt {
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004093 prebuiltLibraryStaticBp2Build(ctx, c, false)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004094 } else {
4095 sharedOrStaticLibraryBp2Build(ctx, c, true)
4096 }
4097 case sharedLibrary:
4098 if prebuilt {
4099 prebuiltLibrarySharedBp2Build(ctx, c)
4100 } else {
4101 sharedOrStaticLibraryBp2Build(ctx, c, false)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004102 }
Spandan Das8b4a5f32022-09-29 00:28:24 +00004103 }
4104}
4105
4106var _ android.ApiProvider = (*Module)(nil)
4107
4108func (c *Module) ConvertWithApiBp2build(ctx android.TopDownMutatorContext) {
Spandan Das4238c652022-09-09 01:38:47 +00004109 if c.IsPrebuilt() {
4110 return
4111 }
Spandan Das8b4a5f32022-09-29 00:28:24 +00004112 switch c.typ() {
Spandan Das4238c652022-09-09 01:38:47 +00004113 case fullLibrary:
4114 apiContributionBp2Build(ctx, c)
4115 case sharedLibrary:
4116 apiContributionBp2Build(ctx, c)
4117 case headerLibrary:
4118 // Aggressively generate api targets for all header modules
4119 // This is necessary since the header module does not know if it is a dep of API surface stub library
4120 apiLibraryHeadersBp2Build(ctx, c)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004121 }
4122}
4123
Colin Crosscfad1192015-11-02 16:43:11 -08004124// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004125type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004126 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004127 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004128 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004129}
4130
Patrice Arrudac249c712019-03-19 17:00:29 -07004131// cc_defaults provides a set of properties that can be inherited by other cc
4132// modules. A module can use the properties from a cc_defaults using
4133// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4134// merged (when possible) by prepending the default module's values to the
4135// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004136func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004137 return DefaultsFactory()
4138}
4139
Colin Cross36242852017-06-23 15:06:31 -07004140func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004141 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004142
Colin Cross36242852017-06-23 15:06:31 -07004143 module.AddProperties(props...)
4144 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004145 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004146 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004147 &BaseCompilerProperties{},
4148 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004149 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004150 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004151 &StaticProperties{},
4152 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004153 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004154 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004155 &TestLinkerProperties{},
4156 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004157 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004158 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004159 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004160 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004161 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004162 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004163 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004164 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004165 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004166 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004167 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004168 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004169 &AfdoProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07004170 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004171 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004172 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4173 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004174 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004175 )
Colin Crosscfad1192015-11-02 16:43:11 -08004176
Jooyung Hancc372c52019-09-25 15:18:44 +09004177 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004178
4179 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004180}
4181
Jiyong Park2286afd2020-06-16 21:58:53 +09004182func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004183 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004184}
4185
Kiyoung Kim51279d32022-08-24 14:10:46 +09004186func (c *Module) isImportedApiLibrary() bool {
4187 _, ok := c.linker.(*apiLibraryDecorator)
4188 return ok
4189}
4190
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004191func kytheExtractAllFactory() android.Singleton {
4192 return &kytheExtractAllSingleton{}
4193}
4194
4195type kytheExtractAllSingleton struct {
4196}
4197
4198func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4199 var xrefTargets android.Paths
4200 ctx.VisitAllModules(func(module android.Module) {
4201 if ccModule, ok := module.(xref); ok {
4202 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4203 }
4204 })
4205 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4206 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004207 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004208 }
4209}
4210
Jihoon Kangf78a8902022-09-01 22:47:07 +00004211func (c *Module) Partition() string {
4212 if p, ok := c.installer.(interface {
4213 getPartition() string
4214 }); ok {
4215 return p.getPartition()
4216 }
4217 return ""
4218}
4219
Colin Cross06a931b2015-10-28 17:23:31 -07004220var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004221var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004222var BoolPtr = proptools.BoolPtr
4223var String = proptools.String
4224var StringPtr = proptools.StringPtr