blob: 426bac89b1a843a3a943ea1490ae1ccc34bac878 [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,
Sam Delmericoef69d472023-04-18 17:32:43 -04001931 sanitizeProps.Scudo,
1932 BoolPtr(len(c.sanitize.Properties.Sanitize.Recover) > 0),
1933 BoolPtr(c.sanitize.Properties.Sanitize.Blocklist != nil),
1934 }
1935 for _, san := range unsupportedSanitizers {
1936 if Bool(san) {
1937 return false
1938 }
1939 }
1940
1941 for _, san := range Sanitizers {
1942 if san == intOverflow {
1943 // TODO(b/261058727): enable mixed builds for all modules with UBSan
1944 // Currently we can only support ubsan when minimum runtime is used.
1945 ubsanEnabled := Bool(sanitizeProps.Integer_overflow) || len(sanitizeProps.Misc_undefined) > 0
1946 if ubsanEnabled && !c.MinimalRuntimeNeeded() {
1947 return false
1948 }
Yu Liu95497dc2023-05-25 11:15:07 -07001949 } else if san == cfi {
1950 continue
Sam Delmericoef69d472023-04-18 17:32:43 -04001951 } else if c.sanitize.isSanitizerEnabled(san) {
1952 return false
1953 }
1954 }
1955
1956 return true
Yu Liue4312402023-01-18 09:15:31 -08001957}
1958
1959func GetApexConfigKey(ctx android.BaseModuleContext) *android.ApexConfigKey {
1960 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1961 if !apexInfo.IsForPlatform() {
Yu Liubfb23622023-02-22 10:42:15 -08001962 if !ctx.Config().BazelContext.IsModuleDclaAllowed(ctx.Module().Name()) {
1963 return nil
1964 }
Yu Liue4312402023-01-18 09:15:31 -08001965 apexKey := android.ApexConfigKey{
1966 WithinApex: true,
1967 ApexSdkVersion: findApexSdkVersion(ctx, apexInfo).String(),
1968 }
1969 return &apexKey
1970 }
1971
1972 return nil
Chris Parsonsf874e462022-05-10 13:50:12 -04001973}
1974
1975func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) {
1976 bazelModuleLabel := c.getBazelModuleLabel(ctx)
Chris Parsonsf874e462022-05-10 13:50:12 -04001977 c.bazelHandler.ProcessBazelQueryResponse(ctx, bazelModuleLabel)
1978
1979 c.Properties.SubName = GetSubnameProperty(ctx, c)
1980 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
1981 if !apexInfo.IsForPlatform() {
1982 c.hideApexVariantFromMake = true
Chris Parsons77acf2e2021-12-03 17:27:16 -05001983 }
Liz Kammer35ca77e2021-12-22 15:31:40 -05001984
Chris Parsonsf874e462022-05-10 13:50:12 -04001985 c.makeLinkType = GetMakeLinkType(ctx, c)
1986
1987 mctx := &moduleContext{
1988 ModuleContext: ctx,
1989 moduleContextImpl: moduleContextImpl{
1990 mod: c,
1991 },
Chris Parsons8d6e4332021-02-22 16:13:50 -05001992 }
Chris Parsonsf874e462022-05-10 13:50:12 -04001993 mctx.ctx = mctx
1994
Jingwen Chen3952a902022-12-12 12:20:58 +00001995 // TODO(b/244432500): Get the tradefed config from the bazel target instead
1996 // of generating it with Soong.
Chris Parsonsf874e462022-05-10 13:50:12 -04001997 c.maybeInstall(mctx, apexInfo)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001998}
1999
Sam Delmerico75dbca22023-04-20 13:13:25 +00002000func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
2001 ctx := &moduleContext{
2002 ModuleContext: actx,
2003 moduleContextImpl: moduleContextImpl{
2004 mod: c,
2005 },
2006 }
2007 ctx.ctx = ctx
2008 return ctx
2009}
2010
Spandan Das20fce2d2023-04-12 17:21:39 +00002011// TODO (b/277651159): Remove this allowlist
2012var (
2013 skipStubLibraryMultipleApexViolation = map[string]bool{
2014 "libclang_rt.asan": true,
2015 "libclang_rt.hwasan": true,
2016 // runtime apex
2017 "libc": true,
2018 "libc_hwasan": true,
2019 "libdl_android": true,
2020 "libm": true,
2021 "libdl": true,
2022 // art apex
2023 "libandroidio": true,
2024 "libdexfile": true,
2025 "libnativebridge": true,
2026 "libnativehelper": true,
2027 "libnativeloader": true,
2028 "libsigchain": true,
2029 }
2030)
2031
2032// Returns true if a stub library could be installed in multiple apexes
2033func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2034 // If this is not an apex variant, no check necessary
2035 if !c.InAnyApex() {
2036 return false
2037 }
2038 // If this is not a stub library, no check necessary
2039 if !c.HasStubsVariants() {
2040 return false
2041 }
2042 // Skip the allowlist
2043 // Use BaseModuleName so that this matches prebuilts.
2044 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2045 return false
2046 }
2047
2048 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
2049 // Stub libraries should not have more than one apex_available
2050 if len(aaWithoutTestApexes) > 1 {
2051 return true
2052 }
2053 // Stub libraries should not use the wildcard
2054 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
2055 return true
2056 }
2057 // Default: no violation
2058 return false
2059}
2060
Chris Parsons8d6e4332021-02-22 16:13:50 -05002061func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05002062 // Handle the case of a test module split by `test_per_src` mutator.
2063 //
2064 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
2065 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
2066 // module and return early, as this module does not produce an output file per se.
2067 if c.IsTestPerSrcAllTestsVariation() {
2068 c.outputFile = android.OptionalPath{}
2069 return
2070 }
2071
Ivan Lozanof1868af2022-04-12 13:08:36 -04002072 c.Properties.SubName = GetSubnameProperty(actx, c)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002073 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2074 if !apexInfo.IsForPlatform() {
2075 c.hideApexVariantFromMake = true
2076 }
2077
Chris Parsonseefc9e62021-04-02 17:36:47 -04002078 c.makeLinkType = GetMakeLinkType(actx, c)
2079
Sam Delmerico75dbca22023-04-20 13:13:25 +00002080 ctx := moduleContextFromAndroidModuleContext(actx, c)
Colin Crossca860ac2016-01-04 14:34:37 -08002081
Colin Crossf18e1102017-11-16 14:33:08 -08002082 deps := c.depsToPaths(ctx)
2083 if ctx.Failed() {
2084 return
2085 }
2086
Spandan Das20fce2d2023-04-12 17:21:39 +00002087 if c.stubLibraryMultipleApexViolation(actx) {
2088 actx.PropertyErrorf("apex_available",
2089 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2090 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002091 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2092 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002093 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2094 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002095 }
2096
Colin Crossca860ac2016-01-04 14:34:37 -08002097 flags := Flags{
2098 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002099 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002100 }
Colin Crossca860ac2016-01-04 14:34:37 -08002101 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002102 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002103 }
2104 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002105 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002106 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002107 if c.stl != nil {
2108 flags = c.stl.flags(ctx, flags)
2109 }
Colin Cross16b23492016-01-06 14:41:07 -08002110 if c.sanitize != nil {
2111 flags = c.sanitize.flags(ctx, flags)
2112 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002113 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002114 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002115 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002116 if c.fuzzer != nil {
2117 flags = c.fuzzer.flags(ctx, flags)
2118 }
Stephen Craneba090d12017-05-09 15:44:35 -07002119 if c.lto != nil {
2120 flags = c.lto.flags(ctx, flags)
2121 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002122 if c.afdo != nil {
2123 flags = c.afdo.flags(ctx, flags)
2124 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002125 if c.pgo != nil {
2126 flags = c.pgo.flags(ctx, flags)
2127 }
Colin Crossca860ac2016-01-04 14:34:37 -08002128 for _, feature := range c.features {
2129 flags = feature.flags(ctx, flags)
2130 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002131 if ctx.Failed() {
2132 return
2133 }
2134
Colin Cross4af21ed2019-11-04 09:37:55 -08002135 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2136 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2137 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002138
Colin Cross4af21ed2019-11-04 09:37:55 -08002139 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002140
2141 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002142 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002143 }
2144 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002145 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002146 }
2147
Colin Cross3e5e7782022-06-17 22:17:05 +00002148 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2149
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002150 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002151 // We need access to all the flags seen by a source file.
2152 if c.sabi != nil {
2153 flags = c.sabi.flags(ctx, flags)
2154 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002155
Colin Cross4af21ed2019-11-04 09:37:55 -08002156 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002157
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002158 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002159 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002160 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002161 if ctx.Failed() {
2162 return
2163 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002164 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07002165 c.objFiles = objs.objFiles
2166 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08002167 }
2168
Colin Crossca860ac2016-01-04 14:34:37 -08002169 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002170 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002171 if ctx.Failed() {
2172 return
2173 }
Colin Cross635c3b02016-05-18 15:37:25 -07002174 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002175
Chris Parsons94a0bba2021-06-04 15:03:47 -04002176 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002177
Jose Galmes6f843bc2020-12-11 13:36:29 -08002178 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
2179 // RECOVERY_SNAPSHOT_VERSION is current.
2180 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04002181 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002182 i.collectHeadersForSnapshot(ctx)
2183 }
2184 }
Colin Crossce75d2c2016-10-06 16:12:58 -07002185 }
Colin Cross5049f022015-03-18 13:28:46 -07002186
Chris Parsons94a0bba2021-06-04 15:03:47 -04002187 c.maybeInstall(ctx, apexInfo)
2188}
2189
2190func (c *Module) maybeUnhideFromMake() {
2191 // If a lib is directly included in any of the APEXes or is not available to the
2192 // platform (which is often the case when the stub is provided as a prebuilt),
2193 // unhide the stubs variant having the latest version gets visible to make. In
2194 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2195 // force anything in the make world to link against the stubs library. (unless it
2196 // is explicitly referenced via .bootstrap suffix or the module is marked with
2197 // 'bootstrap: true').
2198 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
2199 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
2200 c.IsStubs() && !c.InVendorRamdisk() {
2201 c.Properties.HideFromMake = false // unhide
2202 // Note: this is still non-installable
2203 }
2204}
2205
Jingwen Chen3952a902022-12-12 12:20:58 +00002206// maybeInstall is called at the end of both GenerateAndroidBuildActions and
2207// ProcessBazelQueryResponse to run the install hooks for installable modules,
2208// like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002209func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002210 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002211 // If the module has been specifically configure to not be installed then
2212 // hide from make as otherwise it will break when running inside make
2213 // as the output path to install will not be specified. Not all uninstallable
2214 // modules can be hidden from make as some are needed for resolving make side
2215 // dependencies.
2216 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002217 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002218 c.SkipInstall()
2219 }
2220
2221 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2222 // to allow using the outputs in a genrule.
2223 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002224 c.installer.install(ctx, c.outputFile.Path())
2225 if ctx.Failed() {
2226 return
Colin Crossca860ac2016-01-04 14:34:37 -08002227 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002228 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002229}
2230
Sam Delmerico5fb794a2023-01-27 16:01:37 -05002231func (c *Module) setAndroidMkVariablesFromCquery(info cquery.CcAndroidMkInfo) {
2232 c.Properties.AndroidMkSharedLibs = info.LocalSharedLibs
2233 c.Properties.AndroidMkStaticLibs = info.LocalStaticLibs
2234 c.Properties.AndroidMkWholeStaticLibs = info.LocalWholeStaticLibs
2235}
2236
Colin Cross0ea8ba82019-06-06 14:33:29 -07002237func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002238 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002239 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002240 }
Colin Crossca860ac2016-01-04 14:34:37 -08002241 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002242}
2243
Colin Crossca860ac2016-01-04 14:34:37 -08002244func (c *Module) begin(ctx BaseModuleContext) {
2245 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002246 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002247 }
Colin Crossca860ac2016-01-04 14:34:37 -08002248 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002249 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002250 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002251 if c.stl != nil {
2252 c.stl.begin(ctx)
2253 }
Colin Cross16b23492016-01-06 14:41:07 -08002254 if c.sanitize != nil {
2255 c.sanitize.begin(ctx)
2256 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002257 if c.coverage != nil {
2258 c.coverage.begin(ctx)
2259 }
Stephen Craneba090d12017-05-09 15:44:35 -07002260 if c.lto != nil {
2261 c.lto.begin(ctx)
2262 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002263 if c.pgo != nil {
2264 c.pgo.begin(ctx)
2265 }
Dan Albert92fe7402020-07-15 13:33:30 -07002266 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002267 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002268 if err != nil {
2269 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002270 c.Properties.Sdk_version = nil
2271 } else {
2272 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002273 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002274 }
Colin Crossca860ac2016-01-04 14:34:37 -08002275}
2276
Colin Cross37047f12016-12-13 17:06:13 -08002277func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002278 deps := Deps{}
2279
2280 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002281 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002282 }
2283 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002284 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002285 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002286 if c.stl != nil {
2287 deps = c.stl.deps(ctx, deps)
2288 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002289 if c.coverage != nil {
2290 deps = c.coverage.deps(ctx, deps)
2291 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002292
Colin Crossb6715442017-10-24 11:13:31 -07002293 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2294 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2295 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2296 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2297 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2298 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002299 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002300
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002301 for _, lib := range deps.ReexportSharedLibHeaders {
2302 if !inList(lib, deps.SharedLibs) {
2303 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2304 }
2305 }
2306
2307 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002308 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2309 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 -07002310 }
2311 }
2312
Colin Cross5950f382016-12-13 12:50:57 -08002313 for _, lib := range deps.ReexportHeaderLibHeaders {
2314 if !inList(lib, deps.HeaderLibs) {
2315 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2316 }
2317 }
2318
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002319 for _, gen := range deps.ReexportGeneratedHeaders {
2320 if !inList(gen, deps.GeneratedHeaders) {
2321 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2322 }
2323 }
2324
Colin Crossc99deeb2016-04-11 15:06:20 -07002325 return deps
2326}
2327
Dan Albert7e9d2952016-08-04 13:02:36 -07002328func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002329 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002330 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002331 moduleContextImpl: moduleContextImpl{
2332 mod: c,
2333 },
2334 }
2335 ctx.ctx = ctx
2336
Vinh Tran44cb78c2023-03-09 22:07:19 -05002337 if !actx.Host() || !ctx.static() || ctx.staticBinary() {
2338 c.afdo.addDep(ctx, actx)
2339 }
2340
Colin Crossca860ac2016-01-04 14:34:37 -08002341 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002342}
2343
Jiyong Park7ed9de32018-10-15 22:25:07 +09002344// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002345func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002346 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2347 version := name[sharp+1:]
2348 libname := name[:sharp]
2349 return libname, version
2350 }
2351 return name, ""
2352}
2353
Dan Albert92fe7402020-07-15 13:33:30 -07002354func GetCrtVariations(ctx android.BottomUpMutatorContext,
2355 m LinkableInterface) []blueprint.Variation {
2356 if ctx.Os() != android.Android {
2357 return nil
2358 }
2359 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002360 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2361 minSdkVersion := m.MinSdkVersion()
2362 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2363 minSdkVersion = m.SdkVersion()
2364 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002365 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2366 if err != nil {
2367 ctx.PropertyErrorf("min_sdk_version", err.Error())
2368 }
Colin Cross363ec762023-01-13 13:45:14 -08002369
2370 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002371 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002372 if apiLevel.LessThan(minApiForArch) {
2373 apiLevel = minApiForArch
2374 }
2375
Dan Albert92fe7402020-07-15 13:33:30 -07002376 return []blueprint.Variation{
2377 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002378 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002379 }
2380 }
2381 return []blueprint.Variation{
2382 {Mutator: "sdk", Variation: ""},
2383 }
2384}
2385
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002386func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2387 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002388
2389 variations = append([]blueprint.Variation(nil), variations...)
2390
Liz Kammer23942242022-04-08 15:41:00 -04002391 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002392 // Version is explicitly specified. i.e. libFoo#30
2393 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002394 if tag, ok := depTag.(libraryDependencyTag); ok {
2395 tag.explicitlyVersioned = true
2396 } else {
2397 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2398 }
Colin Crosse7257d22020-09-24 09:56:18 -07002399 }
Colin Crosse7257d22020-09-24 09:56:18 -07002400
Colin Cross0de8a1e2020-09-18 14:15:30 -07002401 if far {
2402 ctx.AddFarVariationDependencies(variations, depTag, name)
2403 } else {
2404 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002405 }
2406}
2407
Kiyoung Kim487689e2022-07-26 09:48:22 +09002408func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2409 apiImportInfo := multitree.ApiImportInfo{}
2410
2411 if c.Device() {
2412 var apiImportModule []blueprint.Module
2413 if actx.OtherModuleExists("api_imports") {
2414 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2415 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
2416 apiInfo := actx.OtherModuleProvider(apiImportModule[0], multitree.ApiImportsProvider).(multitree.ApiImportInfo)
2417 apiImportInfo = apiInfo
2418 actx.SetProvider(multitree.ApiImportsProvider, apiInfo)
2419 }
2420 }
2421 }
2422
2423 return apiImportInfo
2424}
2425
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002426func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002427 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002428 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002429 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002430 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2431 // between the modules in the snapshot and the snapshot itself.
2432 var snapshotModule []blueprint.Module
2433 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2434 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2435 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2436 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2437 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002438 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002439 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2440 *snapshotInfo = &snapshot
2441 // republish the snapshot for use in later mutators on this module
2442 actx.SetProvider(SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002443 }
2444 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002445 if *snapshotInfo == nil {
2446 *snapshotInfo = &SnapshotInfo{}
2447 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002448 return **snapshotInfo
2449}
2450
Kiyoung Kim487689e2022-07-26 09:48:22 +09002451func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2452 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002453 return snapshot
2454 }
2455
2456 return lib
2457}
2458
2459// RewriteLibs takes a list of names of shared libraries and scans it for three types
2460// of names:
2461//
2462// 1. Name of an NDK library that refers to a prebuilt module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002463//
2464// For each of these, it adds the name of the prebuilt module (which will be in
2465// prebuilts/ndk) to the list of nonvariant libs.
2466//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002467// 2. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002468//
2469// For each of these, it adds the name of the ndk_library module to the list of
2470// variant libs.
2471//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002472// 3. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002473//
2474// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002475//
2476// The caller can then know to add the variantLibs dependencies differently from the
2477// nonvariantLibs
2478func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2479 variantLibs = []string{}
2480
2481 nonvariantLibs = []string{}
2482 for _, entry := range list {
2483 // strip #version suffix out
2484 name, _ := StubsLibNameAndVersion(entry)
2485 if c.InRecovery() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002486 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002487 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2488 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2489 } else if c.UseVndk() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002490 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002491 } else {
2492 // put name#version back
2493 nonvariantLibs = append(nonvariantLibs, entry)
2494 }
2495 }
2496 return nonvariantLibs, variantLibs
2497}
2498
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002499func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2500 nonVariantLibs := []string{}
2501 variantLibs := []string{}
2502
2503 for _, lib := range libs {
2504 replaceLibName := GetReplaceModuleName(lib, replaceList)
2505 if replaceLibName == lib {
2506 // Do not handle any libs which are not in API imports
2507 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2508 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2509 variantLibs = append(variantLibs, replaceLibName)
2510 } else {
2511 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2512 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002513 }
2514
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002515 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002516}
2517
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002518func (c *Module) shouldUseApiSurface() bool {
2519 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2520 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2521 // LLNDK Variant
2522 return true
2523 }
2524
2525 if c.Properties.IsSdkVariant {
2526 // NDK Variant
2527 return true
2528 }
2529
2530 if c.isImportedApiLibrary() {
2531 // API Library should depend on API headers
2532 return true
2533 }
2534 }
2535
2536 return false
2537}
2538
Colin Cross1e676be2016-10-12 14:38:15 -07002539func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002540 if !c.Enabled() {
2541 return
2542 }
2543
Colin Cross37047f12016-12-13 17:06:13 -08002544 ctx := &depsContext{
2545 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002546 moduleContextImpl: moduleContextImpl{
2547 mod: c,
2548 },
2549 }
2550 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002551
Colin Crossc99deeb2016-04-11 15:06:20 -07002552 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002553 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002554
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002555 apiNdkLibs := []string{}
2556 apiLateNdkLibs := []string{}
2557
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002558 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002559 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2560 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2561 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2562 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2563 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002564 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002565
Yo Chiang219968c2020-09-22 18:45:04 +08002566 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2567
Colin Crosse0edaf92021-01-11 17:31:17 -08002568 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002569
Dan Albert914449f2016-06-17 16:45:24 -07002570 variantNdkLibs := []string{}
2571 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002572 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002573 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2574 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2575 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002576
2577 for idx, lib := range deps.RuntimeLibs {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002578 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002579 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002580 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002581
Colin Cross32ec36c2016-12-15 07:39:51 -08002582 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002583 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002584 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002585 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002586 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002587
Kiyoung Kim51279d32022-08-24 14:10:46 +09002588 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002589 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002590 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2591 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002592 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002593
Spandan Das73bcafc2022-08-18 23:26:00 +00002594 if c.isNDKStubLibrary() {
2595 // ndk_headers do not have any variations
2596 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002597 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002598 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002599 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002600 } else {
2601 actx.AddVariationDependencies(nil, depTag, lib)
2602 }
2603 }
2604
Dan Albertf1d14c72020-07-30 14:32:55 -07002605 if c.isNDKStubLibrary() {
2606 // NDK stubs depend on their implementation because the ABI dumps are
2607 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002608
Spandan Das8b08aea2023-03-14 19:29:34 +00002609 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2610 c.ImageVariation(),
2611 blueprint.Variation{Mutator: "link", Variation: "shared"},
2612 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002613 }
2614
Jiyong Park5d1598f2019-02-25 22:14:17 +09002615 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002616 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002617
Kiyoung Kim487689e2022-07-26 09:48:22 +09002618 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002619
Jiyong Park5d1598f2019-02-25 22:14:17 +09002620 actx.AddVariationDependencies([]blueprint.Variation{
2621 {Mutator: "link", Variation: "static"},
2622 }, depTag, lib)
2623 }
2624
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002625 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002626 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002627 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002628 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002629 }
Jiyong Parke3867542020-12-03 17:28:25 +09002630 if inList(lib, deps.ExcludeLibsForApex) {
2631 depTag.excludeInApex = true
2632 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002633
Kiyoung Kim487689e2022-07-26 09:48:22 +09002634 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002635
Dan Willemsen59339a22018-07-22 21:18:45 -07002636 actx.AddVariationDependencies([]blueprint.Variation{
2637 {Mutator: "link", Variation: "static"},
2638 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002639 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002640
Jooyung Han75568392020-03-20 04:29:24 +09002641 // staticUnwinderDep is treated as staticDep for Q apexes
2642 // so that native libraries/binaries are linked with static unwinder
2643 // because Q libc doesn't have unwinder APIs
2644 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002645 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002646 actx.AddVariationDependencies([]blueprint.Variation{
2647 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002648 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002649 }
2650
Jiyong Park7ed9de32018-10-15 22:25:07 +09002651 // shared lib names without the #version suffix
2652 var sharedLibNames []string
2653
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002654 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002655 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002656 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002657 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002658 }
Jiyong Parke3867542020-12-03 17:28:25 +09002659 if inList(lib, deps.ExcludeLibsForApex) {
2660 depTag.excludeInApex = true
2661 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002662
Jiyong Park73c54ee2019-10-22 20:31:18 +09002663 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002664 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2665 name = apiLibraryName
2666 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002667 sharedLibNames = append(sharedLibNames, name)
2668
Colin Crosse7257d22020-09-24 09:56:18 -07002669 variations := []blueprint.Variation{
2670 {Mutator: "link", Variation: "shared"},
2671 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002672
2673 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2674 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2675 }
2676
2677 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2678 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2679 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002680 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002681
Colin Crossfe9acfe2021-06-14 16:13:03 -07002682 for _, lib := range deps.LateStaticLibs {
2683 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2684 actx.AddVariationDependencies([]blueprint.Variation{
2685 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002686 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Crossfe9acfe2021-06-14 16:13:03 -07002687 }
2688
Colin Cross3e5e7782022-06-17 22:17:05 +00002689 for _, lib := range deps.UnexportedStaticLibs {
2690 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2691 actx.AddVariationDependencies([]blueprint.Variation{
2692 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002693 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Cross3e5e7782022-06-17 22:17:05 +00002694 }
2695
Jiyong Park7ed9de32018-10-15 22:25:07 +09002696 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002697 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002698 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2699 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2700 // linking against both the stubs lib and the non-stubs lib at the same time.
2701 continue
2702 }
Colin Cross6e511a92020-07-27 21:26:48 -07002703 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002704 variations := []blueprint.Variation{
2705 {Mutator: "link", Variation: "shared"},
2706 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002707 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002708 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002709
Dan Willemsen59339a22018-07-22 21:18:45 -07002710 actx.AddVariationDependencies([]blueprint.Variation{
2711 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002712 }, dataLibDepTag, deps.DataLibs...)
2713
Colin Crossc8caa062021-09-24 16:50:14 -07002714 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2715
Chris Parsons79d66a52020-06-05 17:26:16 -04002716 actx.AddVariationDependencies([]blueprint.Variation{
2717 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002718 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002719
Colin Cross68861832016-07-08 10:41:41 -07002720 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002721
2722 for _, gen := range deps.GeneratedHeaders {
2723 depTag := genHeaderDepTag
2724 if inList(gen, deps.ReexportGeneratedHeaders) {
2725 depTag = genHeaderExportDepTag
2726 }
2727 actx.AddDependency(c, depTag, gen)
2728 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002729
Dan Albert92fe7402020-07-15 13:33:30 -07002730 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002731 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002732 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002733 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002734 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002735 }
Colin Crossc465efd2021-06-11 18:00:04 -07002736 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002737 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002738 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002739 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002740 if deps.DynamicLinker != "" {
2741 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002742 }
Dan Albert914449f2016-06-17 16:45:24 -07002743
2744 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002745
2746 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002747 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002748 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002749 {Mutator: "link", Variation: "shared"},
2750 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002751 actx.AddVariationDependencies([]blueprint.Variation{
2752 {Mutator: "version", Variation: version},
2753 {Mutator: "link", Variation: "shared"},
2754 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002755
2756 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002757 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002758 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002759 {Mutator: "link", Variation: "shared"},
2760 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002761 actx.AddVariationDependencies([]blueprint.Variation{
2762 {Mutator: "version", Variation: version},
2763 {Mutator: "link", Variation: "shared"},
2764 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002765
2766 if vndkdep := c.vndkdep; vndkdep != nil {
2767 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002768 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002769 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002770 {Mutator: "link", Variation: "shared"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002771 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002772 }
2773 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002774
Vinh Tran367d89d2023-04-28 11:21:25 -04002775 if len(deps.AidlLibs) > 0 {
2776 actx.AddDependency(
2777 c,
2778 aidlLibraryTag,
2779 deps.AidlLibs...,
2780 )
2781 }
2782
Kiyoung Kimee58c932022-10-25 22:59:41 +09002783 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002784}
Colin Cross21b9a242015-03-24 14:15:58 -07002785
Colin Crosse40b4ea2018-10-02 22:25:58 -07002786func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002787 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2788 c.beginMutator(ctx)
2789 }
2790}
2791
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002792// Whether a module can link to another module, taking into
2793// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002794func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002795 tag blueprint.DependencyTag) {
2796
2797 switch t := tag.(type) {
2798 case dependencyTag:
2799 if t != vndkExtDepTag {
2800 return
2801 }
2802 case libraryDependencyTag:
2803 default:
2804 return
2805 }
2806
Ivan Lozanof9e21722020-12-02 09:00:51 -05002807 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002808 // Host code is not restricted
2809 return
2810 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002811
2812 // VNDK is cc.Module supported only for now.
2813 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002814 // Though allowed dependency is limited by the image mutator,
2815 // each vendor and product module needs to check link-type
2816 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002817 if ccTo, ok := to.(*Module); ok {
2818 if ccFrom.vndkdep != nil {
2819 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2820 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002821 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002822 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002823 }
2824 return
2825 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002826 // TODO(b/244244438) : Remove this once all variants are implemented
2827 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2828 return
2829 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002830 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002831 // Platform code can link to anything
2832 return
2833 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002834 if from.InRamdisk() {
2835 // Ramdisk code is not NDK
2836 return
2837 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002838 if from.InVendorRamdisk() {
2839 // Vendor ramdisk code is not NDK
2840 return
2841 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002842 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002843 // Recovery code is not NDK
2844 return
2845 }
Colin Cross31076b32020-10-23 17:22:06 -07002846 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002847 if c.NdkPrebuiltStl() {
2848 // These are allowed, but they don't set sdk_version
2849 return
2850 }
2851 if c.StubDecorator() {
2852 // These aren't real libraries, but are the stub shared libraries that are included in
2853 // the NDK.
2854 return
2855 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002856 if c.isImportedApiLibrary() {
2857 // Imported library from the API surface is a stub library built against interface definition.
2858 return
2859 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002860 }
Logan Chien834b9a62019-01-14 15:39:03 +08002861
Ivan Lozano52767be2019-10-18 14:49:46 -07002862 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002863 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2864 // to link to libc++ (non-NDK and without sdk_version).
2865 return
2866 }
2867
Ivan Lozano52767be2019-10-18 14:49:46 -07002868 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002869 // NDK code linking to platform code is never okay.
2870 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002871 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002872 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002873 }
2874
2875 // At this point we know we have two NDK libraries, but we need to
2876 // check that we're not linking against anything built against a higher
2877 // API level, as it is only valid to link against older or equivalent
2878 // APIs.
2879
Inseob Kim01a28722018-04-11 09:48:45 +09002880 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002881 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002882 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002883 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002884 // Current can't be linked against by anything else.
2885 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002886 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002887 } else {
Ivan Lozano52767be2019-10-18 14:49:46 -07002888 fromApi, err := strconv.Atoi(from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002889 if err != nil {
2890 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002891 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002892 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002893 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002894 toApi, err := strconv.Atoi(to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002895 if err != nil {
2896 ctx.PropertyErrorf("sdk_version",
Inseob Kim34b22832018-04-11 10:13:16 +09002897 "Invalid sdk_version value (must be int or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002898 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002899 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002900
Inseob Kim01a28722018-04-11 09:48:45 +09002901 if toApi > fromApi {
2902 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002903 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002904 }
2905 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002906 }
Dan Albert202fe492017-12-15 13:56:59 -08002907
2908 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002909 fromStl := from.SelectedStl()
2910 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002911 if fromStl == "" || toStl == "" {
2912 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002913 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002914 // We can be permissive with the system "STL" since it is only the C++
2915 // ABI layer, but in the future we should make sure that everyone is
2916 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002917 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002918 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002919 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2920 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002921 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002922}
2923
Jooyung Han479ca172020-10-19 18:51:07 +09002924func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2925 if c, ok := ctx.Module().(*Module); ok {
2926 ctx.VisitDirectDeps(func(dep android.Module) {
2927 depTag := ctx.OtherModuleDependencyTag(dep)
2928 ccDep, ok := dep.(LinkableInterface)
2929 if ok {
2930 checkLinkType(ctx, c, ccDep, depTag)
2931 }
2932 })
2933 }
2934}
2935
Jiyong Park5fb8c102018-04-09 12:03:06 +09002936// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002937// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2938// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002939// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002940func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2941 check := func(child, parent android.Module) bool {
2942 to, ok := child.(*Module)
2943 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002944 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002945 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002946
Jooyung Hana70f0672019-01-18 15:20:43 +09002947 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2948 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002949 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002950
Jiyong Park0474e1f2021-01-14 14:26:06 +09002951 // These dependencies are not excercised at runtime. Tracking these will give us
2952 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002953 depTag := ctx.OtherModuleDependencyTag(child)
2954 if IsHeaderDepTag(depTag) {
2955 return false
2956 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002957 if depTag == staticVariantTag {
2958 return false
2959 }
2960 if depTag == stubImplDepTag {
2961 return false
2962 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002963
Justin Yun63e9ec72020-10-29 16:49:43 +09002964 // Even if target lib has no vendor variant, keep checking dependency
2965 // graph in case it depends on vendor_available or product_available
2966 // but not double_loadable transtively.
2967 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002968 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002969 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002970
Jiyong Park0474e1f2021-01-14 14:26:06 +09002971 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2972 // one.
2973 if Bool(to.VendorProperties.Double_loadable) {
2974 return true
2975 }
2976
Ivan Lozanod7586b62021-04-01 09:49:36 -04002977 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002978 return false
2979 }
2980
Jooyung Hana70f0672019-01-18 15:20:43 +09002981 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2982 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002983 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002984 return false
2985 }
2986 if module, ok := ctx.Module().(*Module); ok {
2987 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002988 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002989 ctx.WalkDeps(check)
2990 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002991 }
2992 }
2993}
2994
Yu Liue4312402023-01-18 09:15:31 -08002995func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
2996 // For the dependency from platform to apex, use the latest stubs
2997 apexSdkVersion := android.FutureApiLevel
2998 if !apexInfo.IsForPlatform() {
2999 apexSdkVersion = apexInfo.MinSdkVersion
3000 }
3001
3002 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3003 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3004 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3005 // (b/144430859)
3006 apexSdkVersion = android.FutureApiLevel
3007 }
3008
3009 return apexSdkVersion
3010}
3011
Colin Crossc99deeb2016-04-11 15:06:20 -07003012// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003013func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003014 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003015
Colin Cross0de8a1e2020-09-18 14:15:30 -07003016 var directStaticDeps []StaticLibraryInfo
3017 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003018
Colin Cross0de8a1e2020-09-18 14:15:30 -07003019 reexportExporter := func(exporter FlagExporterInfo) {
3020 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3021 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3022 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3023 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3024 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003025 }
3026
Colin Cross56a83212020-09-15 18:30:11 -07003027 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
Yu Liue4312402023-01-18 09:15:31 -08003028 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003029
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003030 skipModuleList := map[string]bool{}
3031
3032 var apiImportInfo multitree.ApiImportInfo
3033 hasApiImportInfo := false
3034
3035 ctx.VisitDirectDeps(func(dep android.Module) {
3036 if dep.Name() == "api_imports" {
3037 apiImportInfo = ctx.OtherModuleProvider(dep, multitree.ApiImportsProvider).(multitree.ApiImportInfo)
3038 hasApiImportInfo = true
3039 }
3040 })
3041
3042 if hasApiImportInfo {
3043 targetStubModuleList := map[string]string{}
3044 targetOrigModuleList := map[string]string{}
3045
3046 // Search for dependency which both original module and API imported library with APEX stub exists
3047 ctx.VisitDirectDeps(func(dep android.Module) {
3048 depName := ctx.OtherModuleName(dep)
3049 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
3050 targetStubModuleList[apiLibrary] = depName
3051 }
3052 })
3053 ctx.VisitDirectDeps(func(dep android.Module) {
3054 depName := ctx.OtherModuleName(dep)
3055 if origLibrary, ok := targetStubModuleList[depName]; ok {
3056 targetOrigModuleList[origLibrary] = depName
3057 }
3058 })
3059
3060 // Decide which library should be used between original and API imported library
3061 ctx.VisitDirectDeps(func(dep android.Module) {
3062 depName := ctx.OtherModuleName(dep)
3063 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003064 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003065 skipModuleList[depName] = true
3066 } else {
3067 skipModuleList[apiLibrary] = true
3068 }
3069 }
3070 })
3071 }
3072
Colin Crossd11fcda2017-10-23 17:59:01 -07003073 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003074 depName := ctx.OtherModuleName(dep)
3075 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003076
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003077 if _, ok := skipModuleList[depName]; ok {
3078 // skip this module because original module or API imported module matching with this should be used instead.
3079 return
3080 }
3081
Dan Willemsen47450072021-10-19 20:24:49 -07003082 if depTag == android.DarwinUniversalVariantTag {
3083 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3084 return
3085 }
3086
Vinh Tran367d89d2023-04-28 11:21:25 -04003087 if depTag == aidlLibraryTag {
3088 if ctx.OtherModuleHasProvider(dep, aidl_library.AidlLibraryProvider) {
3089 depPaths.AidlLibraryInfos = append(
3090 depPaths.AidlLibraryInfos,
3091 ctx.OtherModuleProvider(
3092 dep,
3093 aidl_library.AidlLibraryProvider).(aidl_library.AidlLibraryInfo),
3094 )
3095 }
3096 }
3097
Ivan Lozano52767be2019-10-18 14:49:46 -07003098 ccDep, ok := dep.(LinkableInterface)
3099 if !ok {
3100
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003101 // handling for a few module types that aren't cc Module but that are also supported
3102 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003103 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003104 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003105 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3106 genRule.GeneratedSourceFiles()...)
3107 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003108 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003109 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003110 // Support exported headers from a generated_sources dependency
3111 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003112 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003113 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003114 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003115 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003116 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003117 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003118 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003119 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003120 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3121 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003122 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003123 // 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 +09003124 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003125
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003126 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003127 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003128 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003129 }
Colin Crosscef792e2021-06-11 18:01:26 -07003130 case CrtBeginDepTag:
3131 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3132 case CrtEndDepTag:
3133 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003134 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003135 return
3136 }
3137
Colin Crossfe17f6f2019-03-28 19:30:56 -07003138 if depTag == android.ProtoPluginDepTag {
3139 return
3140 }
3141
Colin Crossd11fcda2017-10-23 17:59:01 -07003142 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003143 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3144 return
3145 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003146 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003147 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3148 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003149 return
3150 }
3151
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003152 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003153 // Skip reused objects for stub libraries, they use their own stub object file instead.
3154 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3155 // version mutator, so the stubs variant is created from the shared variant that
3156 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003157 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07003158 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3159 objs := staticAnalogue.ReuseObjects
3160 depPaths.Objs = depPaths.Objs.Append(objs)
3161 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3162 reexportExporter(depExporterInfo)
3163 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003164 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003165 }
3166
Colin Cross6e511a92020-07-27 21:26:48 -07003167 linkFile := ccDep.OutputFile()
3168
3169 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3170 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003171 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003172 return
3173 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003174
Jiyong Parke3867542020-12-03 17:28:25 +09003175 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3176 return
3177 }
3178
Colin Cross0de8a1e2020-09-18 14:15:30 -07003179 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07003180
Colin Cross6e511a92020-07-27 21:26:48 -07003181 var ptr *android.Paths
3182 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003183
Colin Cross6e511a92020-07-27 21:26:48 -07003184 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003185
Colin Cross6e511a92020-07-27 21:26:48 -07003186 switch {
3187 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08003188 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
3189 if !ctx.Config().AllowMissingDependencies() {
3190 ctx.ModuleErrorf("module %q is not a header library", depName)
3191 } else {
3192 ctx.AddMissingDependencies([]string{depName})
3193 }
3194 return
3195 }
Colin Cross6e511a92020-07-27 21:26:48 -07003196 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003197 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
3198 if !ctx.Config().AllowMissingDependencies() {
3199 ctx.ModuleErrorf("module %q is not a shared library", depName)
3200 } else {
3201 ctx.AddMissingDependencies([]string{depName})
3202 }
3203 return
3204 }
Jiyong Parke3867542020-12-03 17:28:25 +09003205
Jiyong Park7d55b612021-06-11 17:22:09 +09003206 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3207 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003208
Jiyong Park1ad8e162020-12-01 23:40:09 +09003209 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3210 // linkFile, depFile, and ptr.
3211 if c.IsStubs() {
3212 break
3213 }
3214
Colin Cross0de8a1e2020-09-18 14:15:30 -07003215 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3216 depFile = sharedLibraryInfo.TableOfContents
3217
Colin Cross6e511a92020-07-27 21:26:48 -07003218 ptr = &depPaths.SharedLibs
3219 switch libDepTag.Order {
3220 case earlyLibraryDependency:
3221 ptr = &depPaths.EarlySharedLibs
3222 depPtr = &depPaths.EarlySharedLibsDeps
3223 case normalLibraryDependency:
3224 ptr = &depPaths.SharedLibs
3225 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003226 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003227 case lateLibraryDependency:
3228 ptr = &depPaths.LateSharedLibs
3229 depPtr = &depPaths.LateSharedLibsDeps
3230 default:
3231 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003232 }
Colin Cross6e511a92020-07-27 21:26:48 -07003233 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003234 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
3235 if !ctx.Config().AllowMissingDependencies() {
3236 ctx.ModuleErrorf("module %q is not a static library", depName)
3237 } else {
3238 ctx.AddMissingDependencies([]string{depName})
3239 }
3240 return
3241 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003242
3243 // Stubs lib doesn't link to the static lib dependencies. Don't set
3244 // linkFile, depFile, and ptr.
3245 if c.IsStubs() {
3246 break
3247 }
3248
Colin Cross0de8a1e2020-09-18 14:15:30 -07003249 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3250 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003251 if libDepTag.wholeStatic {
3252 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003253 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3254 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003255 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003256 // This case normally catches prebuilt static
3257 // libraries, but it can also occur when
3258 // AllowMissingDependencies is on and the
3259 // dependencies has no sources of its own
3260 // but has a whole_static_libs dependency
3261 // on a missing library. We want to depend
3262 // on the .a file so that there is something
3263 // in the dependency tree that contains the
3264 // error rule for the missing transitive
3265 // dependency.
3266 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003267 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003268 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3269 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003270 } else {
3271 switch libDepTag.Order {
3272 case earlyLibraryDependency:
3273 panic(fmt.Errorf("early static libs not suppported"))
3274 case normalLibraryDependency:
3275 // static dependencies will be handled separately so they can be ordered
3276 // using transitive dependencies.
3277 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003278 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003279 case lateLibraryDependency:
3280 ptr = &depPaths.LateStaticLibs
3281 default:
3282 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003283 }
3284 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003285 if libDepTag.unexportedSymbols {
3286 depPaths.LdFlags = append(depPaths.LdFlags,
3287 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3288 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003289 }
3290
Colin Cross6e511a92020-07-27 21:26:48 -07003291 if libDepTag.static() && !libDepTag.wholeStatic {
3292 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3293 ctx.ModuleErrorf("module %q not a static library", depName)
3294 return
3295 }
Logan Chien43d34c32017-12-20 01:17:32 +08003296
Colin Cross6e511a92020-07-27 21:26:48 -07003297 // When combining coverage files for shared libraries and executables, coverage files
3298 // in static libraries act as if they were whole static libraries. The same goes for
3299 // source based Abi dump files.
3300 if c, ok := ccDep.(*Module); ok {
3301 staticLib := c.linker.(libraryInterface)
3302 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3303 staticLib.objs().coverageFiles...)
3304 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3305 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003306 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003307 // Handle non-CC modules here
3308 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003309 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003310 }
3311 }
3312
Colin Cross6e511a92020-07-27 21:26:48 -07003313 if ptr != nil {
3314 if !linkFile.Valid() {
3315 if !ctx.Config().AllowMissingDependencies() {
3316 ctx.ModuleErrorf("module %q missing output file", depName)
3317 } else {
3318 ctx.AddMissingDependencies([]string{depName})
3319 }
3320 return
3321 }
3322 *ptr = append(*ptr, linkFile.Path())
3323 }
3324
3325 if depPtr != nil {
3326 dep := depFile
3327 if !dep.Valid() {
3328 dep = linkFile
3329 }
3330 *depPtr = append(*depPtr, dep.Path())
3331 }
3332
Colin Cross0de8a1e2020-09-18 14:15:30 -07003333 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3334 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3335 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3336 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3337
3338 if libDepTag.reexportFlags {
3339 reexportExporter(depExporterInfo)
3340 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3341 // Re-exported shared library headers must be included as well since they can help us with type information
3342 // about template instantiations (instantiated from their headers).
3343 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
3344 // scripts.
3345 c.sabi.Properties.ReexportedIncludes = append(
3346 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3347 }
3348
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003349 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003350 switch {
3351 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003352 c.Properties.AndroidMkHeaderLibs = append(
3353 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003354 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003355 if lib := moduleLibraryInterface(dep); lib != nil {
3356 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003357 // Add the dependency to the APEX(es) providing the library so that
3358 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07003359 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09003360 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003361 c.Properties.ApexesProvidingSharedLibs = append(
3362 c.Properties.ApexesProvidingSharedLibs, an)
3363 }
3364 }
3365 }
3366
3367 // Note: the order of libs in this list is not important because
3368 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003369 c.Properties.AndroidMkSharedLibs = append(
3370 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003371 // Record BaseLibName for snapshots.
3372 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003373 case libDepTag.static():
3374 if libDepTag.wholeStatic {
3375 c.Properties.AndroidMkWholeStaticLibs = append(
3376 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3377 } else {
3378 c.Properties.AndroidMkStaticLibs = append(
3379 c.Properties.AndroidMkStaticLibs, makeLibName)
3380 }
Justin Yun5e035862021-06-29 20:50:37 +09003381 // Record BaseLibName for snapshots.
3382 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003383 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003384 } else if !c.IsStubs() {
3385 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3386
Colin Cross6e511a92020-07-27 21:26:48 -07003387 switch depTag {
3388 case runtimeDepTag:
3389 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003390 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003391 // Record BaseLibName for snapshots.
3392 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003393 case objDepTag:
3394 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3395 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003396 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003397 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003398 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003399 case dynamicLinkerDepTag:
3400 depPaths.DynamicLinker = linkFile
3401 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003402 }
Colin Crossca860ac2016-01-04 14:34:37 -08003403 })
3404
Jeff Gaston294356f2017-09-27 17:05:30 -07003405 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003406 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3407 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3408 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003409
Colin Crossdd84e052017-05-17 13:44:16 -07003410 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003411 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003412 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3413 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003414 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003415 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3416 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003417 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003418 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003419 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003420
3421 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003422 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003423 }
Colin Crossdd84e052017-05-17 13:44:16 -07003424
Colin Crossca860ac2016-01-04 14:34:37 -08003425 return depPaths
3426}
3427
Spandan Das604f3762023-03-16 22:51:40 +00003428func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003429 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003430 thisModule, ok := ctx.Module().(android.ApexModule)
3431 if !ok {
3432 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3433 }
3434
3435 useVndk := false
3436 bootstrap := false
3437 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3438 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3439 } else {
3440 useVndk = linkable.UseVndk()
3441 bootstrap = linkable.Bootstrap()
3442 }
3443
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003444 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
3445
3446 useStubs := false
3447
3448 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3449 if !apexInfo.IsForPlatform() {
3450 // For platform libraries, use current version of LLNDK
3451 // If this is for use_vendor apex we will apply the same rules
3452 // of apex sdk enforcement below to choose right version.
3453 useStubs = true
3454 }
3455 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3456 // If not building for APEX or the containing APEX allows the use of
3457 // platform APIs, use stubs only when it is from an APEX (and not from
3458 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3459 // bootstrap modules, always link to non-stub variant
3460 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3461
3462 isApexImportedApiLibrary := false
3463
3464 if cc, ok := dep.(*Module); ok {
3465 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3466 if apiLibrary.hasApexStubs() {
3467 isApexImportedApiLibrary = true
3468 }
3469 }
3470 }
3471
3472 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3473
3474 if useStubs {
3475 // Another exception: if this module is a test for an APEX, then
3476 // it is linked with the non-stub variant of a module in the APEX
3477 // as if this is part of the APEX.
3478 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
3479 for _, apexContents := range testFor.ApexContents {
3480 if apexContents.DirectlyInApex(depName) {
3481 useStubs = false
3482 break
3483 }
3484 }
3485 }
3486 if useStubs {
3487 // Yet another exception: If this module and the dependency are
3488 // available to the same APEXes then skip stubs between their
3489 // platform variants. This complements the test_for case above,
3490 // which avoids the stubs on a direct APEX library dependency, by
3491 // avoiding stubs for indirect test dependencies as well.
3492 //
3493 // TODO(b/183882457): This doesn't work if the two libraries have
3494 // only partially overlapping apex_available. For that test_for
3495 // modules would need to be split into APEX variants and resolved
3496 // separately for each APEX they have access to.
3497 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3498 useStubs = false
3499 }
3500 }
3501 } else {
3502 // If building for APEX, use stubs when the parent is in any APEX that
3503 // the child is not in.
3504 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3505 }
3506
3507 return useStubs
3508}
3509
3510// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3511// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3512// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3513// has different level of updatability. For example, if a library foo in an APEX depends on a
3514// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3515// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3516// same APEX as foo, the non-stub variant of bar is used.
3517func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3518 depTag := ctx.OtherModuleDependencyTag(dep)
3519 libDepTag, ok := depTag.(libraryDependencyTag)
3520 if !ok || !libDepTag.shared() {
3521 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3522 }
3523
Jiyong Park7d55b612021-06-11 17:22:09 +09003524 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
3525 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3526 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Jiyong Park7d55b612021-06-11 17:22:09 +09003527
3528 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003529 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003530 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003531 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3532 toUse := stubs[len(stubs)-1]
3533 sharedLibraryInfo = toUse.SharedLibraryInfo
3534 depExporterInfo = toUse.FlagExporterInfo
3535 }
3536 }
3537 return sharedLibraryInfo, depExporterInfo
3538}
3539
Colin Cross0de8a1e2020-09-18 14:15:30 -07003540// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3541// to match the topological order of the dependency tree, including any static analogues of
3542// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3543// of the transitive dependencies.
3544func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet) {
3545 transitiveStaticLibsBuilder := android.NewDepSetBuilder(android.TOPOLOGICAL)
3546 var staticPaths android.Paths
3547 for _, staticDep := range staticDeps {
3548 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3549 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3550 }
3551 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003552 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3553 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003554 }
3555 }
3556 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3557
3558 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3559
3560 // reorder the dependencies based on transitive dependencies
3561 staticPaths = android.FirstUniquePaths(staticPaths)
3562 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3563
3564 if len(orderedStaticPaths) != len(staticPaths) {
3565 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3566 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3567 }
3568
3569 return orderedStaticPaths, transitiveStaticLibs
3570}
3571
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003572// BaseLibName trims known prefixes and suffixes
3573func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003574 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3575 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003576 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003577 return libName
3578}
3579
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003580func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003581 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003582 ccDepModule, _ := ccDep.(*Module)
3583 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003584 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003585
Justin Yuncbca3732021-02-03 19:24:13 +09003586 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003587 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003588 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003589 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003590
Ivan Lozanod1dec542021-05-26 15:33:11 -04003591 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003592 }
3593 }
3594
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003595 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3596 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003597 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3598 // core module instead.
3599 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003600 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003601 // The vendor and product modules in Make will have been renamed to not conflict with the
3602 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003603 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003604 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003605 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003606 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003607 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003608 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003609 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003610 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003611 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003612 } else {
3613 return libName
3614 }
3615}
3616
Colin Crossca860ac2016-01-04 14:34:37 -08003617func (c *Module) InstallInData() bool {
3618 if c.installer == nil {
3619 return false
3620 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003621 return c.installer.inData()
3622}
3623
3624func (c *Module) InstallInSanitizerDir() bool {
3625 if c.installer == nil {
3626 return false
3627 }
3628 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003629 return true
3630 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003631 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003632}
3633
Yifan Hong1b3348d2020-01-21 15:53:22 -08003634func (c *Module) InstallInRamdisk() bool {
3635 return c.InRamdisk()
3636}
3637
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003638func (c *Module) InstallInVendorRamdisk() bool {
3639 return c.InVendorRamdisk()
3640}
3641
Jiyong Parkf9332f12018-02-01 00:54:12 +09003642func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003643 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003644}
3645
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003646func (c *Module) MakeUninstallable() {
3647 if c.installer == nil {
3648 c.ModuleBase.MakeUninstallable()
3649 return
3650 }
3651 c.installer.makeUninstallable(c)
3652}
3653
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003654func (c *Module) HostToolPath() android.OptionalPath {
3655 if c.installer == nil {
3656 return android.OptionalPath{}
3657 }
3658 return c.installer.hostToolPath()
3659}
3660
Nan Zhangd4e641b2017-07-12 12:55:28 -07003661func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3662 return c.outputFile
3663}
3664
Colin Cross41955e82019-05-29 14:40:35 -07003665func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3666 switch tag {
3667 case "":
3668 if c.outputFile.Valid() {
3669 return android.Paths{c.outputFile.Path()}, nil
3670 }
3671 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003672 case "unstripped":
3673 if c.linker != nil {
3674 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3675 }
3676 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003677 default:
3678 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003679 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003680}
3681
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003682func (c *Module) static() bool {
3683 if static, ok := c.linker.(interface {
3684 static() bool
3685 }); ok {
3686 return static.static()
3687 }
3688 return false
3689}
3690
Jiyong Park379de2f2018-12-19 02:47:14 +09003691func (c *Module) staticBinary() bool {
3692 if static, ok := c.linker.(interface {
3693 staticBinary() bool
3694 }); ok {
3695 return static.staticBinary()
3696 }
3697 return false
3698}
3699
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003700func (c *Module) testBinary() bool {
3701 if test, ok := c.linker.(interface {
3702 testBinary() bool
3703 }); ok {
3704 return test.testBinary()
3705 }
3706 return false
3707}
3708
Jingwen Chen537242c2022-08-24 11:53:27 +00003709func (c *Module) testLibrary() bool {
3710 if test, ok := c.linker.(interface {
3711 testLibrary() bool
3712 }); ok {
3713 return test.testLibrary()
3714 }
3715 return false
3716}
3717
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003718func (c *Module) benchmarkBinary() bool {
3719 if b, ok := c.linker.(interface {
3720 benchmarkBinary() bool
3721 }); ok {
3722 return b.benchmarkBinary()
3723 }
3724 return false
3725}
3726
3727func (c *Module) fuzzBinary() bool {
3728 if f, ok := c.linker.(interface {
3729 fuzzBinary() bool
3730 }); ok {
3731 return f.fuzzBinary()
3732 }
3733 return false
3734}
3735
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003736// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3737func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003738 if h, ok := c.linker.(interface {
3739 header() bool
3740 }); ok {
3741 return h.header()
3742 }
3743 return false
3744}
3745
Ivan Lozanod7586b62021-04-01 09:49:36 -04003746func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003747 if b, ok := c.linker.(interface {
3748 binary() bool
3749 }); ok {
3750 return b.binary()
3751 }
3752 return false
3753}
3754
Justin Yun5e035862021-06-29 20:50:37 +09003755func (c *Module) StaticExecutable() bool {
3756 if b, ok := c.linker.(*binaryDecorator); ok {
3757 return b.static()
3758 }
3759 return false
3760}
3761
Ivan Lozanod7586b62021-04-01 09:49:36 -04003762func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003763 if o, ok := c.linker.(interface {
3764 object() bool
3765 }); ok {
3766 return o.object()
3767 }
3768 return false
3769}
3770
Ivan Lozanof9e21722020-12-02 09:00:51 -05003771func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003772 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003773 if c.IsLlndk() {
3774 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003775 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003776 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003777 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003778 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003779 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003780 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003781 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003782 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003783 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003784 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003785 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003786 return "native:product"
3787 }
Jooyung Han38002912019-05-16 04:01:54 +09003788 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003789 } else if c.InRamdisk() {
3790 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003791 } else if c.InVendorRamdisk() {
3792 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003793 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003794 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003795 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003796 return "native:ndk:none:none"
3797 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3798 //family, link := getNdkStlFamilyAndLinkType(c)
3799 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003800 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003801 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003802 } else {
3803 return "native:platform"
3804 }
3805}
3806
Jiyong Park9d452992018-10-03 00:38:19 +09003807// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003808// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003809func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003810 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003811 // Stub libs and prebuilt libs in a versioned SDK are not
3812 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003813 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003814 } else if _, ok := c.linker.(testPerSrc); ok {
3815 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003816 }
3817 return false
3818}
3819
Jiyong Parka90ca002019-10-07 15:47:24 +09003820func (c *Module) AvailableFor(what string) bool {
3821 if linker, ok := c.linker.(interface {
3822 availableFor(string) bool
3823 }); ok {
3824 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3825 } else {
3826 return c.ApexModuleBase.AvailableFor(what)
3827 }
3828}
3829
Jiyong Park62304bb2020-04-13 16:19:48 +09003830func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003831 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003832}
3833
Paul Duffin0cb37b92020-03-04 14:52:46 +00003834func (c *Module) EverInstallable() bool {
3835 return c.installer != nil &&
3836 // Check to see whether the module is actually ever installable.
3837 c.installer.everInstallable()
3838}
3839
Ivan Lozanod7586b62021-04-01 09:49:36 -04003840func (c *Module) PreventInstall() bool {
3841 return c.Properties.PreventInstall
3842}
3843
3844func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003845 if c.library != nil {
3846 if i := c.library.installable(); i != nil {
3847 return i
3848 }
3849 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003850 return c.Properties.Installable
3851}
3852
3853func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003854 ret := c.EverInstallable() &&
3855 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003856 proptools.BoolDefault(c.Installable(), true) &&
3857 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003858
3859 // The platform variant doesn't need further condition. Apex variants however might not
3860 // be installable because it will likely to be included in the APEX and won't appear
3861 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003862 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003863 return ret
3864 }
3865
3866 // Special case for modules that are configured to be installed to /data, which includes
3867 // test modules. For these modules, both APEX and non-APEX variants are considered as
3868 // installable. This is because even the APEX variants won't be included in the APEX, but
3869 // will anyway be installed to /data/*.
3870 // See b/146995717
3871 if c.InstallInData() {
3872 return ret
3873 }
3874
3875 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003876}
3877
Logan Chien41eabe62019-04-10 13:33:58 +08003878func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3879 if c.linker != nil {
3880 if library, ok := c.linker.(*libraryDecorator); ok {
3881 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3882 }
3883 }
3884}
3885
Jiyong Park45bf82e2020-12-15 22:29:02 +09003886var _ android.ApexModule = (*Module)(nil)
3887
3888// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003889func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003890 depTag := ctx.OtherModuleDependencyTag(dep)
3891 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3892
3893 if cc, ok := dep.(*Module); ok {
3894 if cc.HasStubsVariants() {
3895 if isLibDepTag && libDepTag.shared() {
3896 // dynamic dep to a stubs lib crosses APEX boundary
3897 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003898 }
Colin Cross6e511a92020-07-27 21:26:48 -07003899 if IsRuntimeDepTag(depTag) {
3900 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003901 return false
3902 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003903 }
Zhijun Heec285872021-04-24 10:47:08 -07003904 if cc.IsLlndk() {
3905 return false
3906 }
Colin Crossaac32222020-07-29 12:51:56 -07003907 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003908 // shared_lib dependency from a static lib is considered as crossing
3909 // the APEX boundary because the dependency doesn't actually is
3910 // linked; the dependency is used only during the compilation phase.
3911 return false
3912 }
Jiyong Parke3867542020-12-03 17:28:25 +09003913
3914 if isLibDepTag && libDepTag.excludeInApex {
3915 return false
3916 }
Colin Cross6e511a92020-07-27 21:26:48 -07003917 }
Colin Crossc1b36442021-05-06 13:42:48 -07003918 if depTag == stubImplDepTag {
3919 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003920 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003921 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003922 if depTag == staticVariantTag {
3923 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3924 // actually mean that the static lib (and its dependencies) are copied into the
3925 // APEX.
3926 return false
3927 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003928 return true
3929}
3930
Jiyong Park45bf82e2020-12-15 22:29:02 +09003931// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003932func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3933 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003934 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3935 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3936 return nil
3937 }
Jooyung Han749dc692020-04-15 11:03:39 +09003938 // We don't check for prebuilt modules
3939 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3940 return nil
3941 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003942
Jooyung Han749dc692020-04-15 11:03:39 +09003943 minSdkVersion := c.MinSdkVersion()
3944 if minSdkVersion == "apex_inherit" {
3945 return nil
3946 }
3947 if minSdkVersion == "" {
3948 // JNI libs within APK-in-APEX fall into here
3949 // Those are okay to set sdk_version instead
3950 // We don't have to check if this is a SDK variant because
3951 // non-SDK variant resets sdk_version, which works too.
3952 minSdkVersion = c.SdkVersion()
3953 }
Dan Albertc8060532020-07-22 22:32:17 -07003954 if minSdkVersion == "" {
3955 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3956 }
3957 // Not using nativeApiLevelFromUser because the context here is not
3958 // necessarily a native context.
3959 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003960 if err != nil {
3961 return err
3962 }
Dan Albertc8060532020-07-22 22:32:17 -07003963
Colin Cross8ca61c12022-10-06 21:00:14 -07003964 // A dependency only needs to support a min_sdk_version at least
3965 // as high as the api level that the architecture was introduced in.
3966 // This allows introducing new architectures in the platform that
3967 // need to be included in apexes that normally require an older
3968 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08003969 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07003970 if sdkVersion.LessThan(minApiForArch) {
3971 sdkVersion = minApiForArch
3972 }
3973
Dan Albertc8060532020-07-22 22:32:17 -07003974 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003975 return fmt.Errorf("newer SDK(%v)", ver)
3976 }
3977 return nil
3978}
3979
Paul Duffinb5769c12021-05-12 16:16:51 +01003980// Implements android.ApexModule
3981func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3982 // stub libraries and native bridge libraries are always available to platform
3983 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3984}
3985
Jooyung Han91f92032022-02-04 12:36:33 +09003986// Overrides android.ApexModuleBase.UniqueApexVariations
3987func (c *Module) UniqueApexVariations() bool {
3988 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
3989 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
3990 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09003991 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09003992 return c.UseVndk() && c.IsVndk()
3993}
3994
Inseob Kima1888ce2022-10-04 14:42:02 +09003995func (c *Module) overriddenModules() []string {
3996 if o, ok := c.linker.(overridable); ok {
3997 return o.overriddenModules()
3998 }
3999 return nil
4000}
4001
Rob Seymour925aa092021-08-10 20:42:03 +00004002var _ snapshot.RelativeInstallPath = (*Module)(nil)
4003
Liz Kammer35ca77e2021-12-22 15:31:40 -05004004type moduleType int
4005
4006const (
4007 unknownType moduleType = iota
4008 binary
4009 object
4010 fullLibrary
4011 staticLibrary
4012 sharedLibrary
4013 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004014 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004015 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004016)
4017
4018func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004019 if c.testBinary() {
4020 // testBinary is also a binary, so this comes before the c.Binary()
4021 // conditional. A testBinary has additional implicit dependencies and
4022 // other test-only semantics.
4023 return testBin
4024 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004025 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004026 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004027 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004028 } else if c.testLibrary() {
4029 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4030 // will let them add implicit compile deps on gtest, for example.
4031 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004032 // For now, treat them as regular libraries.
4033 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004034 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004035 static := false
4036 shared := false
4037 if library, ok := c.linker.(*libraryDecorator); ok {
4038 static = library.MutatedProperties.BuildStatic
4039 shared = library.MutatedProperties.BuildShared
4040 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4041 static = library.MutatedProperties.BuildStatic
4042 shared = library.MutatedProperties.BuildShared
4043 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004044 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004045 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004046 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004047 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004048 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004049 return staticLibrary
4050 }
4051 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004052 } else if c.isNDKStubLibrary() {
4053 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004054 }
4055 return unknownType
4056}
4057
4058// ConvertWithBp2build converts Module to Bazel for bp2build.
4059func (c *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
4060 prebuilt := c.IsPrebuilt()
4061 switch c.typ() {
4062 case binary:
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxb12ff592022-09-01 15:04:04 +00004063 if prebuilt {
4064 prebuiltBinaryBp2Build(ctx, c)
4065 } else {
Jingwen Chen537242c2022-08-24 11:53:27 +00004066 binaryBp2build(ctx, c)
4067 }
4068 case testBin:
4069 if !prebuilt {
4070 testBinaryBp2build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004071 }
4072 case object:
Colin Crossc5075e92022-12-05 16:46:39 -08004073 if prebuilt {
4074 prebuiltObjectBp2Build(ctx, c)
4075 } else {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004076 objectBp2Build(ctx, c)
4077 }
4078 case fullLibrary:
4079 if !prebuilt {
4080 libraryBp2Build(ctx, c)
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004081 } else {
4082 prebuiltLibraryBp2Build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004083 }
4084 case headerLibrary:
4085 libraryHeadersBp2Build(ctx, c)
4086 case staticLibrary:
Liz Kammer35ca77e2021-12-22 15:31:40 -05004087 if prebuilt {
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004088 prebuiltLibraryStaticBp2Build(ctx, c, false)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004089 } else {
4090 sharedOrStaticLibraryBp2Build(ctx, c, true)
4091 }
4092 case sharedLibrary:
4093 if prebuilt {
4094 prebuiltLibrarySharedBp2Build(ctx, c)
4095 } else {
4096 sharedOrStaticLibraryBp2Build(ctx, c, false)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004097 }
Spandan Das8b4a5f32022-09-29 00:28:24 +00004098 }
4099}
4100
4101var _ android.ApiProvider = (*Module)(nil)
4102
4103func (c *Module) ConvertWithApiBp2build(ctx android.TopDownMutatorContext) {
Spandan Das4238c652022-09-09 01:38:47 +00004104 if c.IsPrebuilt() {
4105 return
4106 }
Spandan Das8b4a5f32022-09-29 00:28:24 +00004107 switch c.typ() {
Spandan Das4238c652022-09-09 01:38:47 +00004108 case fullLibrary:
4109 apiContributionBp2Build(ctx, c)
4110 case sharedLibrary:
4111 apiContributionBp2Build(ctx, c)
4112 case headerLibrary:
4113 // Aggressively generate api targets for all header modules
4114 // This is necessary since the header module does not know if it is a dep of API surface stub library
4115 apiLibraryHeadersBp2Build(ctx, c)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004116 }
4117}
4118
Colin Crosscfad1192015-11-02 16:43:11 -08004119// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004120type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004121 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004122 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004123 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004124}
4125
Patrice Arrudac249c712019-03-19 17:00:29 -07004126// cc_defaults provides a set of properties that can be inherited by other cc
4127// modules. A module can use the properties from a cc_defaults using
4128// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4129// merged (when possible) by prepending the default module's values to the
4130// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004131func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004132 return DefaultsFactory()
4133}
4134
Colin Cross36242852017-06-23 15:06:31 -07004135func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004136 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004137
Colin Cross36242852017-06-23 15:06:31 -07004138 module.AddProperties(props...)
4139 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004140 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004141 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004142 &BaseCompilerProperties{},
4143 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004144 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004145 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004146 &StaticProperties{},
4147 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004148 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004149 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004150 &TestLinkerProperties{},
4151 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004152 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004153 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004154 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004155 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004156 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004157 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004158 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004159 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004160 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004161 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004162 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004163 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004164 &AfdoProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07004165 &PgoProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004166 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004167 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4168 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004169 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004170 )
Colin Crosscfad1192015-11-02 16:43:11 -08004171
Jooyung Hancc372c52019-09-25 15:18:44 +09004172 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004173
4174 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004175}
4176
Jiyong Park2286afd2020-06-16 21:58:53 +09004177func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004178 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004179}
4180
Kiyoung Kim51279d32022-08-24 14:10:46 +09004181func (c *Module) isImportedApiLibrary() bool {
4182 _, ok := c.linker.(*apiLibraryDecorator)
4183 return ok
4184}
4185
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004186func kytheExtractAllFactory() android.Singleton {
4187 return &kytheExtractAllSingleton{}
4188}
4189
4190type kytheExtractAllSingleton struct {
4191}
4192
4193func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4194 var xrefTargets android.Paths
4195 ctx.VisitAllModules(func(module android.Module) {
4196 if ccModule, ok := module.(xref); ok {
4197 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4198 }
4199 })
4200 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4201 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004202 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004203 }
4204}
4205
Jihoon Kangf78a8902022-09-01 22:47:07 +00004206func (c *Module) Partition() string {
4207 if p, ok := c.installer.(interface {
4208 getPartition() string
4209 }); ok {
4210 return p.getPartition()
4211 }
4212 return ""
4213}
4214
Colin Cross06a931b2015-10-28 17:23:31 -07004215var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004216var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004217var BoolPtr = proptools.BoolPtr
4218var String = proptools.String
4219var StringPtr = proptools.StringPtr