blob: 2bfb372edd8883b1664a11669adaba7038a677f2 [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 {
Sam Delmericoef69d472023-04-18 17:32:43 -04001916 if !allEnabledSanitizersSupportedByBazel(c) {
1917 //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
1923func allEnabledSanitizersSupportedByBazel(c *Module) bool {
1924 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,
1931 sanitizeProps.Cfi,
1932 sanitizeProps.Scudo,
1933 BoolPtr(len(c.sanitize.Properties.Sanitize.Recover) > 0),
1934 BoolPtr(c.sanitize.Properties.Sanitize.Blocklist != nil),
1935 }
1936 for _, san := range unsupportedSanitizers {
1937 if Bool(san) {
1938 return false
1939 }
1940 }
1941
1942 for _, san := range Sanitizers {
1943 if san == intOverflow {
1944 // TODO(b/261058727): enable mixed builds for all modules with UBSan
1945 // Currently we can only support ubsan when minimum runtime is used.
1946 ubsanEnabled := Bool(sanitizeProps.Integer_overflow) || len(sanitizeProps.Misc_undefined) > 0
1947 if ubsanEnabled && !c.MinimalRuntimeNeeded() {
1948 return false
1949 }
1950 } else if c.sanitize.isSanitizerEnabled(san) {
1951 return false
1952 }
1953 }
1954
1955 return true
Yu Liue4312402023-01-18 09:15:31 -08001956}
1957
1958func GetApexConfigKey(ctx android.BaseModuleContext) *android.ApexConfigKey {
1959 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1960 if !apexInfo.IsForPlatform() {
Yu Liubfb23622023-02-22 10:42:15 -08001961 if !ctx.Config().BazelContext.IsModuleDclaAllowed(ctx.Module().Name()) {
1962 return nil
1963 }
Yu Liue4312402023-01-18 09:15:31 -08001964 apexKey := android.ApexConfigKey{
1965 WithinApex: true,
1966 ApexSdkVersion: findApexSdkVersion(ctx, apexInfo).String(),
1967 }
1968 return &apexKey
1969 }
1970
1971 return nil
Chris Parsonsf874e462022-05-10 13:50:12 -04001972}
1973
1974func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) {
1975 bazelModuleLabel := c.getBazelModuleLabel(ctx)
Chris Parsonsf874e462022-05-10 13:50:12 -04001976 c.bazelHandler.ProcessBazelQueryResponse(ctx, bazelModuleLabel)
1977
1978 c.Properties.SubName = GetSubnameProperty(ctx, c)
1979 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1980 if !apexInfo.IsForPlatform() {
1981 c.hideApexVariantFromMake = true
Chris Parsons77acf2e2021-12-03 17:27:16 -05001982 }
Liz Kammer35ca77e2021-12-22 15:31:40 -05001983
Chris Parsonsf874e462022-05-10 13:50:12 -04001984 c.makeLinkType = GetMakeLinkType(ctx, c)
1985
1986 mctx := &moduleContext{
1987 ModuleContext: ctx,
1988 moduleContextImpl: moduleContextImpl{
1989 mod: c,
1990 },
Chris Parsons8d6e4332021-02-22 16:13:50 -05001991 }
Chris Parsonsf874e462022-05-10 13:50:12 -04001992 mctx.ctx = mctx
1993
Jingwen Chen3952a902022-12-12 12:20:58 +00001994 // TODO(b/244432500): Get the tradefed config from the bazel target instead
1995 // of generating it with Soong.
Chris Parsonsf874e462022-05-10 13:50:12 -04001996 c.maybeInstall(mctx, apexInfo)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001997}
1998
Sam Delmerico75dbca22023-04-20 13:13:25 +00001999func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
2000 ctx := &moduleContext{
2001 ModuleContext: actx,
2002 moduleContextImpl: moduleContextImpl{
2003 mod: c,
2004 },
2005 }
2006 ctx.ctx = ctx
2007 return ctx
2008}
2009
Spandan Das20fce2d2023-04-12 17:21:39 +00002010// TODO (b/277651159): Remove this allowlist
2011var (
2012 skipStubLibraryMultipleApexViolation = map[string]bool{
2013 "libclang_rt.asan": true,
2014 "libclang_rt.hwasan": true,
2015 // runtime apex
2016 "libc": true,
2017 "libc_hwasan": true,
2018 "libdl_android": true,
2019 "libm": true,
2020 "libdl": true,
2021 // art apex
2022 "libandroidio": true,
2023 "libdexfile": true,
2024 "libnativebridge": true,
2025 "libnativehelper": true,
2026 "libnativeloader": true,
2027 "libsigchain": true,
2028 }
2029)
2030
2031// Returns true if a stub library could be installed in multiple apexes
2032func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2033 // If this is not an apex variant, no check necessary
2034 if !c.InAnyApex() {
2035 return false
2036 }
2037 // If this is not a stub library, no check necessary
2038 if !c.HasStubsVariants() {
2039 return false
2040 }
2041 // Skip the allowlist
2042 // Use BaseModuleName so that this matches prebuilts.
2043 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2044 return false
2045 }
2046
2047 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
2048 // Stub libraries should not have more than one apex_available
2049 if len(aaWithoutTestApexes) > 1 {
2050 return true
2051 }
2052 // Stub libraries should not use the wildcard
2053 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
2054 return true
2055 }
2056 // Default: no violation
2057 return false
2058}
2059
Chris Parsons8d6e4332021-02-22 16:13:50 -05002060func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05002061 // Handle the case of a test module split by `test_per_src` mutator.
2062 //
2063 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
2064 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
2065 // module and return early, as this module does not produce an output file per se.
2066 if c.IsTestPerSrcAllTestsVariation() {
2067 c.outputFile = android.OptionalPath{}
2068 return
2069 }
2070
Ivan Lozanof1868af2022-04-12 13:08:36 -04002071 c.Properties.SubName = GetSubnameProperty(actx, c)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002072 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2073 if !apexInfo.IsForPlatform() {
2074 c.hideApexVariantFromMake = true
2075 }
2076
Chris Parsonseefc9e62021-04-02 17:36:47 -04002077 c.makeLinkType = GetMakeLinkType(actx, c)
2078
Sam Delmerico75dbca22023-04-20 13:13:25 +00002079 ctx := moduleContextFromAndroidModuleContext(actx, c)
Colin Crossca860ac2016-01-04 14:34:37 -08002080
Colin Crossf18e1102017-11-16 14:33:08 -08002081 deps := c.depsToPaths(ctx)
2082 if ctx.Failed() {
2083 return
2084 }
2085
Spandan Das20fce2d2023-04-12 17:21:39 +00002086 if c.stubLibraryMultipleApexViolation(actx) {
2087 actx.PropertyErrorf("apex_available",
2088 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2089 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002090 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2091 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002092 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2093 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002094 }
2095
Colin Crossca860ac2016-01-04 14:34:37 -08002096 flags := Flags{
2097 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002098 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002099 }
Colin Crossca860ac2016-01-04 14:34:37 -08002100 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002101 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002102 }
2103 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002104 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002105 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002106 if c.stl != nil {
2107 flags = c.stl.flags(ctx, flags)
2108 }
Colin Cross16b23492016-01-06 14:41:07 -08002109 if c.sanitize != nil {
2110 flags = c.sanitize.flags(ctx, flags)
2111 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002112 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002113 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002114 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002115 if c.fuzzer != nil {
2116 flags = c.fuzzer.flags(ctx, flags)
2117 }
Stephen Craneba090d12017-05-09 15:44:35 -07002118 if c.lto != nil {
2119 flags = c.lto.flags(ctx, flags)
2120 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002121 if c.afdo != nil {
2122 flags = c.afdo.flags(ctx, flags)
2123 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002124 if c.pgo != nil {
2125 flags = c.pgo.flags(ctx, flags)
2126 }
Colin Crossca860ac2016-01-04 14:34:37 -08002127 for _, feature := range c.features {
2128 flags = feature.flags(ctx, flags)
2129 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002130 if ctx.Failed() {
2131 return
2132 }
2133
Colin Cross4af21ed2019-11-04 09:37:55 -08002134 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2135 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2136 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002137
Colin Cross4af21ed2019-11-04 09:37:55 -08002138 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002139
2140 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002141 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002142 }
2143 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002144 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002145 }
2146
Colin Cross3e5e7782022-06-17 22:17:05 +00002147 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2148
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002149 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002150 // We need access to all the flags seen by a source file.
2151 if c.sabi != nil {
2152 flags = c.sabi.flags(ctx, flags)
2153 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002154
Colin Cross4af21ed2019-11-04 09:37:55 -08002155 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002156
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002157 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002158 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002159 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002160 if ctx.Failed() {
2161 return
2162 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002163 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07002164 c.objFiles = objs.objFiles
2165 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08002166 }
2167
Colin Crossca860ac2016-01-04 14:34:37 -08002168 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002169 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002170 if ctx.Failed() {
2171 return
2172 }
Colin Cross635c3b02016-05-18 15:37:25 -07002173 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002174
Chris Parsons94a0bba2021-06-04 15:03:47 -04002175 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002176
Jose Galmes6f843bc2020-12-11 13:36:29 -08002177 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
2178 // RECOVERY_SNAPSHOT_VERSION is current.
2179 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04002180 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002181 i.collectHeadersForSnapshot(ctx)
2182 }
2183 }
Colin Crossce75d2c2016-10-06 16:12:58 -07002184 }
Colin Cross5049f022015-03-18 13:28:46 -07002185
Chris Parsons94a0bba2021-06-04 15:03:47 -04002186 c.maybeInstall(ctx, apexInfo)
2187}
2188
2189func (c *Module) maybeUnhideFromMake() {
2190 // If a lib is directly included in any of the APEXes or is not available to the
2191 // platform (which is often the case when the stub is provided as a prebuilt),
2192 // unhide the stubs variant having the latest version gets visible to make. In
2193 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2194 // force anything in the make world to link against the stubs library. (unless it
2195 // is explicitly referenced via .bootstrap suffix or the module is marked with
2196 // 'bootstrap: true').
2197 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
2198 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
2199 c.IsStubs() && !c.InVendorRamdisk() {
2200 c.Properties.HideFromMake = false // unhide
2201 // Note: this is still non-installable
2202 }
2203}
2204
Jingwen Chen3952a902022-12-12 12:20:58 +00002205// maybeInstall is called at the end of both GenerateAndroidBuildActions and
2206// ProcessBazelQueryResponse to run the install hooks for installable modules,
2207// like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002208func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002209 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002210 // If the module has been specifically configure to not be installed then
2211 // hide from make as otherwise it will break when running inside make
2212 // as the output path to install will not be specified. Not all uninstallable
2213 // modules can be hidden from make as some are needed for resolving make side
2214 // dependencies.
2215 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002216 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002217 c.SkipInstall()
2218 }
2219
2220 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2221 // to allow using the outputs in a genrule.
2222 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002223 c.installer.install(ctx, c.outputFile.Path())
2224 if ctx.Failed() {
2225 return
Colin Crossca860ac2016-01-04 14:34:37 -08002226 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002227 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002228}
2229
Sam Delmerico5fb794a2023-01-27 16:01:37 -05002230func (c *Module) setAndroidMkVariablesFromCquery(info cquery.CcAndroidMkInfo) {
2231 c.Properties.AndroidMkSharedLibs = info.LocalSharedLibs
2232 c.Properties.AndroidMkStaticLibs = info.LocalStaticLibs
2233 c.Properties.AndroidMkWholeStaticLibs = info.LocalWholeStaticLibs
2234}
2235
Colin Cross0ea8ba82019-06-06 14:33:29 -07002236func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002237 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002238 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002239 }
Colin Crossca860ac2016-01-04 14:34:37 -08002240 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002241}
2242
Colin Crossca860ac2016-01-04 14:34:37 -08002243func (c *Module) begin(ctx BaseModuleContext) {
2244 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002245 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002246 }
Colin Crossca860ac2016-01-04 14:34:37 -08002247 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002248 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002249 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002250 if c.stl != nil {
2251 c.stl.begin(ctx)
2252 }
Colin Cross16b23492016-01-06 14:41:07 -08002253 if c.sanitize != nil {
2254 c.sanitize.begin(ctx)
2255 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002256 if c.coverage != nil {
2257 c.coverage.begin(ctx)
2258 }
Stephen Craneba090d12017-05-09 15:44:35 -07002259 if c.lto != nil {
2260 c.lto.begin(ctx)
2261 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002262 if c.pgo != nil {
2263 c.pgo.begin(ctx)
2264 }
Dan Albert92fe7402020-07-15 13:33:30 -07002265 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002266 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002267 if err != nil {
2268 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002269 c.Properties.Sdk_version = nil
2270 } else {
2271 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002272 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002273 }
Colin Crossca860ac2016-01-04 14:34:37 -08002274}
2275
Colin Cross37047f12016-12-13 17:06:13 -08002276func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002277 deps := Deps{}
2278
2279 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002280 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002281 }
2282 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002283 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002284 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002285 if c.stl != nil {
2286 deps = c.stl.deps(ctx, deps)
2287 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002288 if c.coverage != nil {
2289 deps = c.coverage.deps(ctx, deps)
2290 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002291
Colin Crossb6715442017-10-24 11:13:31 -07002292 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2293 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2294 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2295 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2296 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2297 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002298 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002299
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002300 for _, lib := range deps.ReexportSharedLibHeaders {
2301 if !inList(lib, deps.SharedLibs) {
2302 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2303 }
2304 }
2305
2306 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002307 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2308 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 -07002309 }
2310 }
2311
Colin Cross5950f382016-12-13 12:50:57 -08002312 for _, lib := range deps.ReexportHeaderLibHeaders {
2313 if !inList(lib, deps.HeaderLibs) {
2314 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2315 }
2316 }
2317
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002318 for _, gen := range deps.ReexportGeneratedHeaders {
2319 if !inList(gen, deps.GeneratedHeaders) {
2320 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2321 }
2322 }
2323
Colin Crossc99deeb2016-04-11 15:06:20 -07002324 return deps
2325}
2326
Dan Albert7e9d2952016-08-04 13:02:36 -07002327func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002328 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002329 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002330 moduleContextImpl: moduleContextImpl{
2331 mod: c,
2332 },
2333 }
2334 ctx.ctx = ctx
2335
Vinh Tran44cb78c2023-03-09 22:07:19 -05002336 if !actx.Host() || !ctx.static() || ctx.staticBinary() {
2337 c.afdo.addDep(ctx, actx)
2338 }
2339
Colin Crossca860ac2016-01-04 14:34:37 -08002340 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002341}
2342
Jiyong Park7ed9de32018-10-15 22:25:07 +09002343// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002344func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002345 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2346 version := name[sharp+1:]
2347 libname := name[:sharp]
2348 return libname, version
2349 }
2350 return name, ""
2351}
2352
Dan Albert92fe7402020-07-15 13:33:30 -07002353func GetCrtVariations(ctx android.BottomUpMutatorContext,
2354 m LinkableInterface) []blueprint.Variation {
2355 if ctx.Os() != android.Android {
2356 return nil
2357 }
2358 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002359 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2360 minSdkVersion := m.MinSdkVersion()
2361 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2362 minSdkVersion = m.SdkVersion()
2363 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002364 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2365 if err != nil {
2366 ctx.PropertyErrorf("min_sdk_version", err.Error())
2367 }
Colin Cross363ec762023-01-13 13:45:14 -08002368
2369 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002370 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002371 if apiLevel.LessThan(minApiForArch) {
2372 apiLevel = minApiForArch
2373 }
2374
Dan Albert92fe7402020-07-15 13:33:30 -07002375 return []blueprint.Variation{
2376 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002377 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002378 }
2379 }
2380 return []blueprint.Variation{
2381 {Mutator: "sdk", Variation: ""},
2382 }
2383}
2384
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002385func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2386 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002387
2388 variations = append([]blueprint.Variation(nil), variations...)
2389
Liz Kammer23942242022-04-08 15:41:00 -04002390 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002391 // Version is explicitly specified. i.e. libFoo#30
2392 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002393 if tag, ok := depTag.(libraryDependencyTag); ok {
2394 tag.explicitlyVersioned = true
2395 } else {
2396 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2397 }
Colin Crosse7257d22020-09-24 09:56:18 -07002398 }
Colin Crosse7257d22020-09-24 09:56:18 -07002399
Colin Cross0de8a1e2020-09-18 14:15:30 -07002400 if far {
2401 ctx.AddFarVariationDependencies(variations, depTag, name)
2402 } else {
2403 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002404 }
2405}
2406
Kiyoung Kim487689e2022-07-26 09:48:22 +09002407func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2408 apiImportInfo := multitree.ApiImportInfo{}
2409
2410 if c.Device() {
2411 var apiImportModule []blueprint.Module
2412 if actx.OtherModuleExists("api_imports") {
2413 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2414 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
2415 apiInfo := actx.OtherModuleProvider(apiImportModule[0], multitree.ApiImportsProvider).(multitree.ApiImportInfo)
2416 apiImportInfo = apiInfo
2417 actx.SetProvider(multitree.ApiImportsProvider, apiInfo)
2418 }
2419 }
2420 }
2421
2422 return apiImportInfo
2423}
2424
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002425func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002426 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002427 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002428 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002429 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2430 // between the modules in the snapshot and the snapshot itself.
2431 var snapshotModule []blueprint.Module
2432 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2433 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2434 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2435 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2436 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002437 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002438 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2439 *snapshotInfo = &snapshot
2440 // republish the snapshot for use in later mutators on this module
2441 actx.SetProvider(SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002442 }
2443 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002444 if *snapshotInfo == nil {
2445 *snapshotInfo = &SnapshotInfo{}
2446 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002447 return **snapshotInfo
2448}
2449
Kiyoung Kim487689e2022-07-26 09:48:22 +09002450func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2451 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002452 return snapshot
2453 }
2454
2455 return lib
2456}
2457
2458// RewriteLibs takes a list of names of shared libraries and scans it for three types
2459// of names:
2460//
2461// 1. Name of an NDK library that refers to a prebuilt module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002462//
2463// For each of these, it adds the name of the prebuilt module (which will be in
2464// prebuilts/ndk) to the list of nonvariant libs.
2465//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002466// 2. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002467//
2468// For each of these, it adds the name of the ndk_library module to the list of
2469// variant libs.
2470//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002471// 3. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002472//
2473// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002474//
2475// The caller can then know to add the variantLibs dependencies differently from the
2476// nonvariantLibs
2477func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2478 variantLibs = []string{}
2479
2480 nonvariantLibs = []string{}
2481 for _, entry := range list {
2482 // strip #version suffix out
2483 name, _ := StubsLibNameAndVersion(entry)
2484 if c.InRecovery() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002485 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002486 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2487 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2488 } else if c.UseVndk() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002489 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002490 } else {
2491 // put name#version back
2492 nonvariantLibs = append(nonvariantLibs, entry)
2493 }
2494 }
2495 return nonvariantLibs, variantLibs
2496}
2497
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002498func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2499 nonVariantLibs := []string{}
2500 variantLibs := []string{}
2501
2502 for _, lib := range libs {
2503 replaceLibName := GetReplaceModuleName(lib, replaceList)
2504 if replaceLibName == lib {
2505 // Do not handle any libs which are not in API imports
2506 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2507 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2508 variantLibs = append(variantLibs, replaceLibName)
2509 } else {
2510 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2511 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002512 }
2513
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002514 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002515}
2516
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002517func (c *Module) shouldUseApiSurface() bool {
2518 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2519 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2520 // LLNDK Variant
2521 return true
2522 }
2523
2524 if c.Properties.IsSdkVariant {
2525 // NDK Variant
2526 return true
2527 }
2528
2529 if c.isImportedApiLibrary() {
2530 // API Library should depend on API headers
2531 return true
2532 }
2533 }
2534
2535 return false
2536}
2537
Colin Cross1e676be2016-10-12 14:38:15 -07002538func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002539 if !c.Enabled() {
2540 return
2541 }
2542
Colin Cross37047f12016-12-13 17:06:13 -08002543 ctx := &depsContext{
2544 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002545 moduleContextImpl: moduleContextImpl{
2546 mod: c,
2547 },
2548 }
2549 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002550
Colin Crossc99deeb2016-04-11 15:06:20 -07002551 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002552 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002553
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002554 apiNdkLibs := []string{}
2555 apiLateNdkLibs := []string{}
2556
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002557 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002558 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2559 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2560 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2561 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2562 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002563 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002564
Yo Chiang219968c2020-09-22 18:45:04 +08002565 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2566
Colin Crosse0edaf92021-01-11 17:31:17 -08002567 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002568
Dan Albert914449f2016-06-17 16:45:24 -07002569 variantNdkLibs := []string{}
2570 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002571 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002572 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2573 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2574 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002575
2576 for idx, lib := range deps.RuntimeLibs {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002577 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002578 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002579 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002580
Colin Cross32ec36c2016-12-15 07:39:51 -08002581 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002582 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002583 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002584 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002585 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002586
Kiyoung Kim51279d32022-08-24 14:10:46 +09002587 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002588 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002589 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2590 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002591 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002592
Spandan Das73bcafc2022-08-18 23:26:00 +00002593 if c.isNDKStubLibrary() {
2594 // ndk_headers do not have any variations
2595 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002596 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002597 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002598 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002599 } else {
2600 actx.AddVariationDependencies(nil, depTag, lib)
2601 }
2602 }
2603
Dan Albertf1d14c72020-07-30 14:32:55 -07002604 if c.isNDKStubLibrary() {
2605 // NDK stubs depend on their implementation because the ABI dumps are
2606 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002607
Spandan Das8b08aea2023-03-14 19:29:34 +00002608 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2609 c.ImageVariation(),
2610 blueprint.Variation{Mutator: "link", Variation: "shared"},
2611 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002612 }
2613
Jiyong Park5d1598f2019-02-25 22:14:17 +09002614 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002615 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002616
Kiyoung Kim487689e2022-07-26 09:48:22 +09002617 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002618
Jiyong Park5d1598f2019-02-25 22:14:17 +09002619 actx.AddVariationDependencies([]blueprint.Variation{
2620 {Mutator: "link", Variation: "static"},
2621 }, depTag, lib)
2622 }
2623
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002624 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002625 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002626 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002627 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002628 }
Jiyong Parke3867542020-12-03 17:28:25 +09002629 if inList(lib, deps.ExcludeLibsForApex) {
2630 depTag.excludeInApex = true
2631 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002632
Kiyoung Kim487689e2022-07-26 09:48:22 +09002633 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002634
Dan Willemsen59339a22018-07-22 21:18:45 -07002635 actx.AddVariationDependencies([]blueprint.Variation{
2636 {Mutator: "link", Variation: "static"},
2637 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002638 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002639
Jooyung Han75568392020-03-20 04:29:24 +09002640 // staticUnwinderDep is treated as staticDep for Q apexes
2641 // so that native libraries/binaries are linked with static unwinder
2642 // because Q libc doesn't have unwinder APIs
2643 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002644 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002645 actx.AddVariationDependencies([]blueprint.Variation{
2646 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002647 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002648 }
2649
Jiyong Park7ed9de32018-10-15 22:25:07 +09002650 // shared lib names without the #version suffix
2651 var sharedLibNames []string
2652
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002653 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002654 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002655 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002656 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002657 }
Jiyong Parke3867542020-12-03 17:28:25 +09002658 if inList(lib, deps.ExcludeLibsForApex) {
2659 depTag.excludeInApex = true
2660 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002661
Jiyong Park73c54ee2019-10-22 20:31:18 +09002662 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002663 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2664 name = apiLibraryName
2665 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002666 sharedLibNames = append(sharedLibNames, name)
2667
Colin Crosse7257d22020-09-24 09:56:18 -07002668 variations := []blueprint.Variation{
2669 {Mutator: "link", Variation: "shared"},
2670 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002671
2672 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2673 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2674 }
2675
2676 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2677 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2678 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002679 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002680
Colin Crossfe9acfe2021-06-14 16:13:03 -07002681 for _, lib := range deps.LateStaticLibs {
2682 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2683 actx.AddVariationDependencies([]blueprint.Variation{
2684 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002685 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Crossfe9acfe2021-06-14 16:13:03 -07002686 }
2687
Colin Cross3e5e7782022-06-17 22:17:05 +00002688 for _, lib := range deps.UnexportedStaticLibs {
2689 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2690 actx.AddVariationDependencies([]blueprint.Variation{
2691 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002692 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Cross3e5e7782022-06-17 22:17:05 +00002693 }
2694
Jiyong Park7ed9de32018-10-15 22:25:07 +09002695 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002696 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002697 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2698 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2699 // linking against both the stubs lib and the non-stubs lib at the same time.
2700 continue
2701 }
Colin Cross6e511a92020-07-27 21:26:48 -07002702 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002703 variations := []blueprint.Variation{
2704 {Mutator: "link", Variation: "shared"},
2705 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002706 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002707 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002708
Dan Willemsen59339a22018-07-22 21:18:45 -07002709 actx.AddVariationDependencies([]blueprint.Variation{
2710 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002711 }, dataLibDepTag, deps.DataLibs...)
2712
Colin Crossc8caa062021-09-24 16:50:14 -07002713 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2714
Chris Parsons79d66a52020-06-05 17:26:16 -04002715 actx.AddVariationDependencies([]blueprint.Variation{
2716 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002717 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002718
Colin Cross68861832016-07-08 10:41:41 -07002719 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002720
2721 for _, gen := range deps.GeneratedHeaders {
2722 depTag := genHeaderDepTag
2723 if inList(gen, deps.ReexportGeneratedHeaders) {
2724 depTag = genHeaderExportDepTag
2725 }
2726 actx.AddDependency(c, depTag, gen)
2727 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002728
Dan Albert92fe7402020-07-15 13:33:30 -07002729 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002730 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002731 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002732 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002733 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002734 }
Colin Crossc465efd2021-06-11 18:00:04 -07002735 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002736 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002737 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002738 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002739 if deps.DynamicLinker != "" {
2740 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002741 }
Dan Albert914449f2016-06-17 16:45:24 -07002742
2743 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002744
2745 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002746 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002747 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002748 {Mutator: "link", Variation: "shared"},
2749 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002750 actx.AddVariationDependencies([]blueprint.Variation{
2751 {Mutator: "version", Variation: version},
2752 {Mutator: "link", Variation: "shared"},
2753 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002754
2755 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002756 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002757 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002758 {Mutator: "link", Variation: "shared"},
2759 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002760 actx.AddVariationDependencies([]blueprint.Variation{
2761 {Mutator: "version", Variation: version},
2762 {Mutator: "link", Variation: "shared"},
2763 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002764
2765 if vndkdep := c.vndkdep; vndkdep != nil {
2766 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002767 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002768 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002769 {Mutator: "link", Variation: "shared"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002770 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002771 }
2772 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002773
Vinh Tran367d89d2023-04-28 11:21:25 -04002774 if len(deps.AidlLibs) > 0 {
2775 actx.AddDependency(
2776 c,
2777 aidlLibraryTag,
2778 deps.AidlLibs...,
2779 )
2780 }
2781
Kiyoung Kimee58c932022-10-25 22:59:41 +09002782 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002783}
Colin Cross21b9a242015-03-24 14:15:58 -07002784
Colin Crosse40b4ea2018-10-02 22:25:58 -07002785func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002786 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2787 c.beginMutator(ctx)
2788 }
2789}
2790
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002791// Whether a module can link to another module, taking into
2792// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002793func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002794 tag blueprint.DependencyTag) {
2795
2796 switch t := tag.(type) {
2797 case dependencyTag:
2798 if t != vndkExtDepTag {
2799 return
2800 }
2801 case libraryDependencyTag:
2802 default:
2803 return
2804 }
2805
Ivan Lozanof9e21722020-12-02 09:00:51 -05002806 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002807 // Host code is not restricted
2808 return
2809 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002810
2811 // VNDK is cc.Module supported only for now.
2812 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002813 // Though allowed dependency is limited by the image mutator,
2814 // each vendor and product module needs to check link-type
2815 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002816 if ccTo, ok := to.(*Module); ok {
2817 if ccFrom.vndkdep != nil {
2818 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2819 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002820 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002821 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002822 }
2823 return
2824 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002825 // TODO(b/244244438) : Remove this once all variants are implemented
2826 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2827 return
2828 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002829 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002830 // Platform code can link to anything
2831 return
2832 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002833 if from.InRamdisk() {
2834 // Ramdisk code is not NDK
2835 return
2836 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002837 if from.InVendorRamdisk() {
2838 // Vendor ramdisk code is not NDK
2839 return
2840 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002841 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002842 // Recovery code is not NDK
2843 return
2844 }
Colin Cross31076b32020-10-23 17:22:06 -07002845 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002846 if c.NdkPrebuiltStl() {
2847 // These are allowed, but they don't set sdk_version
2848 return
2849 }
2850 if c.StubDecorator() {
2851 // These aren't real libraries, but are the stub shared libraries that are included in
2852 // the NDK.
2853 return
2854 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002855 if c.isImportedApiLibrary() {
2856 // Imported library from the API surface is a stub library built against interface definition.
2857 return
2858 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002859 }
Logan Chien834b9a62019-01-14 15:39:03 +08002860
Ivan Lozano52767be2019-10-18 14:49:46 -07002861 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002862 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2863 // to link to libc++ (non-NDK and without sdk_version).
2864 return
2865 }
2866
Ivan Lozano52767be2019-10-18 14:49:46 -07002867 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002868 // NDK code linking to platform code is never okay.
2869 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002870 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002871 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002872 }
2873
2874 // At this point we know we have two NDK libraries, but we need to
2875 // check that we're not linking against anything built against a higher
2876 // API level, as it is only valid to link against older or equivalent
2877 // APIs.
2878
Inseob Kim01a28722018-04-11 09:48:45 +09002879 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002880 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002881 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002882 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002883 // Current can't be linked against by anything else.
2884 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002885 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002886 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002887 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002888 if err != nil {
2889 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002890 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002891 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002892 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002893 toApi, err := strconv.Atoi(to.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 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002898 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002899
Inseob Kim01a28722018-04-11 09:48:45 +09002900 if toApi > fromApi {
2901 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002902 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002903 }
2904 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002905 }
Dan Albert202fe492017-12-15 13:56:59 -08002906
2907 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002908 fromStl := from.SelectedStl()
2909 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002910 if fromStl == "" || toStl == "" {
2911 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002912 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002913 // We can be permissive with the system "STL" since it is only the C++
2914 // ABI layer, but in the future we should make sure that everyone is
2915 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002916 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002917 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002918 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2919 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002920 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002921}
2922
Jooyung Han479ca172020-10-19 18:51:07 +09002923func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2924 if c, ok := ctx.Module().(*Module); ok {
2925 ctx.VisitDirectDeps(func(dep android.Module) {
2926 depTag := ctx.OtherModuleDependencyTag(dep)
2927 ccDep, ok := dep.(LinkableInterface)
2928 if ok {
2929 checkLinkType(ctx, c, ccDep, depTag)
2930 }
2931 })
2932 }
2933}
2934
Jiyong Park5fb8c102018-04-09 12:03:06 +09002935// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002936// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2937// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002938// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002939func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2940 check := func(child, parent android.Module) bool {
2941 to, ok := child.(*Module)
2942 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002943 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002944 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002945
Jooyung Hana70f0672019-01-18 15:20:43 +09002946 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2947 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002948 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002949
Jiyong Park0474e1f2021-01-14 14:26:06 +09002950 // These dependencies are not excercised at runtime. Tracking these will give us
2951 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002952 depTag := ctx.OtherModuleDependencyTag(child)
2953 if IsHeaderDepTag(depTag) {
2954 return false
2955 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002956 if depTag == staticVariantTag {
2957 return false
2958 }
2959 if depTag == stubImplDepTag {
2960 return false
2961 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002962
Justin Yun63e9ec72020-10-29 16:49:43 +09002963 // Even if target lib has no vendor variant, keep checking dependency
2964 // graph in case it depends on vendor_available or product_available
2965 // but not double_loadable transtively.
2966 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002967 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002968 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002969
Jiyong Park0474e1f2021-01-14 14:26:06 +09002970 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2971 // one.
2972 if Bool(to.VendorProperties.Double_loadable) {
2973 return true
2974 }
2975
Ivan Lozanod7586b62021-04-01 09:49:36 -04002976 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002977 return false
2978 }
2979
Jooyung Hana70f0672019-01-18 15:20:43 +09002980 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2981 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002982 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002983 return false
2984 }
2985 if module, ok := ctx.Module().(*Module); ok {
2986 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002987 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002988 ctx.WalkDeps(check)
2989 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002990 }
2991 }
2992}
2993
Yu Liue4312402023-01-18 09:15:31 -08002994func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
2995 // For the dependency from platform to apex, use the latest stubs
2996 apexSdkVersion := android.FutureApiLevel
2997 if !apexInfo.IsForPlatform() {
2998 apexSdkVersion = apexInfo.MinSdkVersion
2999 }
3000
3001 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3002 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3003 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3004 // (b/144430859)
3005 apexSdkVersion = android.FutureApiLevel
3006 }
3007
3008 return apexSdkVersion
3009}
3010
Colin Crossc99deeb2016-04-11 15:06:20 -07003011// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003012func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003013 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003014
Colin Cross0de8a1e2020-09-18 14:15:30 -07003015 var directStaticDeps []StaticLibraryInfo
3016 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003017
Colin Cross0de8a1e2020-09-18 14:15:30 -07003018 reexportExporter := func(exporter FlagExporterInfo) {
3019 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3020 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3021 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3022 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3023 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003024 }
3025
Colin Cross56a83212020-09-15 18:30:11 -07003026 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
Yu Liue4312402023-01-18 09:15:31 -08003027 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003028
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003029 skipModuleList := map[string]bool{}
3030
3031 var apiImportInfo multitree.ApiImportInfo
3032 hasApiImportInfo := false
3033
3034 ctx.VisitDirectDeps(func(dep android.Module) {
3035 if dep.Name() == "api_imports" {
3036 apiImportInfo = ctx.OtherModuleProvider(dep, multitree.ApiImportsProvider).(multitree.ApiImportInfo)
3037 hasApiImportInfo = true
3038 }
3039 })
3040
3041 if hasApiImportInfo {
3042 targetStubModuleList := map[string]string{}
3043 targetOrigModuleList := map[string]string{}
3044
3045 // Search for dependency which both original module and API imported library with APEX stub exists
3046 ctx.VisitDirectDeps(func(dep android.Module) {
3047 depName := ctx.OtherModuleName(dep)
3048 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
3049 targetStubModuleList[apiLibrary] = depName
3050 }
3051 })
3052 ctx.VisitDirectDeps(func(dep android.Module) {
3053 depName := ctx.OtherModuleName(dep)
3054 if origLibrary, ok := targetStubModuleList[depName]; ok {
3055 targetOrigModuleList[origLibrary] = depName
3056 }
3057 })
3058
3059 // Decide which library should be used between original and API imported library
3060 ctx.VisitDirectDeps(func(dep android.Module) {
3061 depName := ctx.OtherModuleName(dep)
3062 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003063 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003064 skipModuleList[depName] = true
3065 } else {
3066 skipModuleList[apiLibrary] = true
3067 }
3068 }
3069 })
3070 }
3071
Colin Crossd11fcda2017-10-23 17:59:01 -07003072 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003073 depName := ctx.OtherModuleName(dep)
3074 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003075
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003076 if _, ok := skipModuleList[depName]; ok {
3077 // skip this module because original module or API imported module matching with this should be used instead.
3078 return
3079 }
3080
Dan Willemsen47450072021-10-19 20:24:49 -07003081 if depTag == android.DarwinUniversalVariantTag {
3082 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3083 return
3084 }
3085
Vinh Tran367d89d2023-04-28 11:21:25 -04003086 if depTag == aidlLibraryTag {
3087 if ctx.OtherModuleHasProvider(dep, aidl_library.AidlLibraryProvider) {
3088 depPaths.AidlLibraryInfos = append(
3089 depPaths.AidlLibraryInfos,
3090 ctx.OtherModuleProvider(
3091 dep,
3092 aidl_library.AidlLibraryProvider).(aidl_library.AidlLibraryInfo),
3093 )
3094 }
3095 }
3096
Ivan Lozano52767be2019-10-18 14:49:46 -07003097 ccDep, ok := dep.(LinkableInterface)
3098 if !ok {
3099
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003100 // handling for a few module types that aren't cc Module but that are also supported
3101 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003102 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003103 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003104 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3105 genRule.GeneratedSourceFiles()...)
3106 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003107 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003108 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003109 // Support exported headers from a generated_sources dependency
3110 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003111 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003112 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003113 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003114 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003115 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003116 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003117 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003118 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003119 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3120 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003121 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003122 // 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 +09003123 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003124
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003125 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003126 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003127 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003128 }
Colin Crosscef792e2021-06-11 18:01:26 -07003129 case CrtBeginDepTag:
3130 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3131 case CrtEndDepTag:
3132 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003133 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003134 return
3135 }
3136
Colin Crossfe17f6f2019-03-28 19:30:56 -07003137 if depTag == android.ProtoPluginDepTag {
3138 return
3139 }
3140
Colin Crossd11fcda2017-10-23 17:59:01 -07003141 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003142 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3143 return
3144 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003145 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003146 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3147 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003148 return
3149 }
3150
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003151 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003152 // Skip reused objects for stub libraries, they use their own stub object file instead.
3153 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3154 // version mutator, so the stubs variant is created from the shared variant that
3155 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003156 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07003157 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3158 objs := staticAnalogue.ReuseObjects
3159 depPaths.Objs = depPaths.Objs.Append(objs)
3160 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3161 reexportExporter(depExporterInfo)
3162 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003163 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003164 }
3165
Colin Cross6e511a92020-07-27 21:26:48 -07003166 linkFile := ccDep.OutputFile()
3167
3168 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3169 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003170 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003171 return
3172 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003173
Jiyong Parke3867542020-12-03 17:28:25 +09003174 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3175 return
3176 }
3177
Colin Cross0de8a1e2020-09-18 14:15:30 -07003178 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07003179
Colin Cross6e511a92020-07-27 21:26:48 -07003180 var ptr *android.Paths
3181 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003182
Colin Cross6e511a92020-07-27 21:26:48 -07003183 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003184
Colin Cross6e511a92020-07-27 21:26:48 -07003185 switch {
3186 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08003187 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
3188 if !ctx.Config().AllowMissingDependencies() {
3189 ctx.ModuleErrorf("module %q is not a header library", depName)
3190 } else {
3191 ctx.AddMissingDependencies([]string{depName})
3192 }
3193 return
3194 }
Colin Cross6e511a92020-07-27 21:26:48 -07003195 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003196 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
3197 if !ctx.Config().AllowMissingDependencies() {
3198 ctx.ModuleErrorf("module %q is not a shared library", depName)
3199 } else {
3200 ctx.AddMissingDependencies([]string{depName})
3201 }
3202 return
3203 }
Jiyong Parke3867542020-12-03 17:28:25 +09003204
Jiyong Park7d55b612021-06-11 17:22:09 +09003205 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3206 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003207
Jiyong Park1ad8e162020-12-01 23:40:09 +09003208 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3209 // linkFile, depFile, and ptr.
3210 if c.IsStubs() {
3211 break
3212 }
3213
Colin Cross0de8a1e2020-09-18 14:15:30 -07003214 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3215 depFile = sharedLibraryInfo.TableOfContents
3216
Colin Cross6e511a92020-07-27 21:26:48 -07003217 ptr = &depPaths.SharedLibs
3218 switch libDepTag.Order {
3219 case earlyLibraryDependency:
3220 ptr = &depPaths.EarlySharedLibs
3221 depPtr = &depPaths.EarlySharedLibsDeps
3222 case normalLibraryDependency:
3223 ptr = &depPaths.SharedLibs
3224 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003225 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003226 case lateLibraryDependency:
3227 ptr = &depPaths.LateSharedLibs
3228 depPtr = &depPaths.LateSharedLibsDeps
3229 default:
3230 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003231 }
Colin Cross6e511a92020-07-27 21:26:48 -07003232 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003233 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
3234 if !ctx.Config().AllowMissingDependencies() {
3235 ctx.ModuleErrorf("module %q is not a static library", depName)
3236 } else {
3237 ctx.AddMissingDependencies([]string{depName})
3238 }
3239 return
3240 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003241
3242 // Stubs lib doesn't link to the static lib dependencies. Don't set
3243 // linkFile, depFile, and ptr.
3244 if c.IsStubs() {
3245 break
3246 }
3247
Colin Cross0de8a1e2020-09-18 14:15:30 -07003248 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3249 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003250 if libDepTag.wholeStatic {
3251 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003252 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3253 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003254 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003255 // This case normally catches prebuilt static
3256 // libraries, but it can also occur when
3257 // AllowMissingDependencies is on and the
3258 // dependencies has no sources of its own
3259 // but has a whole_static_libs dependency
3260 // on a missing library. We want to depend
3261 // on the .a file so that there is something
3262 // in the dependency tree that contains the
3263 // error rule for the missing transitive
3264 // dependency.
3265 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003266 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003267 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3268 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003269 } else {
3270 switch libDepTag.Order {
3271 case earlyLibraryDependency:
3272 panic(fmt.Errorf("early static libs not suppported"))
3273 case normalLibraryDependency:
3274 // static dependencies will be handled separately so they can be ordered
3275 // using transitive dependencies.
3276 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003277 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003278 case lateLibraryDependency:
3279 ptr = &depPaths.LateStaticLibs
3280 default:
3281 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003282 }
3283 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003284 if libDepTag.unexportedSymbols {
3285 depPaths.LdFlags = append(depPaths.LdFlags,
3286 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3287 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003288 }
3289
Colin Cross6e511a92020-07-27 21:26:48 -07003290 if libDepTag.static() && !libDepTag.wholeStatic {
3291 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3292 ctx.ModuleErrorf("module %q not a static library", depName)
3293 return
3294 }
Logan Chien43d34c32017-12-20 01:17:32 +08003295
Colin Cross6e511a92020-07-27 21:26:48 -07003296 // When combining coverage files for shared libraries and executables, coverage files
3297 // in static libraries act as if they were whole static libraries. The same goes for
3298 // source based Abi dump files.
3299 if c, ok := ccDep.(*Module); ok {
3300 staticLib := c.linker.(libraryInterface)
3301 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3302 staticLib.objs().coverageFiles...)
3303 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3304 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003305 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003306 // Handle non-CC modules here
3307 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003308 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003309 }
3310 }
3311
Colin Cross6e511a92020-07-27 21:26:48 -07003312 if ptr != nil {
3313 if !linkFile.Valid() {
3314 if !ctx.Config().AllowMissingDependencies() {
3315 ctx.ModuleErrorf("module %q missing output file", depName)
3316 } else {
3317 ctx.AddMissingDependencies([]string{depName})
3318 }
3319 return
3320 }
3321 *ptr = append(*ptr, linkFile.Path())
3322 }
3323
3324 if depPtr != nil {
3325 dep := depFile
3326 if !dep.Valid() {
3327 dep = linkFile
3328 }
3329 *depPtr = append(*depPtr, dep.Path())
3330 }
3331
Colin Cross0de8a1e2020-09-18 14:15:30 -07003332 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3333 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3334 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3335 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3336
3337 if libDepTag.reexportFlags {
3338 reexportExporter(depExporterInfo)
3339 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3340 // Re-exported shared library headers must be included as well since they can help us with type information
3341 // about template instantiations (instantiated from their headers).
3342 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
3343 // scripts.
3344 c.sabi.Properties.ReexportedIncludes = append(
3345 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3346 }
3347
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003348 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003349 switch {
3350 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003351 c.Properties.AndroidMkHeaderLibs = append(
3352 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003353 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003354 if lib := moduleLibraryInterface(dep); lib != nil {
3355 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003356 // Add the dependency to the APEX(es) providing the library so that
3357 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07003358 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09003359 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003360 c.Properties.ApexesProvidingSharedLibs = append(
3361 c.Properties.ApexesProvidingSharedLibs, an)
3362 }
3363 }
3364 }
3365
3366 // Note: the order of libs in this list is not important because
3367 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003368 c.Properties.AndroidMkSharedLibs = append(
3369 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003370 // Record BaseLibName for snapshots.
3371 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003372 case libDepTag.static():
3373 if libDepTag.wholeStatic {
3374 c.Properties.AndroidMkWholeStaticLibs = append(
3375 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3376 } else {
3377 c.Properties.AndroidMkStaticLibs = append(
3378 c.Properties.AndroidMkStaticLibs, makeLibName)
3379 }
Justin Yun5e035862021-06-29 20:50:37 +09003380 // Record BaseLibName for snapshots.
3381 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003382 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003383 } else if !c.IsStubs() {
3384 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3385
Colin Cross6e511a92020-07-27 21:26:48 -07003386 switch depTag {
3387 case runtimeDepTag:
3388 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003389 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003390 // Record BaseLibName for snapshots.
3391 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003392 case objDepTag:
3393 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3394 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003395 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003396 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003397 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003398 case dynamicLinkerDepTag:
3399 depPaths.DynamicLinker = linkFile
3400 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003401 }
Colin Crossca860ac2016-01-04 14:34:37 -08003402 })
3403
Jeff Gaston294356f2017-09-27 17:05:30 -07003404 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003405 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3406 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3407 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003408
Colin Crossdd84e052017-05-17 13:44:16 -07003409 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003410 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003411 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3412 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003413 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003414 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3415 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003416 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003417 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003418 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003419
3420 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003421 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003422 }
Colin Crossdd84e052017-05-17 13:44:16 -07003423
Colin Crossca860ac2016-01-04 14:34:37 -08003424 return depPaths
3425}
3426
Spandan Das604f3762023-03-16 22:51:40 +00003427func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003428 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003429 thisModule, ok := ctx.Module().(android.ApexModule)
3430 if !ok {
3431 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3432 }
3433
3434 useVndk := false
3435 bootstrap := false
3436 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3437 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3438 } else {
3439 useVndk = linkable.UseVndk()
3440 bootstrap = linkable.Bootstrap()
3441 }
3442
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003443 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
3444
3445 useStubs := false
3446
3447 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3448 if !apexInfo.IsForPlatform() {
3449 // For platform libraries, use current version of LLNDK
3450 // If this is for use_vendor apex we will apply the same rules
3451 // of apex sdk enforcement below to choose right version.
3452 useStubs = true
3453 }
3454 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3455 // If not building for APEX or the containing APEX allows the use of
3456 // platform APIs, use stubs only when it is from an APEX (and not from
3457 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3458 // bootstrap modules, always link to non-stub variant
3459 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3460
3461 isApexImportedApiLibrary := false
3462
3463 if cc, ok := dep.(*Module); ok {
3464 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3465 if apiLibrary.hasApexStubs() {
3466 isApexImportedApiLibrary = true
3467 }
3468 }
3469 }
3470
3471 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3472
3473 if useStubs {
3474 // Another exception: if this module is a test for an APEX, then
3475 // it is linked with the non-stub variant of a module in the APEX
3476 // as if this is part of the APEX.
3477 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
3478 for _, apexContents := range testFor.ApexContents {
3479 if apexContents.DirectlyInApex(depName) {
3480 useStubs = false
3481 break
3482 }
3483 }
3484 }
3485 if useStubs {
3486 // Yet another exception: If this module and the dependency are
3487 // available to the same APEXes then skip stubs between their
3488 // platform variants. This complements the test_for case above,
3489 // which avoids the stubs on a direct APEX library dependency, by
3490 // avoiding stubs for indirect test dependencies as well.
3491 //
3492 // TODO(b/183882457): This doesn't work if the two libraries have
3493 // only partially overlapping apex_available. For that test_for
3494 // modules would need to be split into APEX variants and resolved
3495 // separately for each APEX they have access to.
3496 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3497 useStubs = false
3498 }
3499 }
3500 } else {
3501 // If building for APEX, use stubs when the parent is in any APEX that
3502 // the child is not in.
3503 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3504 }
3505
3506 return useStubs
3507}
3508
3509// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3510// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3511// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3512// has different level of updatability. For example, if a library foo in an APEX depends on a
3513// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3514// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3515// same APEX as foo, the non-stub variant of bar is used.
3516func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3517 depTag := ctx.OtherModuleDependencyTag(dep)
3518 libDepTag, ok := depTag.(libraryDependencyTag)
3519 if !ok || !libDepTag.shared() {
3520 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3521 }
3522
Jiyong Park7d55b612021-06-11 17:22:09 +09003523 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
3524 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3525 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Jiyong Park7d55b612021-06-11 17:22:09 +09003526
3527 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003528 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003529 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003530 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3531 toUse := stubs[len(stubs)-1]
3532 sharedLibraryInfo = toUse.SharedLibraryInfo
3533 depExporterInfo = toUse.FlagExporterInfo
3534 }
3535 }
3536 return sharedLibraryInfo, depExporterInfo
3537}
3538
Colin Cross0de8a1e2020-09-18 14:15:30 -07003539// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3540// to match the topological order of the dependency tree, including any static analogues of
3541// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3542// of the transitive dependencies.
3543func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
3544 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
3545 var staticPaths android.Paths
3546 for _, staticDep := range staticDeps {
3547 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3548 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3549 }
3550 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003551 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3552 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003553 }
3554 }
3555 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3556
3557 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3558
3559 // reorder the dependencies based on transitive dependencies
3560 staticPaths = android.FirstUniquePaths(staticPaths)
3561 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3562
3563 if len(orderedStaticPaths) != len(staticPaths) {
3564 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3565 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3566 }
3567
3568 return orderedStaticPaths, transitiveStaticLibs
3569}
3570
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003571// BaseLibName trims known prefixes and suffixes
3572func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003573 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3574 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003575 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003576 return libName
3577}
3578
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003579func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003580 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003581 ccDepModule, _ := ccDep.(*Module)
3582 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003583 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003584
Justin Yuncbca3732021-02-03 19:24:13 +09003585 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003586 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003587 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003588 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003589
Ivan Lozanod1dec542021-05-26 15:33:11 -04003590 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003591 }
3592 }
3593
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003594 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3595 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003596 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3597 // core module instead.
3598 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003599 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003600 // The vendor and product modules in Make will have been renamed to not conflict with the
3601 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003602 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003603 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003604 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003605 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003606 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003607 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003608 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003609 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003610 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003611 } else {
3612 return libName
3613 }
3614}
3615
Colin Crossca860ac2016-01-04 14:34:37 -08003616func (c *Module) InstallInData() bool {
3617 if c.installer == nil {
3618 return false
3619 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003620 return c.installer.inData()
3621}
3622
3623func (c *Module) InstallInSanitizerDir() bool {
3624 if c.installer == nil {
3625 return false
3626 }
3627 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003628 return true
3629 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003630 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003631}
3632
Yifan Hong1b3348d2020-01-21 15:53:22 -08003633func (c *Module) InstallInRamdisk() bool {
3634 return c.InRamdisk()
3635}
3636
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003637func (c *Module) InstallInVendorRamdisk() bool {
3638 return c.InVendorRamdisk()
3639}
3640
Jiyong Parkf9332f12018-02-01 00:54:12 +09003641func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003642 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003643}
3644
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003645func (c *Module) MakeUninstallable() {
3646 if c.installer == nil {
3647 c.ModuleBase.MakeUninstallable()
3648 return
3649 }
3650 c.installer.makeUninstallable(c)
3651}
3652
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003653func (c *Module) HostToolPath() android.OptionalPath {
3654 if c.installer == nil {
3655 return android.OptionalPath{}
3656 }
3657 return c.installer.hostToolPath()
3658}
3659
Nan Zhangd4e641b2017-07-12 12:55:28 -07003660func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3661 return c.outputFile
3662}
3663
Colin Cross41955e82019-05-29 14:40:35 -07003664func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3665 switch tag {
3666 case "":
3667 if c.outputFile.Valid() {
3668 return android.Paths{c.outputFile.Path()}, nil
3669 }
3670 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003671 case "unstripped":
3672 if c.linker != nil {
3673 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3674 }
3675 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003676 default:
3677 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003678 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003679}
3680
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003681func (c *Module) static() bool {
3682 if static, ok := c.linker.(interface {
3683 static() bool
3684 }); ok {
3685 return static.static()
3686 }
3687 return false
3688}
3689
Jiyong Park379de2f2018-12-19 02:47:14 +09003690func (c *Module) staticBinary() bool {
3691 if static, ok := c.linker.(interface {
3692 staticBinary() bool
3693 }); ok {
3694 return static.staticBinary()
3695 }
3696 return false
3697}
3698
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003699func (c *Module) testBinary() bool {
3700 if test, ok := c.linker.(interface {
3701 testBinary() bool
3702 }); ok {
3703 return test.testBinary()
3704 }
3705 return false
3706}
3707
Jingwen Chen537242c2022-08-24 11:53:27 +00003708func (c *Module) testLibrary() bool {
3709 if test, ok := c.linker.(interface {
3710 testLibrary() bool
3711 }); ok {
3712 return test.testLibrary()
3713 }
3714 return false
3715}
3716
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003717func (c *Module) benchmarkBinary() bool {
3718 if b, ok := c.linker.(interface {
3719 benchmarkBinary() bool
3720 }); ok {
3721 return b.benchmarkBinary()
3722 }
3723 return false
3724}
3725
3726func (c *Module) fuzzBinary() bool {
3727 if f, ok := c.linker.(interface {
3728 fuzzBinary() bool
3729 }); ok {
3730 return f.fuzzBinary()
3731 }
3732 return false
3733}
3734
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003735// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3736func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003737 if h, ok := c.linker.(interface {
3738 header() bool
3739 }); ok {
3740 return h.header()
3741 }
3742 return false
3743}
3744
Ivan Lozanod7586b62021-04-01 09:49:36 -04003745func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003746 if b, ok := c.linker.(interface {
3747 binary() bool
3748 }); ok {
3749 return b.binary()
3750 }
3751 return false
3752}
3753
Justin Yun5e035862021-06-29 20:50:37 +09003754func (c *Module) StaticExecutable() bool {
3755 if b, ok := c.linker.(*binaryDecorator); ok {
3756 return b.static()
3757 }
3758 return false
3759}
3760
Ivan Lozanod7586b62021-04-01 09:49:36 -04003761func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003762 if o, ok := c.linker.(interface {
3763 object() bool
3764 }); ok {
3765 return o.object()
3766 }
3767 return false
3768}
3769
Ivan Lozanof9e21722020-12-02 09:00:51 -05003770func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003771 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003772 if c.IsLlndk() {
3773 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003774 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003775 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003776 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003777 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003778 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003779 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003780 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003781 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003782 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003783 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003784 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003785 return "native:product"
3786 }
Jooyung Han38002912019-05-16 04:01:54 +09003787 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003788 } else if c.InRamdisk() {
3789 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003790 } else if c.InVendorRamdisk() {
3791 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003792 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003793 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003794 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003795 return "native:ndk:none:none"
3796 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3797 //family, link := getNdkStlFamilyAndLinkType(c)
3798 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003799 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003800 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003801 } else {
3802 return "native:platform"
3803 }
3804}
3805
Jiyong Park9d452992018-10-03 00:38:19 +09003806// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003807// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003808func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003809 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003810 // Stub libs and prebuilt libs in a versioned SDK are not
3811 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003812 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003813 } else if _, ok := c.linker.(testPerSrc); ok {
3814 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003815 }
3816 return false
3817}
3818
Jiyong Parka90ca002019-10-07 15:47:24 +09003819func (c *Module) AvailableFor(what string) bool {
3820 if linker, ok := c.linker.(interface {
3821 availableFor(string) bool
3822 }); ok {
3823 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3824 } else {
3825 return c.ApexModuleBase.AvailableFor(what)
3826 }
3827}
3828
Jiyong Park62304bb2020-04-13 16:19:48 +09003829func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003830 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003831}
3832
Paul Duffin0cb37b92020-03-04 14:52:46 +00003833func (c *Module) EverInstallable() bool {
3834 return c.installer != nil &&
3835 // Check to see whether the module is actually ever installable.
3836 c.installer.everInstallable()
3837}
3838
Ivan Lozanod7586b62021-04-01 09:49:36 -04003839func (c *Module) PreventInstall() bool {
3840 return c.Properties.PreventInstall
3841}
3842
3843func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003844 if c.library != nil {
3845 if i := c.library.installable(); i != nil {
3846 return i
3847 }
3848 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003849 return c.Properties.Installable
3850}
3851
3852func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003853 ret := c.EverInstallable() &&
3854 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003855 proptools.BoolDefault(c.Installable(), true) &&
3856 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003857
3858 // The platform variant doesn't need further condition. Apex variants however might not
3859 // be installable because it will likely to be included in the APEX and won't appear
3860 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003861 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003862 return ret
3863 }
3864
3865 // Special case for modules that are configured to be installed to /data, which includes
3866 // test modules. For these modules, both APEX and non-APEX variants are considered as
3867 // installable. This is because even the APEX variants won't be included in the APEX, but
3868 // will anyway be installed to /data/*.
3869 // See b/146995717
3870 if c.InstallInData() {
3871 return ret
3872 }
3873
3874 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003875}
3876
Logan Chien41eabe62019-04-10 13:33:58 +08003877func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3878 if c.linker != nil {
3879 if library, ok := c.linker.(*libraryDecorator); ok {
3880 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3881 }
3882 }
3883}
3884
Jiyong Park45bf82e2020-12-15 22:29:02 +09003885var _ android.ApexModule = (*Module)(nil)
3886
3887// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003888func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003889 depTag := ctx.OtherModuleDependencyTag(dep)
3890 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3891
3892 if cc, ok := dep.(*Module); ok {
3893 if cc.HasStubsVariants() {
3894 if isLibDepTag && libDepTag.shared() {
3895 // dynamic dep to a stubs lib crosses APEX boundary
3896 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003897 }
Colin Cross6e511a92020-07-27 21:26:48 -07003898 if IsRuntimeDepTag(depTag) {
3899 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003900 return false
3901 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003902 }
Zhijun Heec285872021-04-24 10:47:08 -07003903 if cc.IsLlndk() {
3904 return false
3905 }
Colin Crossaac32222020-07-29 12:51:56 -07003906 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003907 // shared_lib dependency from a static lib is considered as crossing
3908 // the APEX boundary because the dependency doesn't actually is
3909 // linked; the dependency is used only during the compilation phase.
3910 return false
3911 }
Jiyong Parke3867542020-12-03 17:28:25 +09003912
3913 if isLibDepTag && libDepTag.excludeInApex {
3914 return false
3915 }
Colin Cross6e511a92020-07-27 21:26:48 -07003916 }
Colin Crossc1b36442021-05-06 13:42:48 -07003917 if depTag == stubImplDepTag {
3918 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003919 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003920 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003921 if depTag == staticVariantTag {
3922 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3923 // actually mean that the static lib (and its dependencies) are copied into the
3924 // APEX.
3925 return false
3926 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003927 return true
3928}
3929
Jiyong Park45bf82e2020-12-15 22:29:02 +09003930// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003931func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3932 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003933 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3934 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3935 return nil
3936 }
Jooyung Han749dc692020-04-15 11:03:39 +09003937 // We don't check for prebuilt modules
3938 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3939 return nil
3940 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003941
Jooyung Han749dc692020-04-15 11:03:39 +09003942 minSdkVersion := c.MinSdkVersion()
3943 if minSdkVersion == "apex_inherit" {
3944 return nil
3945 }
3946 if minSdkVersion == "" {
3947 // JNI libs within APK-in-APEX fall into here
3948 // Those are okay to set sdk_version instead
3949 // We don't have to check if this is a SDK variant because
3950 // non-SDK variant resets sdk_version, which works too.
3951 minSdkVersion = c.SdkVersion()
3952 }
Dan Albertc8060532020-07-22 22:32:17 -07003953 if minSdkVersion == "" {
3954 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3955 }
3956 // Not using nativeApiLevelFromUser because the context here is not
3957 // necessarily a native context.
3958 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003959 if err != nil {
3960 return err
3961 }
Dan Albertc8060532020-07-22 22:32:17 -07003962
Colin Cross8ca61c12022-10-06 21:00:14 -07003963 // A dependency only needs to support a min_sdk_version at least
3964 // as high as the api level that the architecture was introduced in.
3965 // This allows introducing new architectures in the platform that
3966 // need to be included in apexes that normally require an older
3967 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08003968 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07003969 if sdkVersion.LessThan(minApiForArch) {
3970 sdkVersion = minApiForArch
3971 }
3972
Dan Albertc8060532020-07-22 22:32:17 -07003973 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003974 return fmt.Errorf("newer SDK(%v)", ver)
3975 }
3976 return nil
3977}
3978
Paul Duffinb5769c12021-05-12 16:16:51 +01003979// Implements android.ApexModule
3980func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3981 // stub libraries and native bridge libraries are always available to platform
3982 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3983}
3984
Jooyung Han91f92032022-02-04 12:36:33 +09003985// Overrides android.ApexModuleBase.UniqueApexVariations
3986func (c *Module) UniqueApexVariations() bool {
3987 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
3988 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
3989 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09003990 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09003991 return c.UseVndk() && c.IsVndk()
3992}
3993
Inseob Kima1888ce2022-10-04 14:42:02 +09003994func (c *Module) overriddenModules() []string {
3995 if o, ok := c.linker.(overridable); ok {
3996 return o.overriddenModules()
3997 }
3998 return nil
3999}
4000
Rob Seymour925aa092021-08-10 20:42:03 +00004001var _ snapshot.RelativeInstallPath = (*Module)(nil)
4002
Liz Kammer35ca77e2021-12-22 15:31:40 -05004003type moduleType int
4004
4005const (
4006 unknownType moduleType = iota
4007 binary
4008 object
4009 fullLibrary
4010 staticLibrary
4011 sharedLibrary
4012 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004013 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004014 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004015)
4016
4017func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004018 if c.testBinary() {
4019 // testBinary is also a binary, so this comes before the c.Binary()
4020 // conditional. A testBinary has additional implicit dependencies and
4021 // other test-only semantics.
4022 return testBin
4023 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004024 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004025 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004026 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004027 } else if c.testLibrary() {
4028 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4029 // will let them add implicit compile deps on gtest, for example.
4030 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004031 // For now, treat them as regular libraries.
4032 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004033 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004034 static := false
4035 shared := false
4036 if library, ok := c.linker.(*libraryDecorator); ok {
4037 static = library.MutatedProperties.BuildStatic
4038 shared = library.MutatedProperties.BuildShared
4039 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4040 static = library.MutatedProperties.BuildStatic
4041 shared = library.MutatedProperties.BuildShared
4042 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004043 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004044 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004045 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004046 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004047 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004048 return staticLibrary
4049 }
4050 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004051 } else if c.isNDKStubLibrary() {
4052 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004053 }
4054 return unknownType
4055}
4056
4057// ConvertWithBp2build converts Module to Bazel for bp2build.
4058func (c *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
4059 prebuilt := c.IsPrebuilt()
4060 switch c.typ() {
4061 case binary:
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxb12ff592022-09-01 15:04:04 +00004062 if prebuilt {
4063 prebuiltBinaryBp2Build(ctx, c)
4064 } else {
Jingwen Chen537242c2022-08-24 11:53:27 +00004065 binaryBp2build(ctx, c)
4066 }
4067 case testBin:
4068 if !prebuilt {
4069 testBinaryBp2build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004070 }
4071 case object:
Colin Crossc5075e92022-12-05 16:46:39 -08004072 if prebuilt {
4073 prebuiltObjectBp2Build(ctx, c)
4074 } else {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004075 objectBp2Build(ctx, c)
4076 }
4077 case fullLibrary:
4078 if !prebuilt {
4079 libraryBp2Build(ctx, c)
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004080 } else {
4081 prebuiltLibraryBp2Build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004082 }
4083 case headerLibrary:
4084 libraryHeadersBp2Build(ctx, c)
4085 case staticLibrary:
Liz Kammer35ca77e2021-12-22 15:31:40 -05004086 if prebuilt {
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004087 prebuiltLibraryStaticBp2Build(ctx, c, false)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004088 } else {
4089 sharedOrStaticLibraryBp2Build(ctx, c, true)
4090 }
4091 case sharedLibrary:
4092 if prebuilt {
4093 prebuiltLibrarySharedBp2Build(ctx, c)
4094 } else {
4095 sharedOrStaticLibraryBp2Build(ctx, c, false)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004096 }
Spandan Das8b4a5f32022-09-29 00:28:24 +00004097 }
4098}
4099
4100var _ android.ApiProvider = (*Module)(nil)
4101
4102func (c *Module) ConvertWithApiBp2build(ctx android.TopDownMutatorContext) {
Spandan Das4238c652022-09-09 01:38:47 +00004103 if c.IsPrebuilt() {
4104 return
4105 }
Spandan Das8b4a5f32022-09-29 00:28:24 +00004106 switch c.typ() {
Spandan Das4238c652022-09-09 01:38:47 +00004107 case fullLibrary:
4108 apiContributionBp2Build(ctx, c)
4109 case sharedLibrary:
4110 apiContributionBp2Build(ctx, c)
4111 case headerLibrary:
4112 // Aggressively generate api targets for all header modules
4113 // This is necessary since the header module does not know if it is a dep of API surface stub library
4114 apiLibraryHeadersBp2Build(ctx, c)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004115 }
4116}
4117
Colin Crosscfad1192015-11-02 16:43:11 -08004118// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004119type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004120 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004121 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004122 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004123}
4124
Patrice Arrudac249c712019-03-19 17:00:29 -07004125// cc_defaults provides a set of properties that can be inherited by other cc
4126// modules. A module can use the properties from a cc_defaults using
4127// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4128// merged (when possible) by prepending the default module's values to the
4129// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004130func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004131 return DefaultsFactory()
4132}
4133
Colin Cross36242852017-06-23 15:06:31 -07004134func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004135 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004136
Colin Cross36242852017-06-23 15:06:31 -07004137 module.AddProperties(props...)
4138 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004139 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004140 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004141 &BaseCompilerProperties{},
4142 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004143 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004144 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004145 &StaticProperties{},
4146 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004147 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004148 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004149 &TestLinkerProperties{},
4150 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004151 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004152 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004153 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004154 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004155 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004156 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004157 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004158 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004159 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004160 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004161 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004162 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004163 &AfdoProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07004164 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004165 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004166 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4167 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004168 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004169 )
Colin Crosscfad1192015-11-02 16:43:11 -08004170
Jooyung Hancc372c52019-09-25 15:18:44 +09004171 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004172
4173 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004174}
4175
Jiyong Park2286afd2020-06-16 21:58:53 +09004176func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004177 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004178}
4179
Kiyoung Kim51279d32022-08-24 14:10:46 +09004180func (c *Module) isImportedApiLibrary() bool {
4181 _, ok := c.linker.(*apiLibraryDecorator)
4182 return ok
4183}
4184
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004185func kytheExtractAllFactory() android.Singleton {
4186 return &kytheExtractAllSingleton{}
4187}
4188
4189type kytheExtractAllSingleton struct {
4190}
4191
4192func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4193 var xrefTargets android.Paths
4194 ctx.VisitAllModules(func(module android.Module) {
4195 if ccModule, ok := module.(xref); ok {
4196 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4197 }
4198 })
4199 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4200 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004201 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004202 }
4203}
4204
Jihoon Kangf78a8902022-09-01 22:47:07 +00004205func (c *Module) Partition() string {
4206 if p, ok := c.installer.(interface {
4207 getPartition() string
4208 }); ok {
4209 return p.getPartition()
4210 }
4211 return ""
4212}
4213
Colin Cross06a931b2015-10-28 17:23:31 -07004214var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004215var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004216var BoolPtr = proptools.BoolPtr
4217var String = proptools.String
4218var StringPtr = proptools.StringPtr