blob: b6f12ad02c8fef6f4329521ae547da74b233c902 [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
Aditya Choudhary87b2ab22023-11-17 15:27:06 +000027 "android/soong/testing"
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +090028
Colin Cross97ba0732015-03-23 17:50:24 -070029 "github.com/google/blueprint"
Colin Cross06a931b2015-10-28 17:23:31 -070030 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070031
Vinh Tran367d89d2023-04-28 11:21:25 -040032 "android/soong/aidl_library"
Colin Cross635c3b02016-05-18 15:37:25 -070033 "android/soong/android"
Colin Crossb98c8b02016-07-29 13:44:28 -070034 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070035 "android/soong/fuzz"
Colin Cross5049f022015-03-18 13:28:46 -070036 "android/soong/genrule"
Kiyoung Kim487689e2022-07-26 09:48:22 +090037 "android/soong/multitree"
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
Inseob Kim3b244062023-07-11 13:31:36 +090043 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +000044 pctx.Import("android/soong/cc/config")
45}
46
47func RegisterCCBuildComponents(ctx android.RegistrationContext) {
48 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
49
50 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossc511bc52020-04-07 16:50:32 +000051 ctx.BottomUp("sdk", sdkMutator).Parallel()
Inseob Kim64c43952019-08-26 16:52:35 +090052 ctx.BottomUp("vndk", VndkMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070053 ctx.BottomUp("link", LinkageMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +010054 ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
Colin Crossd1f898e2020-08-18 18:35:15 -070055 ctx.BottomUp("version", versionMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070056 ctx.BottomUp("begin", BeginMutator).Parallel()
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
Colin Crossf5f4ad32024-01-19 15:41:48 -080069 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -070070
Colin Crossd38feb02024-01-23 16:38:06 -080071 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +080072
Colin Cross33e0c812024-01-23 16:36:07 -080073 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +000074
Colin Cross6ac83a82024-01-23 11:23:10 -080075 ctx.Transition("lto", &ltoTransitionMutator{})
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
Jooyung Han9ffbe832023-11-28 22:31:35 +0900137 // List of libs that need to be excluded for non-APEX variant
138 ExcludeLibsForNonApex []string
Colin Crossc472d572015-03-17 15:06:21 -0700139}
140
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500141// PathDeps is a struct containing file paths to dependencies of a module.
142// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
143// It's used to construct flags for various build statements (such as for compiling and linking).
144// It is then passed to module decorator functions responsible for registering build statements
145// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800146type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700147 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900148 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700149 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900150 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700151 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700152 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700153
Colin Cross0de8a1e2020-09-18 14:15:30 -0700154 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossc85750b2022-04-21 12:50:51 -0700155 TranstiveStaticLibrariesForOrdering *android.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700156
Colin Cross26c34ed2016-09-30 17:10:16 -0700157 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100158 Objs Objects
159 // Paths to .o files in dependencies that provide them. Note that these lists
160 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800161 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700162 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700163
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100164 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
165 // the libs from all whole_static_lib dependencies.
166 WholeStaticLibsFromPrebuilts android.Paths
167
Colin Cross26c34ed2016-09-30 17:10:16 -0700168 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700169 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900170 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700171
Inseob Kimd110f872019-12-06 13:15:38 +0900172 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000173 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900174 IncludeDirs android.Paths
175 SystemIncludeDirs android.Paths
176 ReexportedDirs android.Paths
177 ReexportedSystemDirs android.Paths
178 ReexportedFlags []string
179 ReexportedGeneratedHeaders android.Paths
180 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700181
Colin Cross26c34ed2016-09-30 17:10:16 -0700182 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700183 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700184
Dan Willemsena0790e32018-10-12 00:24:23 -0700185 // Path to the dynamic linker binary
186 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700187
188 // For Darwin builds, the path to the second architecture's output that should
189 // be combined with this architectures's output into a FAT MachO file.
190 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400191
192 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
193 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700194}
195
Colin Cross4af21ed2019-11-04 09:37:55 -0800196// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
197// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
198// command line so they can be overridden by the local module flags).
199type LocalOrGlobalFlags struct {
200 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700201 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800202 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700203 CFlags []string // Flags that apply to C and C++ source files
204 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
205 ConlyFlags []string // Flags that apply to C source files
206 CppFlags []string // Flags that apply to C++ source files
207 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700208 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800209}
210
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500211// Flags contains various types of command line flags (and settings) for use in building build
212// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800213type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500214 // Local flags (which individual modules are responsible for). These may override global flags.
215 Local LocalOrGlobalFlags
216 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700217 Global LocalOrGlobalFlags
218 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800219
220 aidlFlags []string // Flags that apply to aidl source files
221 rsFlags []string // Flags that apply to renderscript source files
222 libFlags []string // Flags to add libraries early to the link order
223 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
224 TidyFlags []string // Flags that apply to clang-tidy
225 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700226
Colin Crossc3199482017-03-30 15:03:04 -0700227 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800228 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700229 SystemIncludeFlags []string
230
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800231 Toolchain config.Toolchain
232 Tidy bool // True if ninja .tidy rules should be generated.
233 NeedTidyFiles bool // True if module link should depend on .tidy files
234 GcovCoverage bool // True if coverage files should be generated.
235 SAbiDump bool // True if header abi dumps should be generated.
236 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800237
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500238 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800239 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500240 // The target-device system path to the dynamic linker.
241 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800242
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700243 CFlagsDeps android.Paths // Files depended on by compiler flags
244 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800245
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500246 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700247 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800248
Colin Cross19878da2019-03-28 14:45:07 -0700249 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700250 protoC bool // Whether to use C instead of C++
251 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700252
253 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200254 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700255}
256
Colin Crossca860ac2016-01-04 14:34:37 -0800257// Properties used to compile all C or C++ modules
258type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700259 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800260 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700261
Jiyong Parkb35a8192020-08-10 15:59:36 +0900262 // The API level that this module is built against. The APIs of this API level will be
263 // visible at build time, but use of any APIs newer than min_sdk_version will render the
264 // module unloadable on older devices. In the future it will be possible to weakly-link new
265 // APIs, making the behavior match Java: such modules will load on older devices, but
266 // calling new APIs on devices that do not support them will result in a crash.
267 //
268 // This property has the same behavior as sdk_version does for Java modules. For those
269 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
270 // does for Java code.
271 //
272 // In addition, setting this property causes two variants to be built, one for the platform
273 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800274 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700275
Jiyong Parkb35a8192020-08-10 15:59:36 +0900276 // Minimum OS API level supported by this C or C++ module. This property becomes the value
277 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
278 // this property is also used to ensure that the min_sdk_version of the containing module is
279 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
280 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
281 // min_sdk_version of the containing APEX. When the module
282 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900283 Min_sdk_version *string
284
Colin Crossc511bc52020-04-07 16:50:32 +0000285 // If true, always create an sdk variant and don't create a platform variant.
286 Sdk_variant_only *bool
287
Jiyong Parkde866cb2018-12-07 23:08:36 +0900288 AndroidMkSharedLibs []string `blueprint:"mutated"`
289 AndroidMkStaticLibs []string `blueprint:"mutated"`
290 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
291 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700292 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900293 HideFromMake bool `blueprint:"mutated"`
294 PreventInstall bool `blueprint:"mutated"`
295 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700296
Yo Chiang219968c2020-09-22 18:45:04 +0800297 // Set by DepsMutator.
298 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
299
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900300 // The name of the image this module is built for
301 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200302
303 // The VNDK version this module is built against. If empty, the module is not
304 // build against the VNDK.
305 VndkVersion string `blueprint:"mutated"`
306
307 // Suffix for the name of Android.mk entries generated by this module
308 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800309
310 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
311 // file
312 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900313
Yifan Hong39143a92020-10-26 12:43:12 -0700314 // Make this module available when building for ramdisk.
315 // On device without a dedicated recovery partition, the module is only
316 // available after switching root into
317 // /first_stage_ramdisk. To expose the module before switching root, install
318 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800319 Ramdisk_available *bool
320
Yifan Hong39143a92020-10-26 12:43:12 -0700321 // Make this module available when building for vendor ramdisk.
322 // On device without a dedicated recovery partition, the module is only
323 // available after switching root into
324 // /first_stage_ramdisk. To expose the module before switching root, install
325 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700326 Vendor_ramdisk_available *bool
327
Jiyong Parkf9332f12018-02-01 00:54:12 +0900328 // Make this module available when building for recovery
329 Recovery_available *bool
330
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200331 // Used by imageMutator, set by ImageMutatorBegin()
332 CoreVariantNeeded bool `blueprint:"mutated"`
333 RamdiskVariantNeeded bool `blueprint:"mutated"`
334 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
335 RecoveryVariantNeeded bool `blueprint:"mutated"`
336
337 // A list of variations for the "image" mutator of the form
338 //<image name> '.' <version char>, for example, 'vendor.S'
339 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900340
341 // Allows this module to use non-APEX version of libraries. Useful
342 // for building binaries that are started before APEXes are activated.
343 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900344
345 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
346 // see soong/cc/config/vndk.go
347 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900348
Colin Cross1bc94122021-10-28 13:25:54 -0700349 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000350
351 // Set by factories of module types that can only be referenced from variants compiled against
352 // the SDK.
353 AlwaysSdk bool `blueprint:"mutated"`
354
355 // Variant is an SDK variant created by sdkMutator
356 IsSdkVariant bool `blueprint:"mutated"`
357 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
358 // variant to have a ".sdk" suffix.
359 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700360
Jiyong Park46a512f2020-12-04 18:02:13 +0900361 // List of APEXes that this module has private access to for testing purpose. The module
362 // can depend on libraries that are not exported by the APEXes and use private symbols
363 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000364 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800365
366 Target struct {
367 Platform struct {
368 // List of modules required by the core variant.
369 Required []string `android:"arch_variant"`
370
371 // List of modules not required by the core variant.
372 Exclude_required []string `android:"arch_variant"`
373 } `android:"arch_variant"`
374
375 Recovery struct {
376 // List of modules required by the recovery variant.
377 Required []string `android:"arch_variant"`
378
379 // List of modules not required by the recovery variant.
380 Exclude_required []string `android:"arch_variant"`
381 } `android:"arch_variant"`
382 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700383}
384
385type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900386 // whether this module should be allowed to be directly depended by other
387 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900388 // If set to true, two variants will be built separately, one like
389 // normal, and the other limited to the set of libraries and headers
390 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700391 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900392 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700393 // so it shouldn't have any unversioned runtime dependencies, or
394 // make assumptions about the system that may not be true in the
395 // future.
396 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900397 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900398 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900399 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900400 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900401 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700402 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
403 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900404
Justin Yunebcf0c52021-01-08 18:00:19 +0900405 // This is the same as the "vendor_available" except that the install path
406 // of the vendor variant is /odm or /vendor/odm.
407 // By replacing "vendor_available: true" with "odm_available: true", the
408 // module will install its vendor variant to the /odm partition or /vendor/odm.
409 // As the modules with "odm_available: true" still create the vendor variants,
410 // they can link to the other vendor modules as the vendor_available modules do.
411 // Also, the vendor modules can link to odm_available modules.
412 //
413 // It may not be used for VNDK modules.
414 Odm_available *bool
415
Justin Yun63e9ec72020-10-29 16:49:43 +0900416 // whether this module should be allowed to be directly depended by other
417 // modules with `product_specific: true` or `product_available: true`.
418 // If set to true, an additional product variant will be built separately
419 // that is limited to the set of libraries and headers that are exposed to
420 // /product modules.
421 //
422 // The product variant may be used with a different (newer) /system,
423 // so it shouldn't have any unversioned runtime dependencies, or
424 // make assumptions about the system that may not be true in the
425 // future.
426 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900427 // If set to false, this module becomes inaccessible from /product modules.
428 //
429 // Different from the 'vendor_available' property, the modules with
430 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
431 // library without 'product_available' may not be depended on by any other
432 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900433 //
434 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
435 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
436 Product_available *bool
437
Jiyong Park5fb8c102018-04-09 12:03:06 +0900438 // whether this module is capable of being loaded with other instance
439 // (possibly an older version) of the same module in the same process.
440 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
441 // can be double loaded in a vendor process if the library is also a
442 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
443 // explicitly marked as `double_loadable: true` by the owner, or the dependency
444 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
445 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800446
447 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
448 IsLLNDK bool `blueprint:"mutated"`
449
Colin Cross78212242021-01-06 14:51:30 -0800450 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
451 // set and the module is not listed in VndkMustUseVendorVariantList.
452 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
453
454 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
455 IsVNDKCore bool `blueprint:"mutated"`
456
457 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
458 IsVNDKSP bool `blueprint:"mutated"`
459
460 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
461 // module sets the llndk.private property.
462 IsVNDKPrivate bool `blueprint:"mutated"`
463
464 // IsVNDKProduct is set if a VNDK module sets the product_available property.
465 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700466
467 // IsVendorPublicLibrary is set for the core and product variants of a library that has
468 // vendor_public_library stubs.
469 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800470}
471
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500472// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
473// to understanding details about the type of the current module.
474// For example, one might call these functions to determine whether the current module is a static
475// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800476type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800477 static() bool
478 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700479 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800480 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900481 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900482 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900483 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700484 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900485 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700486 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800487 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900488 minSdkVersion() string
489 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700490 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700491 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800492 IsLlndk() bool
493 IsLlndkPublic() bool
494 isImplementationForLLNDKPublic() bool
495 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900496 isVndk() bool
497 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500498 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700499 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900500 inProduct() bool
501 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800502 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700503 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900504 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900505 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700506 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700507 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800508 getVndkExtendsModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800509 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000510 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800511 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900512 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800513 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800514 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800515 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700516 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700517 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900518 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800519 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700520 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700521 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800522 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800523 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800524 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800525 notInPlatform() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800526}
527
528type SharedFlags struct {
529 numSharedFlags int
530 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800531}
532
533type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700534 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800535 ModuleContextIntf
536}
537
538type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700539 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800540 ModuleContextIntf
541}
542
Colin Cross37047f12016-12-13 17:06:13 -0800543type DepsContext interface {
544 android.BottomUpMutatorContext
545 ModuleContextIntf
546}
547
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500548// feature represents additional (optional) steps to building cc-related modules, such as invocation
549// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800550type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800551 flags(ctx ModuleContext, flags Flags) Flags
552 props() []interface{}
553}
554
Joe Onorato37f900c2023-07-18 16:58:16 -0700555// Information returned from Generator about the source code it's generating
556type GeneratedSource struct {
557 IncludeDirs android.Paths
558 Sources android.Paths
559 Headers android.Paths
560 ReexportedDirs android.Paths
561}
562
563// generator allows injection of generated code
564type Generator interface {
565 GeneratorProps() []interface{}
566 GeneratorInit(ctx BaseModuleContext)
567 GeneratorDeps(ctx DepsContext, deps Deps) Deps
568 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
569 GeneratorSources(ctx ModuleContext) GeneratedSource
570 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
571}
572
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500573// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500574// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800575type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700576 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800577 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800578 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700579 compilerProps() []interface{}
580
Colin Cross76fada02016-07-27 10:31:13 -0700581 appendCflags([]string)
582 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700583 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800584}
585
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500586// linker is the interface for a linker decorator object. Individual module types can provide
587// their own implementation for this decorator, and thus specify custom logic regarding build
588// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800589type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700590 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800591 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700592 linkerFlags(ctx ModuleContext, flags Flags) Flags
593 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800594 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700595
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700596 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700597 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900598 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800599 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700600
601 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900602 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000603
604 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000605 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800606
607 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000608}
609
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500610// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000611type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500612 sharedLibs []string
613 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
614 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700615 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800616}
617
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500618// installer is the interface for an installer helper object. This helper is responsible for
619// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800620type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700621 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700622 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000623 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800624 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700625 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700626 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900627 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000628 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900629 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800630}
631
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800632type xref interface {
633 XrefCcFiles() android.Paths
634}
635
Inseob Kima1888ce2022-10-04 14:42:02 +0900636type overridable interface {
637 overriddenModules() []string
638}
639
Colin Cross6e511a92020-07-27 21:26:48 -0700640type libraryDependencyKind int
641
642const (
643 headerLibraryDependency = iota
644 sharedLibraryDependency
645 staticLibraryDependency
646)
647
648func (k libraryDependencyKind) String() string {
649 switch k {
650 case headerLibraryDependency:
651 return "headerLibraryDependency"
652 case sharedLibraryDependency:
653 return "sharedLibraryDependency"
654 case staticLibraryDependency:
655 return "staticLibraryDependency"
656 default:
657 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
658 }
659}
660
661type libraryDependencyOrder int
662
663const (
664 earlyLibraryDependency = -1
665 normalLibraryDependency = 0
666 lateLibraryDependency = 1
667)
668
669func (o libraryDependencyOrder) String() string {
670 switch o {
671 case earlyLibraryDependency:
672 return "earlyLibraryDependency"
673 case normalLibraryDependency:
674 return "normalLibraryDependency"
675 case lateLibraryDependency:
676 return "lateLibraryDependency"
677 default:
678 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
679 }
680}
681
682// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
683// tags that have a set of predefined tag objects that are reused for each dependency, a
684// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
685// That means that comparing a libraryDependencyTag for equality will only be equal if all
686// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
687// then check individual metadata fields instead.
688type libraryDependencyTag struct {
689 blueprint.BaseDependencyTag
690
691 // These are exported so that fmt.Printf("%#v") can call their String methods.
692 Kind libraryDependencyKind
693 Order libraryDependencyOrder
694
695 wholeStatic bool
696
697 reexportFlags bool
698 explicitlyVersioned bool
699 dataLib bool
700 ndk bool
701
702 staticUnwinder bool
703
704 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900705
Cindy Zhou18417cb2020-12-10 07:12:38 -0800706 // Whether or not this dependency should skip the apex dependency check
707 skipApexAllowedDependenciesCheck bool
708
Jiyong Parke3867542020-12-03 17:28:25 +0900709 // Whether or not this dependency has to be followed for the apex variants
710 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900711 // Whether or not this dependency has to be followed for the non-apex variants
712 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000713
714 // If true, don't automatically export symbols from the static library into a shared library.
715 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700716}
717
718// header returns true if the libraryDependencyTag is tagging a header lib dependency.
719func (d libraryDependencyTag) header() bool {
720 return d.Kind == headerLibraryDependency
721}
722
723// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
724func (d libraryDependencyTag) shared() bool {
725 return d.Kind == sharedLibraryDependency
726}
727
728// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
729func (d libraryDependencyTag) static() bool {
730 return d.Kind == staticLibraryDependency
731}
732
Colin Cross65cb3142021-12-10 23:05:02 +0000733func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
734 if d.shared() {
735 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
736 }
737 return nil
738}
739
740var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
741
Colin Crosse9fe2942020-11-10 18:12:15 -0800742// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
743// binaries or other shared libraries are installed as dependencies.
744func (d libraryDependencyTag) InstallDepNeeded() bool {
745 return d.shared()
746}
747
748var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
749
Yu Liu67a28422024-03-05 00:36:31 +0000750func (d libraryDependencyTag) PropagateAconfigValidation() bool {
751 return d.static()
752}
753
754var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
755
Colin Crosse9fe2942020-11-10 18:12:15 -0800756// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700757// libraryDependencyTag. Each tag object is created globally and reused for multiple
758// dependencies (although since the object contains no references, assigning a tag to a
759// variable and modifying it will not modify the original). Users can compare the tag
760// returned by ctx.OtherModuleDependencyTag against the global original
761type dependencyTag struct {
762 blueprint.BaseDependencyTag
763 name string
764}
765
Colin Crosse9fe2942020-11-10 18:12:15 -0800766// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
767// libraryDependencyTag, but where the dependency needs to be installed when the parent is
768// installed.
769type installDependencyTag struct {
770 blueprint.BaseDependencyTag
771 android.InstallAlwaysNeededDependencyTag
772 name string
773}
774
Colin Crossc99deeb2016-04-11 15:06:20 -0700775var (
Colin Cross6e511a92020-07-27 21:26:48 -0700776 genSourceDepTag = dependencyTag{name: "gen source"}
777 genHeaderDepTag = dependencyTag{name: "gen header"}
778 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
779 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900780 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700781 reuseObjTag = dependencyTag{name: "reuse objects"}
782 staticVariantTag = dependencyTag{name: "static variant"}
783 vndkExtDepTag = dependencyTag{name: "vndk extends"}
784 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700785 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800786 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700787 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700788 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000789 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500790 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400791 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700792)
793
Roland Levillainf89cd092019-07-29 16:22:59 +0100794func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700795 ccLibDepTag, ok := depTag.(libraryDependencyTag)
796 return ok && ccLibDepTag.shared()
797}
798
799func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
800 ccLibDepTag, ok := depTag.(libraryDependencyTag)
801 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100802}
803
Zach Johnson3df4e632020-11-06 11:56:27 -0800804func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
805 ccLibDepTag, ok := depTag.(libraryDependencyTag)
806 return ok && ccLibDepTag.header()
807}
808
Roland Levillainf89cd092019-07-29 16:22:59 +0100809func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800810 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100811}
812
813func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700814 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100815 return ok && ccDepTag == testPerSrcDepTag
816}
817
Colin Crossca860ac2016-01-04 14:34:37 -0800818// Module contains the properties and members used by all C/C++ module types, and implements
819// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500820// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
821// interface.
822//
823// To define a C/C++ related module, construct a new Module object and point its delegates to
824// type-specific structs. These delegates will be invoked to register module-specific build
825// statements which may be unique to the module type. For example, module.compiler.compile() should
826// be defined so as to register build statements which are responsible for compiling the module.
827//
828// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
829// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
830// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
831// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800832type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700833 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -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
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000839 hod android.HostOrDeviceSupported
840 multilib android.Multilib
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000841 testModule 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.
Colin Cross8ff10582023-12-07 13:10:56 -0800851 generators []Generator
852 compiler compiler
853 linker linker
854 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500855
Spandan Dase12d2522023-09-12 21:42:31 +0000856 features []feature
857 stl *stl
858 sanitize *sanitize
859 coverage *coverage
860 fuzzer *fuzzer
861 sabi *sabi
862 vndkdep *vndkdep
863 lto *lto
864 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000865 orderfile *orderfile
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
Yu Liueae7b362023-11-16 17:05:47 -0800896
897 // Aconfig files for all transitive deps. Also exposed via TransitiveDeclarationsInfo
Colin Crossd788b3e2023-11-28 13:14:56 -0800898 mergedAconfigFiles map[string]android.Paths
Colin Crossc472d572015-03-17 15:06:21 -0700899}
900
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200901func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400902 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
903 if b, ok := c.compiler.(*baseCompiler); ok {
904 hasAidl = b.hasSrcExt(".aidl")
905 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
906 hasProto = b.hasSrcExt(".proto")
907 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
908 hasSysprop = b.hasSrcExt(".sysprop")
909 hasWinMsg = b.hasSrcExt(".mc")
910 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
911 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200912 c.AndroidModuleBase().AddJSONData(d)
913 (*d)["Cc"] = map[string]interface{}{
914 "SdkVersion": c.SdkVersion(),
915 "MinSdkVersion": c.MinSdkVersion(),
916 "VndkVersion": c.VndkVersion(),
917 "ProductSpecific": c.ProductSpecific(),
918 "SocSpecific": c.SocSpecific(),
919 "DeviceSpecific": c.DeviceSpecific(),
920 "InProduct": c.InProduct(),
921 "InVendor": c.InVendor(),
922 "InRamdisk": c.InRamdisk(),
923 "InVendorRamdisk": c.InVendorRamdisk(),
924 "InRecovery": c.InRecovery(),
925 "VendorAvailable": c.VendorAvailable(),
926 "ProductAvailable": c.ProductAvailable(),
927 "RamdiskAvailable": c.RamdiskAvailable(),
928 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
929 "RecoveryAvailable": c.RecoveryAvailable(),
930 "OdmAvailable": c.OdmAvailable(),
931 "InstallInData": c.InstallInData(),
932 "InstallInRamdisk": c.InstallInRamdisk(),
933 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
934 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
935 "InstallInRecovery": c.InstallInRecovery(),
936 "InstallInRoot": c.InstallInRoot(),
937 "IsVndk": c.IsVndk(),
938 "IsVndkExt": c.IsVndkExt(),
939 "IsVndkPrivate": c.IsVndkPrivate(),
940 "IsVndkSp": c.IsVndkSp(),
941 "IsLlndk": c.IsLlndk(),
942 "IsLlndkPublic": c.IsLlndkPublic(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200943 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
944 "ApexSdkVersion": c.apexSdkVersion,
945 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400946 "AidlSrcs": hasAidl,
947 "LexSrcs": hasLex,
948 "ProtoSrcs": hasProto,
949 "RenderscriptSrcs": hasRenderscript,
950 "SyspropSrcs": hasSysprop,
951 "WinMsgSrcs": hasWinMsg,
952 "YaccSrsc": hasYacc,
953 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200954 }
955}
956
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500957func (c *Module) SetPreventInstall() {
958 c.Properties.PreventInstall = true
959}
960
961func (c *Module) SetHideFromMake() {
962 c.Properties.HideFromMake = true
963}
964
Ivan Lozanod7586b62021-04-01 09:49:36 -0400965func (c *Module) HiddenFromMake() bool {
966 return c.Properties.HideFromMake
967}
968
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800969func (c *Module) RequiredModuleNames() []string {
970 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
971 if c.ImageVariation().Variation == android.CoreVariation {
972 required = append(required, c.Properties.Target.Platform.Required...)
973 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
974 } else if c.InRecovery() {
975 required = append(required, c.Properties.Target.Recovery.Required...)
976 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
977 }
978 return android.FirstUniqueStrings(required)
979}
980
Ivan Lozano52767be2019-10-18 14:49:46 -0700981func (c *Module) Toc() android.OptionalPath {
982 if c.linker != nil {
983 if library, ok := c.linker.(libraryInterface); ok {
984 return library.toc()
985 }
986 }
987 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
988}
989
990func (c *Module) ApiLevel() string {
991 if c.linker != nil {
992 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -0700993 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -0700994 }
995 }
996 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
997}
998
999func (c *Module) Static() bool {
1000 if c.linker != nil {
1001 if library, ok := c.linker.(libraryInterface); ok {
1002 return library.static()
1003 }
1004 }
1005 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1006}
1007
1008func (c *Module) Shared() bool {
1009 if c.linker != nil {
1010 if library, ok := c.linker.(libraryInterface); ok {
1011 return library.shared()
1012 }
1013 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001014
Ivan Lozano52767be2019-10-18 14:49:46 -07001015 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1016}
1017
1018func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001019 if c.stl != nil {
1020 return c.stl.Properties.SelectedStl
1021 }
1022 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001023}
1024
Ivan Lozano52767be2019-10-18 14:49:46 -07001025func (c *Module) NdkPrebuiltStl() bool {
1026 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1027 return true
1028 }
1029 return false
1030}
1031
1032func (c *Module) StubDecorator() bool {
1033 if _, ok := c.linker.(*stubDecorator); ok {
1034 return true
1035 }
1036 return false
1037}
1038
1039func (c *Module) SdkVersion() string {
1040 return String(c.Properties.Sdk_version)
1041}
1042
Artur Satayev480e25b2020-04-27 18:53:18 +01001043func (c *Module) MinSdkVersion() string {
1044 return String(c.Properties.Min_sdk_version)
1045}
1046
Jiyong Park5df7bd32021-08-25 16:18:46 +09001047func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001048 if linker, ok := c.linker.(*objectLinker); ok {
1049 return linker.isCrt()
1050 }
1051 return false
1052}
1053
Jiyong Park5df7bd32021-08-25 16:18:46 +09001054func (c *Module) SplitPerApiLevel() bool {
1055 return c.canUseSdk() && c.isCrt()
1056}
1057
Colin Crossc511bc52020-04-07 16:50:32 +00001058func (c *Module) AlwaysSdk() bool {
1059 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1060}
1061
Ivan Lozano183a3212019-10-18 14:18:45 -07001062func (c *Module) CcLibrary() bool {
1063 if c.linker != nil {
1064 if _, ok := c.linker.(*libraryDecorator); ok {
1065 return true
1066 }
Colin Crossd48fe732020-09-23 20:37:24 -07001067 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1068 return true
1069 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001070 }
1071 return false
1072}
1073
1074func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001075 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001076 return true
1077 }
1078 return false
1079}
1080
Spandan Dase12d2522023-09-12 21:42:31 +00001081func (c *Module) IsNdkPrebuiltStl() bool {
1082 if c.linker == nil {
1083 return false
1084 }
1085 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1086 return true
1087 }
1088 return false
1089}
1090
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001091func (c *Module) RlibStd() bool {
1092 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1093}
1094
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001095func (c *Module) RustLibraryInterface() bool {
1096 return false
1097}
1098
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001099func (c *Module) IsFuzzModule() bool {
1100 if _, ok := c.compiler.(*fuzzBinary); ok {
1101 return true
1102 }
1103 return false
1104}
1105
1106func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1107 return c.FuzzModule
1108}
1109
1110func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1111 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1112 return fuzzer.fuzzPackagedModule
1113 }
1114 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1115}
1116
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001117func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001118 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1119 return fuzzer.sharedLibraries
1120 }
1121 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1122}
1123
Ivan Lozano2b262972019-11-21 12:30:50 -08001124func (c *Module) NonCcVariants() bool {
1125 return false
1126}
1127
Ivan Lozano183a3212019-10-18 14:18:45 -07001128func (c *Module) SetStatic() {
1129 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001130 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001131 library.setStatic()
1132 return
1133 }
1134 }
1135 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1136}
1137
1138func (c *Module) SetShared() {
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 library.setShared()
1142 return
1143 }
1144 }
1145 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1146}
1147
1148func (c *Module) BuildStaticVariant() bool {
1149 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001150 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001151 return library.buildStatic()
1152 }
1153 }
1154 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1155}
1156
1157func (c *Module) BuildSharedVariant() bool {
1158 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001159 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001160 return library.buildShared()
1161 }
1162 }
1163 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1164}
1165
1166func (c *Module) Module() android.Module {
1167 return c
1168}
1169
Jiyong Parkc20eee32018-09-05 22:36:17 +09001170func (c *Module) OutputFile() android.OptionalPath {
1171 return c.outputFile
1172}
1173
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001174func (c *Module) CoverageFiles() android.Paths {
1175 if c.linker != nil {
1176 if library, ok := c.linker.(libraryInterface); ok {
1177 return library.objs().coverageFiles
1178 }
1179 }
1180 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1181}
1182
Ivan Lozano183a3212019-10-18 14:18:45 -07001183var _ LinkableInterface = (*Module)(nil)
1184
Jiyong Park719b4462019-01-13 00:39:51 +09001185func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001186 if c.linker != nil {
1187 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001188 }
1189 return nil
1190}
1191
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001192func (c *Module) CoverageOutputFile() android.OptionalPath {
1193 if c.linker != nil {
1194 return c.linker.coverageOutputFilePath()
1195 }
1196 return android.OptionalPath{}
1197}
1198
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001199func (c *Module) RelativeInstallPath() string {
1200 if c.installer != nil {
1201 return c.installer.relativeInstallPath()
1202 }
1203 return ""
1204}
1205
Jooyung Han344d5432019-08-23 11:17:39 +09001206func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001207 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001208}
1209
Colin Cross36242852017-06-23 15:06:31 -07001210func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001211 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001212 for _, generator := range c.generators {
1213 c.AddProperties(generator.GeneratorProps()...)
1214 }
Colin Crossca860ac2016-01-04 14:34:37 -08001215 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001216 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001217 }
1218 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001219 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001220 }
1221 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001222 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001223 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001224 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001225 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001226 }
Colin Cross16b23492016-01-06 14:41:07 -08001227 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001228 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001229 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001230 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001231 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001232 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001233 if c.fuzzer != nil {
1234 c.AddProperties(c.fuzzer.props()...)
1235 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001236 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001237 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001238 }
Justin Yun8effde42017-06-23 19:24:43 +09001239 if c.vndkdep != nil {
1240 c.AddProperties(c.vndkdep.props()...)
1241 }
Stephen Craneba090d12017-05-09 15:44:35 -07001242 if c.lto != nil {
1243 c.AddProperties(c.lto.props()...)
1244 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001245 if c.afdo != nil {
1246 c.AddProperties(c.afdo.props()...)
1247 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001248 if c.orderfile != nil {
1249 c.AddProperties(c.orderfile.props()...)
1250 }
Colin Crossca860ac2016-01-04 14:34:37 -08001251 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001252 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001253 }
Colin Crossc472d572015-03-17 15:06:21 -07001254
Colin Cross36242852017-06-23 15:06:31 -07001255 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001256 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001257 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001258
Colin Cross36242852017-06-23 15:06:31 -07001259 return c
Colin Crossc472d572015-03-17 15:06:21 -07001260}
1261
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001262// UseVndk() returns true if this module is built against VNDK.
1263// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001264func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001265 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001266}
1267
Colin Crossc511bc52020-04-07 16:50:32 +00001268func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001269 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001270 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001271}
1272
1273func (c *Module) UseSdk() bool {
1274 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001275 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001276 }
1277 return false
1278}
1279
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001280func (c *Module) isCoverageVariant() bool {
1281 return c.coverage.Properties.IsCoverageVariant
1282}
1283
Colin Cross95f1ca02020-10-29 20:47:22 -07001284func (c *Module) IsNdk(config android.Config) bool {
1285 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001286}
1287
Colin Cross127bb8b2020-12-16 16:46:01 -08001288func (c *Module) IsLlndk() bool {
1289 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001290}
1291
Colin Cross127bb8b2020-12-16 16:46:01 -08001292func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001293 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001294}
1295
Colin Cross1f3f1302021-04-26 18:37:44 -07001296func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001297 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001298 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001299}
1300
Colin Cross5271fea2021-04-27 13:06:04 -07001301func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1302 lib := moduleLibraryInterface(m)
1303 return lib != nil && (lib.hasVendorPublicLibrary())
1304}
1305
1306// IsVendorPublicLibrary returns true for vendor public libraries.
1307func (c *Module) IsVendorPublicLibrary() bool {
1308 return c.VendorProperties.IsVendorPublicLibrary
1309}
1310
Ivan Lozanof1868af2022-04-12 13:08:36 -04001311func (c *Module) IsVndkPrebuiltLibrary() bool {
1312 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1313 return true
1314 }
1315 return false
1316}
1317
1318func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1319 return c.Properties.SdkAndPlatformVariantVisibleToMake
1320}
1321
Ivan Lozanod7586b62021-04-01 09:49:36 -04001322func (c *Module) HasLlndkStubs() bool {
1323 lib := moduleLibraryInterface(c)
1324 return lib != nil && lib.hasLLNDKStubs()
1325}
1326
1327func (c *Module) StubsVersion() string {
1328 if lib, ok := c.linker.(versionedInterface); ok {
1329 return lib.stubsVersion()
1330 }
1331 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1332}
1333
Colin Cross127bb8b2020-12-16 16:46:01 -08001334// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1335// and does not set llndk.vendor_available: false.
1336func (c *Module) isImplementationForLLNDKPublic() bool {
1337 library, _ := c.library.(*libraryDecorator)
1338 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001339 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001340}
1341
Justin Yunfd9e8042020-12-23 18:23:14 +09001342// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001343func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001344 // Check if VNDK-core-private or VNDK-SP-private
1345 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001346 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001347 }
1348
1349 // Check if LLNDK-private
1350 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001351 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001352 }
1353
1354 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001355}
1356
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001357// IsVndk() returns true if this module has a vndk variant.
1358// Note that IsVndk() returns true for all variants of vndk-enabled libraries. Not only vendor variant,
1359// but also platform and product variants of vndk-enabled libraries return true for IsVndk().
Ivan Lozano52767be2019-10-18 14:49:46 -07001360func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001361 if vndkdep := c.vndkdep; vndkdep != nil {
1362 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001363 }
1364 return false
1365}
1366
Colin Cross3513fb12024-01-24 14:44:47 -08001367func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001368 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001369 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001370 }
1371 return false
1372}
1373
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001374func (c *Module) isOrderfileCompile() bool {
1375 if orderfile := c.orderfile; orderfile != nil {
1376 return orderfile.Properties.OrderfileLoad
1377 }
1378 return false
1379}
1380
Yi Kongc702ebd2022-08-19 16:02:45 +08001381func (c *Module) isCfi() bool {
1382 if sanitize := c.sanitize; sanitize != nil {
Yi Kongddffe722023-07-18 16:40:36 +09001383 return Bool(sanitize.Properties.SanitizeMutated.Cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001384 }
1385 return false
1386}
1387
Yi Konged79fa32023-06-04 17:15:42 +09001388func (c *Module) isFuzzer() bool {
1389 if sanitize := c.sanitize; sanitize != nil {
1390 return Bool(sanitize.Properties.SanitizeMutated.Fuzzer)
1391 }
1392 return false
1393}
1394
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001395func (c *Module) isNDKStubLibrary() bool {
1396 if _, ok := c.compiler.(*stubDecorator); ok {
1397 return true
1398 }
1399 return false
1400}
1401
Ivan Lozanod7586b62021-04-01 09:49:36 -04001402func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001403 if vndkdep := c.vndkdep; vndkdep != nil {
1404 return vndkdep.isVndkSp()
1405 }
1406 return false
1407}
1408
Ivan Lozanof9e21722020-12-02 09:00:51 -05001409func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001410 if vndkdep := c.vndkdep; vndkdep != nil {
1411 return vndkdep.isVndkExt()
1412 }
1413 return false
1414}
1415
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001416func (c *Module) SubName() string {
1417 return c.Properties.SubName
1418}
1419
Ivan Lozano52767be2019-10-18 14:49:46 -07001420func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001421 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001422}
1423
Logan Chienf3511742017-10-31 18:04:35 +08001424func (c *Module) getVndkExtendsModuleName() string {
1425 if vndkdep := c.vndkdep; vndkdep != nil {
1426 return vndkdep.getVndkExtendsModuleName()
1427 }
1428 return ""
1429}
1430
Jiyong Park25fc6a92018-11-18 18:02:45 +09001431func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001432 if lib := c.library; lib != nil {
1433 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001434 }
1435 return false
1436}
1437
1438func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001439 if lib := c.library; lib != nil {
1440 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001441 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001442 return false
1443}
1444
Alan Stokes73feba32022-11-14 12:21:24 +00001445func (c *Module) IsStubsImplementationRequired() bool {
1446 if lib := c.library; lib != nil {
1447 return lib.isStubsImplementationRequired()
1448 }
1449 return false
1450}
1451
Colin Cross0477b422020-10-13 18:43:54 -07001452// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1453// the implementation. If it is an implementation library it returns its own name.
1454func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1455 name := ctx.OtherModuleName(c)
1456 if versioned, ok := c.linker.(versionedInterface); ok {
1457 name = versioned.implementationModuleName(name)
1458 }
1459 return name
1460}
1461
Martin Stjernholm2856c662020-12-02 15:03:42 +00001462// Similar to ImplementationModuleName, but uses the Make variant of the module
1463// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1464// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1465// under the premise that the prebuilt module overrides its source counterpart
1466// if it is exposed to Make).
1467func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1468 name := c.BaseModuleName()
1469 if versioned, ok := c.linker.(versionedInterface); ok {
1470 name = versioned.implementationModuleName(name)
1471 }
1472 return name
1473}
1474
Jiyong Park7d55b612021-06-11 17:22:09 +09001475func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001476 return Bool(c.Properties.Bootstrap)
1477}
1478
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001479func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001480 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1481 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1482 return false
1483 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001484 return c.linker != nil && c.linker.nativeCoverage()
1485}
1486
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001487func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001488 if p, ok := c.linker.(SnapshotInterface); ok {
1489 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001490 }
1491 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001492}
1493
Jiyong Parkf1194352019-02-25 11:05:47 +09001494func isBionic(name string) bool {
1495 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001496 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001497 return true
1498 }
1499 return false
1500}
1501
Martin Stjernholm279de572019-09-10 23:18:20 +01001502func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001503 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001504 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001505 }
1506 return isBionic(name)
1507}
1508
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001509func (c *Module) XrefCcFiles() android.Paths {
1510 return c.kytheFiles
1511}
1512
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001513func (c *Module) isCfiAssemblySupportEnabled() bool {
1514 return c.sanitize != nil &&
1515 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1516}
1517
Inseob Kim800d1142021-06-14 12:03:51 +09001518func (c *Module) InstallInRoot() bool {
1519 return c.installer != nil && c.installer.installInRoot()
1520}
1521
Colin Crossca860ac2016-01-04 14:34:37 -08001522type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001523 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001524 moduleContextImpl
1525}
1526
Colin Cross37047f12016-12-13 17:06:13 -08001527type depsContext struct {
1528 android.BottomUpMutatorContext
1529 moduleContextImpl
1530}
1531
Colin Crossca860ac2016-01-04 14:34:37 -08001532type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001533 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001534 moduleContextImpl
1535}
1536
1537type moduleContextImpl struct {
1538 mod *Module
1539 ctx BaseModuleContext
1540}
1541
Colin Crossb98c8b02016-07-29 13:44:28 -07001542func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001543 return ctx.mod.toolchain(ctx.ctx)
1544}
1545
1546func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001547 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001548}
1549
1550func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001551 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001552}
1553
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001554func (ctx *moduleContextImpl) testBinary() bool {
1555 return ctx.mod.testBinary()
1556}
1557
Yi Kong56fc1b62022-09-06 16:24:00 +08001558func (ctx *moduleContextImpl) testLibrary() bool {
1559 return ctx.mod.testLibrary()
1560}
1561
Jiyong Park1d1119f2019-07-29 21:27:18 +09001562func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001563 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001564}
1565
Inseob Kim7f283f42020-06-01 21:53:49 +09001566func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001567 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001568}
1569
Inseob Kim1042d292020-06-01 23:23:05 +09001570func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001571 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001572}
1573
Jooyung Hanccce2f22020-03-07 03:45:53 +09001574func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001575 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001576}
1577
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001578func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001579 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001580}
1581
1582func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001583 if ctx.ctx.Device() {
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001584 config := ctx.ctx.Config()
1585 if !config.IsVndkDeprecated() && ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001586 vndkVer := ctx.mod.VndkVersion()
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001587 if inList(vndkVer, config.PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001588 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001589 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001590 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001591 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001592 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001593 }
1594 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001595}
1596
Jiyong Parkb35a8192020-08-10 15:59:36 +09001597func (ctx *moduleContextImpl) minSdkVersion() string {
1598 ver := ctx.mod.MinSdkVersion()
1599 if ver == "apex_inherit" && !ctx.isForPlatform() {
1600 ver = ctx.apexSdkVersion().String()
1601 }
1602 if ver == "apex_inherit" || ver == "" {
1603 ver = ctx.sdkVersion()
1604 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001605
1606 if ctx.ctx.Device() {
1607 config := ctx.ctx.Config()
1608 if config.IsVndkDeprecated() && ctx.inVendor() {
1609 // If building for vendor with final API, then use the latest _stable_ API as "current".
1610 if config.VendorApiLevelFrozen() && (ver == "" || ver == "current") {
1611 ver = config.PlatformSdkVersion().String()
1612 }
1613 }
1614 }
1615
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001616 // For crt objects, the meaning of min_sdk_version is very different from other types of
1617 // module. For them, min_sdk_version defines the oldest version that the build system will
1618 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1619 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1620 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001621 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1622 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1623 // support such an old version. The version is set to the later version in case when the
1624 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1625 // it's for an APEX.
1626 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1627 if ctx.isForPlatform() {
1628 ver = strconv.Itoa(android.FutureApiLevelInt)
1629 } else { // for apex
1630 ver = ctx.apexSdkVersion().String()
1631 if ver == "" { // in case when min_sdk_version was not set by the APEX
1632 ver = ctx.sdkVersion()
1633 }
1634 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001635 }
1636
Jiyong Parkb35a8192020-08-10 15:59:36 +09001637 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1638 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1639 minSdkVersionInt, err2 := strconv.Atoi(ver)
1640 if err == nil && err2 == nil {
1641 if sdkVersionInt < minSdkVersionInt {
1642 return strconv.Itoa(sdkVersionInt)
1643 }
1644 }
1645 return ver
1646}
1647
1648func (ctx *moduleContextImpl) isSdkVariant() bool {
1649 return ctx.mod.IsSdkVariant()
1650}
1651
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001652func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001653 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001654}
Justin Yun8effde42017-06-23 19:24:43 +09001655
Kiyoung Kimaa394802024-01-08 12:55:45 +09001656func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1657 return ctx.mod.InVendorOrProduct()
1658}
1659
Colin Cross95f1ca02020-10-29 20:47:22 -07001660func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1661 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001662}
1663
Colin Cross127bb8b2020-12-16 16:46:01 -08001664func (ctx *moduleContextImpl) IsLlndk() bool {
1665 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001666}
1667
Colin Cross127bb8b2020-12-16 16:46:01 -08001668func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1669 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001670}
1671
Colin Cross127bb8b2020-12-16 16:46:01 -08001672func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1673 return ctx.mod.isImplementationForLLNDKPublic()
1674}
1675
1676func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1677 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001678}
1679
Logan Chienf3511742017-10-31 18:04:35 +08001680func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001681 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001682}
1683
Colin Cross3513fb12024-01-24 14:44:47 -08001684func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1685 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001686}
1687
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001688func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1689 return ctx.mod.isOrderfileCompile()
1690}
1691
Yi Kongc702ebd2022-08-19 16:02:45 +08001692func (ctx *moduleContextImpl) isCfi() bool {
1693 return ctx.mod.isCfi()
1694}
1695
Yi Konged79fa32023-06-04 17:15:42 +09001696func (ctx *moduleContextImpl) isFuzzer() bool {
1697 return ctx.mod.isFuzzer()
1698}
1699
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001700func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1701 return ctx.mod.isNDKStubLibrary()
1702}
1703
Justin Yun8effde42017-06-23 19:24:43 +09001704func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001705 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001706}
1707
Ivan Lozanof9e21722020-12-02 09:00:51 -05001708func (ctx *moduleContextImpl) IsVndkExt() bool {
1709 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001710}
1711
Colin Cross5271fea2021-04-27 13:06:04 -07001712func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1713 return ctx.mod.IsVendorPublicLibrary()
1714}
1715
Vic Yangefd249e2018-11-12 20:19:56 -08001716func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001717 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001718}
1719
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001720func (ctx *moduleContextImpl) selectedStl() string {
1721 if stl := ctx.mod.stl; stl != nil {
1722 return stl.Properties.SelectedStl
1723 }
1724 return ""
1725}
1726
Ivan Lozanobd721262018-11-27 14:33:03 -08001727func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1728 return ctx.mod.linker.useClangLld(actx)
1729}
1730
Colin Crossce75d2c2016-10-06 16:12:58 -07001731func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001732 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001733}
1734
Logan Chienf3511742017-10-31 18:04:35 +08001735func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1736 return ctx.mod.getVndkExtendsModuleName()
1737}
1738
Logan Chiene274fc92019-12-03 11:18:32 -08001739func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Crossff694a82023-12-13 15:54:49 -08001740 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1741 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001742}
1743
Colin Crosse07f2312020-08-13 11:24:56 -07001744func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001745 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1746 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001747}
1748
Dan Albertc8060532020-07-22 22:32:17 -07001749func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001750 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001751}
1752
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001753func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001754 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001755}
1756
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001757func (ctx *moduleContextImpl) nativeCoverage() bool {
1758 return ctx.mod.nativeCoverage()
1759}
1760
Colin Cross56a83212020-09-15 18:30:11 -07001761func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1762 return ctx.mod.DirectlyInAnyApex()
1763}
1764
Colin Cross95b07f22020-12-16 11:06:50 -08001765func (ctx *moduleContextImpl) isPreventInstall() bool {
1766 return ctx.mod.Properties.PreventInstall
1767}
1768
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001769func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1770 shared := &ctx.mod.sharedFlags
1771 if shared.flagsMap == nil {
1772 shared.numSharedFlags = 0
1773 shared.flagsMap = make(map[string]string)
1774 }
1775 return shared
1776}
1777
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001778func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1779 return ctx.mod.isCfiAssemblySupportEnabled()
1780}
1781
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001782func (ctx *moduleContextImpl) notInPlatform() bool {
1783 return ctx.mod.NotInPlatform()
1784}
1785
Colin Cross635c3b02016-05-18 15:37:25 -07001786func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001787 return &Module{
1788 hod: hod,
1789 multilib: multilib,
1790 }
1791}
1792
Colin Cross635c3b02016-05-18 15:37:25 -07001793func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001794 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001795 module.features = []feature{
1796 &tidyFeature{},
1797 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001798 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001799 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001800 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001801 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001802 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001803 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001804 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001805 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001806 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001807 return module
1808}
1809
Colin Crossce75d2c2016-10-06 16:12:58 -07001810func (c *Module) Prebuilt() *android.Prebuilt {
1811 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1812 return p.prebuilt()
1813 }
1814 return nil
1815}
1816
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001817func (c *Module) IsPrebuilt() bool {
1818 return c.Prebuilt() != nil
1819}
1820
Colin Crossce75d2c2016-10-06 16:12:58 -07001821func (c *Module) Name() string {
1822 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001823 if p, ok := c.linker.(interface {
1824 Name(string) string
1825 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001826 name = p.Name(name)
1827 }
1828 return name
1829}
1830
Alex Light3d673592019-01-18 14:37:31 -08001831func (c *Module) Symlinks() []string {
1832 if p, ok := c.installer.(interface {
1833 symlinkList() []string
1834 }); ok {
1835 return p.symlinkList()
1836 }
1837 return nil
1838}
1839
Roland Levillainf89cd092019-07-29 16:22:59 +01001840func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1841 test, ok := c.linker.(testPerSrc)
1842 return ok && test.isAllTestsVariation()
1843}
1844
Chris Parsons216e10a2020-07-09 17:12:52 -04001845func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001846 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001847 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001848 }); ok {
1849 return p.dataPaths()
1850 }
1851 return nil
1852}
1853
Ivan Lozanof1868af2022-04-12 13:08:36 -04001854func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001855 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1856 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001857 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001858 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001859 if c.ProductSpecific() {
1860 // If the module is product specific with 'product_specific: true',
1861 // do not add a name suffix because it is a base module.
1862 return ""
1863 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001864 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001865 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001866 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001867 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001868 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001869 // add version suffix only if the module is using different vndk version than the
1870 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001871 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001872 }
1873 return nameSuffix
1874}
1875
Ivan Lozanof1868af2022-04-12 13:08:36 -04001876func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1877 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001878
1879 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001880 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001881 }
1882
Colin Cross127bb8b2020-12-16 16:46:01 -08001883 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001884 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001885 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1886 // added for product variant only when we have vendor and product variants with core
1887 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001888 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001889 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001890 subName += vendorPublicLibrarySuffix
1891 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001892 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1893 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001894 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001895 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001896 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001897 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001898 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001899 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001900 subName += RecoverySuffix
1901 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1902 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001903 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001904 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001905 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001906 } else if c.IsStubs() && c.IsSdkVariant() {
1907 // Public API surface (NDK)
1908 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1909 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001910 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001911
1912 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001913}
1914
Sam Delmerico75dbca22023-04-20 13:13:25 +00001915func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1916 ctx := &moduleContext{
1917 ModuleContext: actx,
1918 moduleContextImpl: moduleContextImpl{
1919 mod: c,
1920 },
1921 }
1922 ctx.ctx = ctx
1923 return ctx
1924}
1925
Spandan Das20fce2d2023-04-12 17:21:39 +00001926// TODO (b/277651159): Remove this allowlist
1927var (
1928 skipStubLibraryMultipleApexViolation = map[string]bool{
1929 "libclang_rt.asan": true,
1930 "libclang_rt.hwasan": true,
1931 // runtime apex
1932 "libc": true,
1933 "libc_hwasan": true,
1934 "libdl_android": true,
1935 "libm": true,
1936 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00001937 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00001938 // art apex
1939 "libandroidio": true,
1940 "libdexfile": true,
1941 "libnativebridge": true,
1942 "libnativehelper": true,
1943 "libnativeloader": true,
1944 "libsigchain": true,
1945 }
1946)
1947
1948// Returns true if a stub library could be installed in multiple apexes
1949func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
1950 // If this is not an apex variant, no check necessary
1951 if !c.InAnyApex() {
1952 return false
1953 }
1954 // If this is not a stub library, no check necessary
1955 if !c.HasStubsVariants() {
1956 return false
1957 }
1958 // Skip the allowlist
1959 // Use BaseModuleName so that this matches prebuilts.
1960 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
1961 return false
1962 }
1963
1964 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
1965 // Stub libraries should not have more than one apex_available
1966 if len(aaWithoutTestApexes) > 1 {
1967 return true
1968 }
1969 // Stub libraries should not use the wildcard
1970 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
1971 return true
1972 }
1973 // Default: no violation
1974 return false
1975}
1976
LaMont Jonesafe7baf2024-01-09 22:47:39 +00001977func (d *Defaults) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1978 android.CollectDependencyAconfigFiles(ctx, &d.mergedAconfigFiles)
1979}
1980
Chris Parsons8d6e4332021-02-22 16:13:50 -05001981func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05001982 // Handle the case of a test module split by `test_per_src` mutator.
1983 //
1984 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1985 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1986 // module and return early, as this module does not produce an output file per se.
1987 if c.IsTestPerSrcAllTestsVariation() {
1988 c.outputFile = android.OptionalPath{}
1989 return
1990 }
1991
Ivan Lozanof1868af2022-04-12 13:08:36 -04001992 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08001993 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001994 if !apexInfo.IsForPlatform() {
1995 c.hideApexVariantFromMake = true
1996 }
1997
Chris Parsonseefc9e62021-04-02 17:36:47 -04001998 c.makeLinkType = GetMakeLinkType(actx, c)
1999
Sam Delmerico75dbca22023-04-20 13:13:25 +00002000 ctx := moduleContextFromAndroidModuleContext(actx, c)
Colin Crossca860ac2016-01-04 14:34:37 -08002001
Colin Crossf18e1102017-11-16 14:33:08 -08002002 deps := c.depsToPaths(ctx)
2003 if ctx.Failed() {
2004 return
2005 }
2006
Joe Onorato37f900c2023-07-18 16:58:16 -07002007 for _, generator := range c.generators {
2008 gen := generator.GeneratorSources(ctx)
2009 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2010 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2011 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2012 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2013 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2014 if len(deps.Objs.objFiles) == 0 {
2015 // If we are reusuing object files (which happens when we're a shared library and we're
2016 // reusing our static variant's object files), then skip adding the actual source files,
2017 // because we already have the object for it.
2018 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2019 }
2020 }
2021
2022 if ctx.Failed() {
2023 return
2024 }
2025
Spandan Das20fce2d2023-04-12 17:21:39 +00002026 if c.stubLibraryMultipleApexViolation(actx) {
2027 actx.PropertyErrorf("apex_available",
2028 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2029 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002030 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2031 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002032 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2033 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002034 }
2035
Colin Crossca860ac2016-01-04 14:34:37 -08002036 flags := Flags{
2037 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002038 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002039 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002040 for _, generator := range c.generators {
2041 flags = generator.GeneratorFlags(ctx, flags, deps)
2042 }
Colin Crossca860ac2016-01-04 14:34:37 -08002043 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002044 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002045 }
2046 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002047 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002048 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002049 if c.stl != nil {
2050 flags = c.stl.flags(ctx, flags)
2051 }
Colin Cross16b23492016-01-06 14:41:07 -08002052 if c.sanitize != nil {
2053 flags = c.sanitize.flags(ctx, flags)
2054 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002055 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002056 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002057 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002058 if c.fuzzer != nil {
2059 flags = c.fuzzer.flags(ctx, flags)
2060 }
Stephen Craneba090d12017-05-09 15:44:35 -07002061 if c.lto != nil {
2062 flags = c.lto.flags(ctx, flags)
2063 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002064 if c.afdo != nil {
2065 flags = c.afdo.flags(ctx, flags)
2066 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002067 if c.orderfile != nil {
2068 flags = c.orderfile.flags(ctx, flags)
2069 }
Colin Crossca860ac2016-01-04 14:34:37 -08002070 for _, feature := range c.features {
2071 flags = feature.flags(ctx, flags)
2072 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002073 if ctx.Failed() {
2074 return
2075 }
2076
Colin Cross4af21ed2019-11-04 09:37:55 -08002077 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2078 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2079 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002080
Colin Cross4af21ed2019-11-04 09:37:55 -08002081 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002082
2083 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002084 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002085 }
2086 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002087 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002088 }
2089
Colin Cross3e5e7782022-06-17 22:17:05 +00002090 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2091
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002092 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002093 // We need access to all the flags seen by a source file.
2094 if c.sabi != nil {
2095 flags = c.sabi.flags(ctx, flags)
2096 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002097
Colin Cross4af21ed2019-11-04 09:37:55 -08002098 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002099
Joe Onorato37f900c2023-07-18 16:58:16 -07002100 for _, generator := range c.generators {
2101 generator.GeneratorBuildActions(ctx, flags, deps)
2102 }
2103
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002104 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002105 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002106 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002107 if ctx.Failed() {
2108 return
2109 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002110 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07002111 c.objFiles = objs.objFiles
2112 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08002113 }
2114
Colin Crossca860ac2016-01-04 14:34:37 -08002115 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002116 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002117 if ctx.Failed() {
2118 return
2119 }
Colin Cross635c3b02016-05-18 15:37:25 -07002120 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002121
Chris Parsons94a0bba2021-06-04 15:03:47 -04002122 c.maybeUnhideFromMake()
Colin Crossce75d2c2016-10-06 16:12:58 -07002123 }
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002124 if c.testModule {
Colin Cross40213022023-12-13 15:19:49 -08002125 android.SetProvider(ctx, testing.TestModuleProviderKey, testing.TestModuleProviderData{})
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002126 }
Colin Cross40213022023-12-13 15:19:49 -08002127 android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
Colin Cross5049f022015-03-18 13:28:46 -07002128
LaMont Jonesaa005ae2023-12-19 19:01:57 +00002129 android.CollectDependencyAconfigFiles(ctx, &c.mergedAconfigFiles)
Yu Liueae7b362023-11-16 17:05:47 -08002130
Chris Parsons94a0bba2021-06-04 15:03:47 -04002131 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002132
2133 if c.linker != nil {
2134 moduleInfoJSON := ctx.ModuleInfoJSON()
2135 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2136 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2137 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2138 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2139 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2140
2141 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2142 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2143 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2144 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2145
2146 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2147 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2148 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2149 moduleInfoJSON.SubName += ".cfi"
2150 }
2151 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2152 moduleInfoJSON.SubName += ".hwasan"
2153 }
2154 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2155 moduleInfoJSON.SubName += ".scs"
2156 }
2157 }
2158 moduleInfoJSON.SubName += c.Properties.SubName
2159
2160 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2161 moduleInfoJSON.Uninstallable = true
2162 }
2163
2164 }
Chris Parsons94a0bba2021-06-04 15:03:47 -04002165}
2166
2167func (c *Module) maybeUnhideFromMake() {
2168 // If a lib is directly included in any of the APEXes or is not available to the
2169 // platform (which is often the case when the stub is provided as a prebuilt),
2170 // unhide the stubs variant having the latest version gets visible to make. In
2171 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2172 // force anything in the make world to link against the stubs library. (unless it
2173 // is explicitly referenced via .bootstrap suffix or the module is marked with
2174 // 'bootstrap: true').
2175 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002176 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002177 c.IsStubs() && !c.InVendorRamdisk() {
2178 c.Properties.HideFromMake = false // unhide
2179 // Note: this is still non-installable
2180 }
2181}
2182
Colin Cross8ff10582023-12-07 13:10:56 -08002183// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2184// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002185func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002186 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002187 // If the module has been specifically configure to not be installed then
2188 // hide from make as otherwise it will break when running inside make
2189 // as the output path to install will not be specified. Not all uninstallable
2190 // modules can be hidden from make as some are needed for resolving make side
2191 // dependencies.
2192 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002193 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002194 c.SkipInstall()
2195 }
2196
2197 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2198 // to allow using the outputs in a genrule.
2199 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002200 c.installer.install(ctx, c.outputFile.Path())
2201 if ctx.Failed() {
2202 return
Colin Crossca860ac2016-01-04 14:34:37 -08002203 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002204 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002205}
2206
Colin Cross0ea8ba82019-06-06 14:33:29 -07002207func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002208 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002209 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002210 }
Colin Crossca860ac2016-01-04 14:34:37 -08002211 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002212}
2213
Colin Crossca860ac2016-01-04 14:34:37 -08002214func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002215 for _, generator := range c.generators {
2216 generator.GeneratorInit(ctx)
2217 }
Colin Crossca860ac2016-01-04 14:34:37 -08002218 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002219 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002220 }
Colin Crossca860ac2016-01-04 14:34:37 -08002221 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002222 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002223 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002224 if c.stl != nil {
2225 c.stl.begin(ctx)
2226 }
Colin Cross16b23492016-01-06 14:41:07 -08002227 if c.sanitize != nil {
2228 c.sanitize.begin(ctx)
2229 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002230 if c.coverage != nil {
2231 c.coverage.begin(ctx)
2232 }
Yi Kong9723e332023-12-04 14:52:53 +09002233 if c.afdo != nil {
2234 c.afdo.begin(ctx)
2235 }
Stephen Craneba090d12017-05-09 15:44:35 -07002236 if c.lto != nil {
2237 c.lto.begin(ctx)
2238 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002239 if c.orderfile != nil {
2240 c.orderfile.begin(ctx)
2241 }
Dan Albert92fe7402020-07-15 13:33:30 -07002242 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002243 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002244 if err != nil {
2245 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002246 c.Properties.Sdk_version = nil
2247 } else {
2248 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002249 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002250 }
Colin Crossca860ac2016-01-04 14:34:37 -08002251}
2252
Colin Cross37047f12016-12-13 17:06:13 -08002253func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002254 deps := Deps{}
2255
Joe Onorato37f900c2023-07-18 16:58:16 -07002256 for _, generator := range c.generators {
2257 deps = generator.GeneratorDeps(ctx, deps)
2258 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002259 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002260 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002261 }
2262 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002263 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002264 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002265 if c.stl != nil {
2266 deps = c.stl.deps(ctx, deps)
2267 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002268 if c.coverage != nil {
2269 deps = c.coverage.deps(ctx, deps)
2270 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002271
Colin Crossb6715442017-10-24 11:13:31 -07002272 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2273 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2274 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2275 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2276 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2277 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002278 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002279
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002280 for _, lib := range deps.ReexportSharedLibHeaders {
2281 if !inList(lib, deps.SharedLibs) {
2282 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2283 }
2284 }
2285
2286 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002287 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2288 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 -07002289 }
2290 }
2291
Colin Cross5950f382016-12-13 12:50:57 -08002292 for _, lib := range deps.ReexportHeaderLibHeaders {
2293 if !inList(lib, deps.HeaderLibs) {
2294 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2295 }
2296 }
2297
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002298 for _, gen := range deps.ReexportGeneratedHeaders {
2299 if !inList(gen, deps.GeneratedHeaders) {
2300 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2301 }
2302 }
2303
Colin Crossc99deeb2016-04-11 15:06:20 -07002304 return deps
2305}
2306
Dan Albert7e9d2952016-08-04 13:02:36 -07002307func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002308 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002309 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002310 moduleContextImpl: moduleContextImpl{
2311 mod: c,
2312 },
2313 }
2314 ctx.ctx = ctx
2315
Colin Crossca860ac2016-01-04 14:34:37 -08002316 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002317}
2318
Jiyong Park7ed9de32018-10-15 22:25:07 +09002319// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002320func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002321 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2322 version := name[sharp+1:]
2323 libname := name[:sharp]
2324 return libname, version
2325 }
2326 return name, ""
2327}
2328
Dan Albert92fe7402020-07-15 13:33:30 -07002329func GetCrtVariations(ctx android.BottomUpMutatorContext,
2330 m LinkableInterface) []blueprint.Variation {
2331 if ctx.Os() != android.Android {
2332 return nil
2333 }
2334 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002335 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2336 minSdkVersion := m.MinSdkVersion()
2337 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2338 minSdkVersion = m.SdkVersion()
2339 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002340 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2341 if err != nil {
2342 ctx.PropertyErrorf("min_sdk_version", err.Error())
2343 }
Colin Cross363ec762023-01-13 13:45:14 -08002344
2345 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002346 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002347 if apiLevel.LessThan(minApiForArch) {
2348 apiLevel = minApiForArch
2349 }
2350
Dan Albert92fe7402020-07-15 13:33:30 -07002351 return []blueprint.Variation{
2352 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002353 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002354 }
2355 }
2356 return []blueprint.Variation{
2357 {Mutator: "sdk", Variation: ""},
2358 }
2359}
2360
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002361func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2362 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002363
2364 variations = append([]blueprint.Variation(nil), variations...)
2365
Liz Kammer23942242022-04-08 15:41:00 -04002366 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002367 // Version is explicitly specified. i.e. libFoo#30
2368 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002369 if tag, ok := depTag.(libraryDependencyTag); ok {
2370 tag.explicitlyVersioned = true
2371 } else {
2372 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2373 }
Colin Crosse7257d22020-09-24 09:56:18 -07002374 }
Colin Crosse7257d22020-09-24 09:56:18 -07002375
Colin Cross0de8a1e2020-09-18 14:15:30 -07002376 if far {
2377 ctx.AddFarVariationDependencies(variations, depTag, name)
2378 } else {
2379 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002380 }
2381}
2382
Kiyoung Kim487689e2022-07-26 09:48:22 +09002383func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2384 apiImportInfo := multitree.ApiImportInfo{}
2385
2386 if c.Device() {
2387 var apiImportModule []blueprint.Module
2388 if actx.OtherModuleExists("api_imports") {
2389 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2390 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
Colin Cross313aa542023-12-13 13:47:44 -08002391 apiInfo, _ := android.OtherModuleProvider(actx, apiImportModule[0], multitree.ApiImportsProvider)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002392 apiImportInfo = apiInfo
Colin Cross40213022023-12-13 15:19:49 -08002393 android.SetProvider(actx, multitree.ApiImportsProvider, apiInfo)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002394 }
2395 }
2396 }
2397
2398 return apiImportInfo
2399}
2400
Kiyoung Kim487689e2022-07-26 09:48:22 +09002401func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2402 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002403 return snapshot
2404 }
2405
2406 return lib
2407}
2408
Kiyoung Kim37693d02024-04-04 09:56:15 +09002409// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002410// of names:
2411//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002412// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002413//
2414// For each of these, it adds the name of the ndk_library module to the list of
2415// variant libs.
2416//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002417// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002418//
2419// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002420//
2421// The caller can then know to add the variantLibs dependencies differently from the
2422// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002423func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002424 variantLibs = []string{}
2425
2426 nonvariantLibs = []string{}
2427 for _, entry := range list {
2428 // strip #version suffix out
2429 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002430 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002431 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002432 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002433 nonvariantLibs = append(nonvariantLibs, entry)
2434 }
2435 }
2436 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002437
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002438}
2439
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002440func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2441 nonVariantLibs := []string{}
2442 variantLibs := []string{}
2443
2444 for _, lib := range libs {
2445 replaceLibName := GetReplaceModuleName(lib, replaceList)
2446 if replaceLibName == lib {
2447 // Do not handle any libs which are not in API imports
2448 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2449 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2450 variantLibs = append(variantLibs, replaceLibName)
2451 } else {
2452 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2453 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002454 }
2455
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002456 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002457}
2458
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002459func (c *Module) shouldUseApiSurface() bool {
2460 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2461 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2462 // LLNDK Variant
2463 return true
2464 }
2465
2466 if c.Properties.IsSdkVariant {
2467 // NDK Variant
2468 return true
2469 }
2470
2471 if c.isImportedApiLibrary() {
2472 // API Library should depend on API headers
2473 return true
2474 }
2475 }
2476
2477 return false
2478}
2479
Colin Cross1e676be2016-10-12 14:38:15 -07002480func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002481 if !c.Enabled() {
2482 return
2483 }
2484
Colin Cross37047f12016-12-13 17:06:13 -08002485 ctx := &depsContext{
2486 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002487 moduleContextImpl: moduleContextImpl{
2488 mod: c,
2489 },
2490 }
2491 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002492
Colin Crossc99deeb2016-04-11 15:06:20 -07002493 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002494 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002495
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002496 apiNdkLibs := []string{}
2497 apiLateNdkLibs := []string{}
2498
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002499 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002500 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2501 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2502 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2503 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2504 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002505 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002506
Yo Chiang219968c2020-09-22 18:45:04 +08002507 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2508
Dan Albert914449f2016-06-17 16:45:24 -07002509 variantNdkLibs := []string{}
2510 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002511 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002512 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2513 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2514 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002515 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002516
Colin Cross32ec36c2016-12-15 07:39:51 -08002517 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002518 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002519 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002520 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002521 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002522
Kiyoung Kim51279d32022-08-24 14:10:46 +09002523 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002524 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002525 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2526 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002527
Spandan Das73bcafc2022-08-18 23:26:00 +00002528 if c.isNDKStubLibrary() {
2529 // ndk_headers do not have any variations
2530 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002531 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002532 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002533 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002534 } else {
2535 actx.AddVariationDependencies(nil, depTag, lib)
2536 }
2537 }
2538
Dan Albertf1d14c72020-07-30 14:32:55 -07002539 if c.isNDKStubLibrary() {
2540 // NDK stubs depend on their implementation because the ABI dumps are
2541 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002542
Spandan Das8b08aea2023-03-14 19:29:34 +00002543 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2544 c.ImageVariation(),
2545 blueprint.Variation{Mutator: "link", Variation: "shared"},
2546 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002547 }
2548
Jiyong Park5d1598f2019-02-25 22:14:17 +09002549 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002550 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002551
Jiyong Park5d1598f2019-02-25 22:14:17 +09002552 actx.AddVariationDependencies([]blueprint.Variation{
2553 {Mutator: "link", Variation: "static"},
2554 }, depTag, lib)
2555 }
2556
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002557 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002558 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002559 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002560 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002561 }
Jiyong Parke3867542020-12-03 17:28:25 +09002562 if inList(lib, deps.ExcludeLibsForApex) {
2563 depTag.excludeInApex = true
2564 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002565
Dan Willemsen59339a22018-07-22 21:18:45 -07002566 actx.AddVariationDependencies([]blueprint.Variation{
2567 {Mutator: "link", Variation: "static"},
2568 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002569 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002570
Jooyung Han75568392020-03-20 04:29:24 +09002571 // staticUnwinderDep is treated as staticDep for Q apexes
2572 // so that native libraries/binaries are linked with static unwinder
2573 // because Q libc doesn't have unwinder APIs
2574 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002575 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002576 actx.AddVariationDependencies([]blueprint.Variation{
2577 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002578 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002579 }
2580
Jiyong Park7ed9de32018-10-15 22:25:07 +09002581 // shared lib names without the #version suffix
2582 var sharedLibNames []string
2583
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002584 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002585 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002586 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002587 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002588 }
Jiyong Parke3867542020-12-03 17:28:25 +09002589 if inList(lib, deps.ExcludeLibsForApex) {
2590 depTag.excludeInApex = true
2591 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002592 if inList(lib, deps.ExcludeLibsForNonApex) {
2593 depTag.excludeInNonApex = true
2594 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002595
Jiyong Park73c54ee2019-10-22 20:31:18 +09002596 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002597 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2598 name = apiLibraryName
2599 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002600 sharedLibNames = append(sharedLibNames, name)
2601
Colin Crosse7257d22020-09-24 09:56:18 -07002602 variations := []blueprint.Variation{
2603 {Mutator: "link", Variation: "shared"},
2604 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002605
2606 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2607 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2608 }
2609
2610 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2611 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2612 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002613 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002614
Colin Crossfe9acfe2021-06-14 16:13:03 -07002615 for _, lib := range deps.LateStaticLibs {
2616 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2617 actx.AddVariationDependencies([]blueprint.Variation{
2618 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002619 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002620 }
2621
Colin Cross3e5e7782022-06-17 22:17:05 +00002622 for _, lib := range deps.UnexportedStaticLibs {
2623 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2624 actx.AddVariationDependencies([]blueprint.Variation{
2625 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002626 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002627 }
2628
Jiyong Park7ed9de32018-10-15 22:25:07 +09002629 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002630 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002631 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2632 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2633 // linking against both the stubs lib and the non-stubs lib at the same time.
2634 continue
2635 }
Colin Cross6e511a92020-07-27 21:26:48 -07002636 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002637 variations := []blueprint.Variation{
2638 {Mutator: "link", Variation: "shared"},
2639 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002640 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002641 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002642
Dan Willemsen59339a22018-07-22 21:18:45 -07002643 actx.AddVariationDependencies([]blueprint.Variation{
2644 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002645 }, dataLibDepTag, deps.DataLibs...)
2646
Colin Crossc8caa062021-09-24 16:50:14 -07002647 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2648
Chris Parsons79d66a52020-06-05 17:26:16 -04002649 actx.AddVariationDependencies([]blueprint.Variation{
2650 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002651 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002652
Colin Cross68861832016-07-08 10:41:41 -07002653 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002654
2655 for _, gen := range deps.GeneratedHeaders {
2656 depTag := genHeaderDepTag
2657 if inList(gen, deps.ReexportGeneratedHeaders) {
2658 depTag = genHeaderExportDepTag
2659 }
2660 actx.AddDependency(c, depTag, gen)
2661 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002662
Dan Albert92fe7402020-07-15 13:33:30 -07002663 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002664 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002665 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002666 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002667 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002668 }
Colin Crossc465efd2021-06-11 18:00:04 -07002669 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002670 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002671 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002672 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002673 if deps.DynamicLinker != "" {
2674 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002675 }
Dan Albert914449f2016-06-17 16:45:24 -07002676
2677 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002678
2679 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002680 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002681 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002682 {Mutator: "link", Variation: "shared"},
2683 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002684 actx.AddVariationDependencies([]blueprint.Variation{
2685 {Mutator: "version", Variation: version},
2686 {Mutator: "link", Variation: "shared"},
2687 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002688
2689 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002690 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002691 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002692 {Mutator: "link", Variation: "shared"},
2693 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002694 actx.AddVariationDependencies([]blueprint.Variation{
2695 {Mutator: "version", Variation: version},
2696 {Mutator: "link", Variation: "shared"},
2697 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002698
2699 if vndkdep := c.vndkdep; vndkdep != nil {
2700 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002701 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002702 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002703 {Mutator: "link", Variation: "shared"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002704 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002705 }
2706 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002707
Vinh Tran367d89d2023-04-28 11:21:25 -04002708 if len(deps.AidlLibs) > 0 {
2709 actx.AddDependency(
2710 c,
2711 aidlLibraryTag,
2712 deps.AidlLibs...,
2713 )
2714 }
2715
Kiyoung Kimee58c932022-10-25 22:59:41 +09002716 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002717}
Colin Cross21b9a242015-03-24 14:15:58 -07002718
Colin Crosse40b4ea2018-10-02 22:25:58 -07002719func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002720 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2721 c.beginMutator(ctx)
2722 }
2723}
2724
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002725// Whether a module can link to another module, taking into
2726// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002727func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002728 tag blueprint.DependencyTag) {
2729
2730 switch t := tag.(type) {
2731 case dependencyTag:
2732 if t != vndkExtDepTag {
2733 return
2734 }
2735 case libraryDependencyTag:
2736 default:
2737 return
2738 }
2739
Ivan Lozanof9e21722020-12-02 09:00:51 -05002740 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002741 // Host code is not restricted
2742 return
2743 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002744
2745 // VNDK is cc.Module supported only for now.
2746 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002747 // Though allowed dependency is limited by the image mutator,
2748 // each vendor and product module needs to check link-type
2749 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002750 if ccTo, ok := to.(*Module); ok {
2751 if ccFrom.vndkdep != nil {
2752 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2753 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002754 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002755 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002756 }
2757 return
2758 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002759 // TODO(b/244244438) : Remove this once all variants are implemented
2760 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2761 return
2762 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002763 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002764 // Platform code can link to anything
2765 return
2766 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002767 if from.InRamdisk() {
2768 // Ramdisk code is not NDK
2769 return
2770 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002771 if from.InVendorRamdisk() {
2772 // Vendor ramdisk code is not NDK
2773 return
2774 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002775 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002776 // Recovery code is not NDK
2777 return
2778 }
Colin Cross31076b32020-10-23 17:22:06 -07002779 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002780 if c.NdkPrebuiltStl() {
2781 // These are allowed, but they don't set sdk_version
2782 return
2783 }
2784 if c.StubDecorator() {
2785 // These aren't real libraries, but are the stub shared libraries that are included in
2786 // the NDK.
2787 return
2788 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002789 if c.isImportedApiLibrary() {
2790 // Imported library from the API surface is a stub library built against interface definition.
2791 return
2792 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002793 }
Logan Chien834b9a62019-01-14 15:39:03 +08002794
Ivan Lozano52767be2019-10-18 14:49:46 -07002795 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002796 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2797 // to link to libc++ (non-NDK and without sdk_version).
2798 return
2799 }
2800
Ivan Lozano52767be2019-10-18 14:49:46 -07002801 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002802 // NDK code linking to platform code is never okay.
2803 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002804 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002805 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002806 }
2807
2808 // At this point we know we have two NDK libraries, but we need to
2809 // check that we're not linking against anything built against a higher
2810 // API level, as it is only valid to link against older or equivalent
2811 // APIs.
2812
Inseob Kim01a28722018-04-11 09:48:45 +09002813 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002814 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002815 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002816 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002817 // Current can't be linked against by anything else.
2818 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002819 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002820 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002821 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002822 if err != nil {
2823 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002824 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002825 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002826 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002827 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002828 if err != nil {
2829 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002830 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002831 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002832 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002833
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002834 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09002835 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002836 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002837 }
2838 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002839 }
Dan Albert202fe492017-12-15 13:56:59 -08002840
2841 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002842 fromStl := from.SelectedStl()
2843 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002844 if fromStl == "" || toStl == "" {
2845 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002846 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002847 // We can be permissive with the system "STL" since it is only the C++
2848 // ABI layer, but in the future we should make sure that everyone is
2849 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002850 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002851 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002852 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2853 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002854 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002855}
2856
Jooyung Han479ca172020-10-19 18:51:07 +09002857func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2858 if c, ok := ctx.Module().(*Module); ok {
2859 ctx.VisitDirectDeps(func(dep android.Module) {
2860 depTag := ctx.OtherModuleDependencyTag(dep)
2861 ccDep, ok := dep.(LinkableInterface)
2862 if ok {
2863 checkLinkType(ctx, c, ccDep, depTag)
2864 }
2865 })
2866 }
2867}
2868
Jiyong Park5fb8c102018-04-09 12:03:06 +09002869// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002870// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2871// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002872// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002873func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2874 check := func(child, parent android.Module) bool {
2875 to, ok := child.(*Module)
2876 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002877 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002878 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002879
Jooyung Hana70f0672019-01-18 15:20:43 +09002880 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2881 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002882 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002883
Jiyong Park0474e1f2021-01-14 14:26:06 +09002884 // These dependencies are not excercised at runtime. Tracking these will give us
2885 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002886 depTag := ctx.OtherModuleDependencyTag(child)
2887 if IsHeaderDepTag(depTag) {
2888 return false
2889 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002890 if depTag == staticVariantTag {
2891 return false
2892 }
2893 if depTag == stubImplDepTag {
2894 return false
2895 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09002896 if depTag == android.RequiredDepTag {
2897 return false
2898 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002899
Justin Yun63e9ec72020-10-29 16:49:43 +09002900 // Even if target lib has no vendor variant, keep checking dependency
2901 // graph in case it depends on vendor_available or product_available
2902 // but not double_loadable transtively.
2903 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002904 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002905 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002906
Jiyong Park0474e1f2021-01-14 14:26:06 +09002907 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2908 // one.
2909 if Bool(to.VendorProperties.Double_loadable) {
2910 return true
2911 }
2912
Ivan Lozanod7586b62021-04-01 09:49:36 -04002913 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002914 return false
2915 }
2916
Jooyung Hana70f0672019-01-18 15:20:43 +09002917 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2918 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002919 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002920 return false
2921 }
2922 if module, ok := ctx.Module().(*Module); ok {
2923 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002924 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002925 ctx.WalkDeps(check)
2926 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002927 }
2928 }
2929}
2930
Yu Liue4312402023-01-18 09:15:31 -08002931func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
2932 // For the dependency from platform to apex, use the latest stubs
2933 apexSdkVersion := android.FutureApiLevel
2934 if !apexInfo.IsForPlatform() {
2935 apexSdkVersion = apexInfo.MinSdkVersion
2936 }
2937
2938 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2939 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2940 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2941 // (b/144430859)
2942 apexSdkVersion = android.FutureApiLevel
2943 }
2944
2945 return apexSdkVersion
2946}
2947
Colin Crossc99deeb2016-04-11 15:06:20 -07002948// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002949func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002950 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002951
Colin Cross0de8a1e2020-09-18 14:15:30 -07002952 var directStaticDeps []StaticLibraryInfo
2953 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002954
Colin Cross0de8a1e2020-09-18 14:15:30 -07002955 reexportExporter := func(exporter FlagExporterInfo) {
2956 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2957 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2958 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2959 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2960 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002961 }
2962
Colin Crossff694a82023-12-13 15:54:49 -08002963 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08002964 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09002965
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002966 skipModuleList := map[string]bool{}
2967
2968 var apiImportInfo multitree.ApiImportInfo
2969 hasApiImportInfo := false
2970
2971 ctx.VisitDirectDeps(func(dep android.Module) {
2972 if dep.Name() == "api_imports" {
Colin Cross313aa542023-12-13 13:47:44 -08002973 apiImportInfo, _ = android.OtherModuleProvider(ctx, dep, multitree.ApiImportsProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002974 hasApiImportInfo = true
2975 }
2976 })
2977
2978 if hasApiImportInfo {
2979 targetStubModuleList := map[string]string{}
2980 targetOrigModuleList := map[string]string{}
2981
2982 // Search for dependency which both original module and API imported library with APEX stub exists
2983 ctx.VisitDirectDeps(func(dep android.Module) {
2984 depName := ctx.OtherModuleName(dep)
2985 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
2986 targetStubModuleList[apiLibrary] = depName
2987 }
2988 })
2989 ctx.VisitDirectDeps(func(dep android.Module) {
2990 depName := ctx.OtherModuleName(dep)
2991 if origLibrary, ok := targetStubModuleList[depName]; ok {
2992 targetOrigModuleList[origLibrary] = depName
2993 }
2994 })
2995
2996 // Decide which library should be used between original and API imported library
2997 ctx.VisitDirectDeps(func(dep android.Module) {
2998 depName := ctx.OtherModuleName(dep)
2999 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003000 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003001 skipModuleList[depName] = true
3002 } else {
3003 skipModuleList[apiLibrary] = true
3004 }
3005 }
3006 })
3007 }
3008
Colin Crossd11fcda2017-10-23 17:59:01 -07003009 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003010 depName := ctx.OtherModuleName(dep)
3011 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003012
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003013 if _, ok := skipModuleList[depName]; ok {
3014 // skip this module because original module or API imported module matching with this should be used instead.
3015 return
3016 }
3017
Dan Willemsen47450072021-10-19 20:24:49 -07003018 if depTag == android.DarwinUniversalVariantTag {
3019 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3020 return
3021 }
3022
Vinh Tran367d89d2023-04-28 11:21:25 -04003023 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003024 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003025 depPaths.AidlLibraryInfos = append(
3026 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003027 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003028 )
3029 }
3030 }
3031
Ivan Lozano52767be2019-10-18 14:49:46 -07003032 ccDep, ok := dep.(LinkableInterface)
3033 if !ok {
3034
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003035 // handling for a few module types that aren't cc Module but that are also supported
3036 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003037 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003038 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003039 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3040 genRule.GeneratedSourceFiles()...)
3041 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003042 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003043 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003044 // Support exported headers from a generated_sources dependency
3045 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003046 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003047 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003048 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003049 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003050 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003051 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003052 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003053 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003054 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3055 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003056 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003057 // 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 +09003058 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003059
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003060 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003061 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003062 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003063 }
Colin Crosscef792e2021-06-11 18:01:26 -07003064 case CrtBeginDepTag:
3065 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3066 case CrtEndDepTag:
3067 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003068 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003069 return
3070 }
3071
Colin Crossfe17f6f2019-03-28 19:30:56 -07003072 if depTag == android.ProtoPluginDepTag {
3073 return
3074 }
3075
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003076 if depTag == android.RequiredDepTag {
3077 return
3078 }
3079
Colin Crossd11fcda2017-10-23 17:59:01 -07003080 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003081 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3082 return
3083 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003084 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003085 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3086 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003087 return
3088 }
3089
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003090 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003091 // Skip reused objects for stub libraries, they use their own stub object file instead.
3092 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3093 // version mutator, so the stubs variant is created from the shared variant that
3094 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003095 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003096 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003097 objs := staticAnalogue.ReuseObjects
3098 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003099 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003100 reexportExporter(depExporterInfo)
3101 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003102 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003103 }
3104
Colin Cross6e511a92020-07-27 21:26:48 -07003105 linkFile := ccDep.OutputFile()
3106
3107 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3108 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003109 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003110 return
3111 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003112
Jiyong Parke3867542020-12-03 17:28:25 +09003113 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3114 return
3115 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003116 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3117 return
3118 }
Jiyong Parke3867542020-12-03 17:28:25 +09003119
Colin Cross313aa542023-12-13 13:47:44 -08003120 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003121
Colin Cross6e511a92020-07-27 21:26:48 -07003122 var ptr *android.Paths
3123 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003124
Colin Cross6e511a92020-07-27 21:26:48 -07003125 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003126
Colin Cross6e511a92020-07-27 21:26:48 -07003127 switch {
3128 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003129 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003130 if !ctx.Config().AllowMissingDependencies() {
3131 ctx.ModuleErrorf("module %q is not a header library", depName)
3132 } else {
3133 ctx.AddMissingDependencies([]string{depName})
3134 }
3135 return
3136 }
Colin Cross6e511a92020-07-27 21:26:48 -07003137 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003138 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003139 if !ctx.Config().AllowMissingDependencies() {
3140 ctx.ModuleErrorf("module %q is not a shared library", depName)
3141 } else {
3142 ctx.AddMissingDependencies([]string{depName})
3143 }
3144 return
3145 }
Jiyong Parke3867542020-12-03 17:28:25 +09003146
Jiyong Park7d55b612021-06-11 17:22:09 +09003147 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3148 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003149
Jiyong Park1ad8e162020-12-01 23:40:09 +09003150 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3151 // linkFile, depFile, and ptr.
3152 if c.IsStubs() {
3153 break
3154 }
3155
Colin Cross0de8a1e2020-09-18 14:15:30 -07003156 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3157 depFile = sharedLibraryInfo.TableOfContents
3158
Colin Cross6e511a92020-07-27 21:26:48 -07003159 ptr = &depPaths.SharedLibs
3160 switch libDepTag.Order {
3161 case earlyLibraryDependency:
3162 ptr = &depPaths.EarlySharedLibs
3163 depPtr = &depPaths.EarlySharedLibsDeps
3164 case normalLibraryDependency:
3165 ptr = &depPaths.SharedLibs
3166 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003167 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003168 case lateLibraryDependency:
3169 ptr = &depPaths.LateSharedLibs
3170 depPtr = &depPaths.LateSharedLibsDeps
3171 default:
3172 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003173 }
Colin Cross6e511a92020-07-27 21:26:48 -07003174 case libDepTag.static():
Colin Cross313aa542023-12-13 13:47:44 -08003175 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3176 if !isStaticLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003177 if !ctx.Config().AllowMissingDependencies() {
3178 ctx.ModuleErrorf("module %q is not a static library", depName)
3179 } else {
3180 ctx.AddMissingDependencies([]string{depName})
3181 }
3182 return
3183 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003184
3185 // Stubs lib doesn't link to the static lib dependencies. Don't set
3186 // linkFile, depFile, and ptr.
3187 if c.IsStubs() {
3188 break
3189 }
3190
Colin Cross0de8a1e2020-09-18 14:15:30 -07003191 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003192 if libDepTag.wholeStatic {
3193 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003194 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3195 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003196 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003197 // This case normally catches prebuilt static
3198 // libraries, but it can also occur when
3199 // AllowMissingDependencies is on and the
3200 // dependencies has no sources of its own
3201 // but has a whole_static_libs dependency
3202 // on a missing library. We want to depend
3203 // on the .a file so that there is something
3204 // in the dependency tree that contains the
3205 // error rule for the missing transitive
3206 // dependency.
3207 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003208 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003209 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3210 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003211 } else {
3212 switch libDepTag.Order {
3213 case earlyLibraryDependency:
3214 panic(fmt.Errorf("early static libs not suppported"))
3215 case normalLibraryDependency:
3216 // static dependencies will be handled separately so they can be ordered
3217 // using transitive dependencies.
3218 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003219 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003220 case lateLibraryDependency:
3221 ptr = &depPaths.LateStaticLibs
3222 default:
3223 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003224 }
3225 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003226 if libDepTag.unexportedSymbols {
3227 depPaths.LdFlags = append(depPaths.LdFlags,
3228 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3229 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003230 }
3231
Colin Cross6e511a92020-07-27 21:26:48 -07003232 if libDepTag.static() && !libDepTag.wholeStatic {
3233 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3234 ctx.ModuleErrorf("module %q not a static library", depName)
3235 return
3236 }
Logan Chien43d34c32017-12-20 01:17:32 +08003237
Colin Cross6e511a92020-07-27 21:26:48 -07003238 // When combining coverage files for shared libraries and executables, coverage files
3239 // in static libraries act as if they were whole static libraries. The same goes for
3240 // source based Abi dump files.
3241 if c, ok := ccDep.(*Module); ok {
3242 staticLib := c.linker.(libraryInterface)
3243 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3244 staticLib.objs().coverageFiles...)
3245 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3246 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003247 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003248 // Handle non-CC modules here
3249 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003250 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003251 }
3252 }
3253
Colin Cross6e511a92020-07-27 21:26:48 -07003254 if ptr != nil {
3255 if !linkFile.Valid() {
3256 if !ctx.Config().AllowMissingDependencies() {
3257 ctx.ModuleErrorf("module %q missing output file", depName)
3258 } else {
3259 ctx.AddMissingDependencies([]string{depName})
3260 }
3261 return
3262 }
3263 *ptr = append(*ptr, linkFile.Path())
3264 }
3265
3266 if depPtr != nil {
3267 dep := depFile
3268 if !dep.Valid() {
3269 dep = linkFile
3270 }
3271 *depPtr = append(*depPtr, dep.Path())
3272 }
3273
Colin Cross0de8a1e2020-09-18 14:15:30 -07003274 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3275 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3276 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3277 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3278
3279 if libDepTag.reexportFlags {
3280 reexportExporter(depExporterInfo)
3281 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3282 // Re-exported shared library headers must be included as well since they can help us with type information
3283 // about template instantiations (instantiated from their headers).
3284 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
3285 // scripts.
3286 c.sabi.Properties.ReexportedIncludes = append(
3287 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3288 }
3289
Spandan Das3faa7922024-02-26 19:42:32 +00003290 makeLibName := MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName()) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003291 switch {
3292 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003293 c.Properties.AndroidMkHeaderLibs = append(
3294 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003295 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003296 if lib := moduleLibraryInterface(dep); lib != nil {
3297 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003298 // Add the dependency to the APEX(es) providing the library so that
3299 // m <module> can trigger building the APEXes as well.
Colin Cross313aa542023-12-13 13:47:44 -08003300 depApexInfo, _ := android.OtherModuleProvider(ctx, dep, android.ApexInfoProvider)
Jiyong Parkab50b072021-05-12 17:13:56 +09003301 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003302 c.Properties.ApexesProvidingSharedLibs = append(
3303 c.Properties.ApexesProvidingSharedLibs, an)
3304 }
3305 }
3306 }
3307
3308 // Note: the order of libs in this list is not important because
3309 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003310 c.Properties.AndroidMkSharedLibs = append(
3311 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003312 case libDepTag.static():
3313 if libDepTag.wholeStatic {
3314 c.Properties.AndroidMkWholeStaticLibs = append(
3315 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3316 } else {
3317 c.Properties.AndroidMkStaticLibs = append(
3318 c.Properties.AndroidMkStaticLibs, makeLibName)
3319 }
3320 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003321 } else if !c.IsStubs() {
3322 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3323
Colin Cross6e511a92020-07-27 21:26:48 -07003324 switch depTag {
3325 case runtimeDepTag:
3326 c.Properties.AndroidMkRuntimeLibs = append(
Spandan Das3faa7922024-02-26 19:42:32 +00003327 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName())+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003328 case objDepTag:
3329 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3330 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003331 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003332 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003333 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003334 case dynamicLinkerDepTag:
3335 depPaths.DynamicLinker = linkFile
3336 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003337 }
Colin Crossca860ac2016-01-04 14:34:37 -08003338 })
3339
Jeff Gaston294356f2017-09-27 17:05:30 -07003340 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003341 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3342 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3343 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003344
Colin Crossdd84e052017-05-17 13:44:16 -07003345 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003346 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003347 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3348 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003349 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003350 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3351 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003352 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003353 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003354 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003355
3356 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003357 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003358 }
Colin Crossdd84e052017-05-17 13:44:16 -07003359
Colin Crossca860ac2016-01-04 14:34:37 -08003360 return depPaths
3361}
3362
Spandan Das604f3762023-03-16 22:51:40 +00003363func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003364 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003365 thisModule, ok := ctx.Module().(android.ApexModule)
3366 if !ok {
3367 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3368 }
3369
Kiyoung Kimaa394802024-01-08 12:55:45 +09003370 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003371 bootstrap := false
3372 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3373 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3374 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003375 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003376 bootstrap = linkable.Bootstrap()
3377 }
3378
Colin Crossff694a82023-12-13 15:54:49 -08003379 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003380
3381 useStubs := false
3382
Kiyoung Kimaa394802024-01-08 12:55:45 +09003383 if lib := moduleLibraryInterface(dep); lib.buildStubs() && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003384 if !apexInfo.IsForPlatform() {
3385 // For platform libraries, use current version of LLNDK
3386 // If this is for use_vendor apex we will apply the same rules
3387 // of apex sdk enforcement below to choose right version.
3388 useStubs = true
3389 }
3390 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3391 // If not building for APEX or the containing APEX allows the use of
3392 // platform APIs, use stubs only when it is from an APEX (and not from
3393 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3394 // bootstrap modules, always link to non-stub variant
3395 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3396
3397 isApexImportedApiLibrary := false
3398
3399 if cc, ok := dep.(*Module); ok {
3400 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3401 if apiLibrary.hasApexStubs() {
3402 isApexImportedApiLibrary = true
3403 }
3404 }
3405 }
3406
3407 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3408
3409 if useStubs {
3410 // Another exception: if this module is a test for an APEX, then
3411 // it is linked with the non-stub variant of a module in the APEX
3412 // as if this is part of the APEX.
Colin Crossff694a82023-12-13 15:54:49 -08003413 testFor, _ := android.ModuleProvider(ctx, android.ApexTestForInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003414 for _, apexContents := range testFor.ApexContents {
3415 if apexContents.DirectlyInApex(depName) {
3416 useStubs = false
3417 break
3418 }
3419 }
3420 }
3421 if useStubs {
3422 // Yet another exception: If this module and the dependency are
3423 // available to the same APEXes then skip stubs between their
3424 // platform variants. This complements the test_for case above,
3425 // which avoids the stubs on a direct APEX library dependency, by
3426 // avoiding stubs for indirect test dependencies as well.
3427 //
3428 // TODO(b/183882457): This doesn't work if the two libraries have
3429 // only partially overlapping apex_available. For that test_for
3430 // modules would need to be split into APEX variants and resolved
3431 // separately for each APEX they have access to.
3432 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3433 useStubs = false
3434 }
3435 }
3436 } else {
3437 // If building for APEX, use stubs when the parent is in any APEX that
3438 // the child is not in.
3439 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3440 }
3441
3442 return useStubs
3443}
3444
3445// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3446// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3447// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3448// has different level of updatability. For example, if a library foo in an APEX depends on a
3449// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3450// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3451// same APEX as foo, the non-stub variant of bar is used.
3452func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3453 depTag := ctx.OtherModuleDependencyTag(dep)
3454 libDepTag, ok := depTag.(libraryDependencyTag)
3455 if !ok || !libDepTag.shared() {
3456 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3457 }
3458
Colin Cross313aa542023-12-13 13:47:44 -08003459 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3460 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3461 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003462
3463 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003464 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003465 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003466 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3467 toUse := stubs[len(stubs)-1]
3468 sharedLibraryInfo = toUse.SharedLibraryInfo
3469 depExporterInfo = toUse.FlagExporterInfo
3470 }
3471 }
3472 return sharedLibraryInfo, depExporterInfo
3473}
3474
Colin Cross0de8a1e2020-09-18 14:15:30 -07003475// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3476// to match the topological order of the dependency tree, including any static analogues of
3477// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3478// of the transitive dependencies.
Colin Crossc85750b2022-04-21 12:50:51 -07003479func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet[android.Path]) {
3480 transitiveStaticLibsBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003481 var staticPaths android.Paths
3482 for _, staticDep := range staticDeps {
3483 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3484 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3485 }
3486 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003487 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3488 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003489 }
3490 }
3491 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3492
3493 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3494
3495 // reorder the dependencies based on transitive dependencies
3496 staticPaths = android.FirstUniquePaths(staticPaths)
3497 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3498
3499 if len(orderedStaticPaths) != len(staticPaths) {
3500 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3501 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3502 }
3503
3504 return orderedStaticPaths, transitiveStaticLibs
3505}
3506
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003507// BaseLibName trims known prefixes and suffixes
3508func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003509 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3510 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003511 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003512 return libName
3513}
3514
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003515func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003516 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003517 ccDepModule, _ := ccDep.(*Module)
3518 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003519 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003520
Justin Yuncbca3732021-02-03 19:24:13 +09003521 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003522 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003523 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003524 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003525
Ivan Lozanod1dec542021-05-26 15:33:11 -04003526 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003527 }
3528 }
3529
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003530 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3531 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003532 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3533 // core module instead.
3534 return libName
Kiyoung Kimaa394802024-01-08 12:55:45 +09003535 } else if ccDep.InVendorOrProduct() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003536 // The vendor and product modules in Make will have been renamed to not conflict with the
3537 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003538 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003539 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003540 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003541 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003542 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003543 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003544 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003545 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003546 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003547 } else {
3548 return libName
3549 }
3550}
3551
Colin Crossca860ac2016-01-04 14:34:37 -08003552func (c *Module) InstallInData() bool {
3553 if c.installer == nil {
3554 return false
3555 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003556 return c.installer.inData()
3557}
3558
3559func (c *Module) InstallInSanitizerDir() bool {
3560 if c.installer == nil {
3561 return false
3562 }
3563 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003564 return true
3565 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003566 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003567}
3568
Yifan Hong1b3348d2020-01-21 15:53:22 -08003569func (c *Module) InstallInRamdisk() bool {
3570 return c.InRamdisk()
3571}
3572
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003573func (c *Module) InstallInVendorRamdisk() bool {
3574 return c.InVendorRamdisk()
3575}
3576
Jiyong Parkf9332f12018-02-01 00:54:12 +09003577func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003578 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003579}
3580
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003581func (c *Module) MakeUninstallable() {
3582 if c.installer == nil {
3583 c.ModuleBase.MakeUninstallable()
3584 return
3585 }
3586 c.installer.makeUninstallable(c)
3587}
3588
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003589func (c *Module) HostToolPath() android.OptionalPath {
3590 if c.installer == nil {
3591 return android.OptionalPath{}
3592 }
3593 return c.installer.hostToolPath()
3594}
3595
Nan Zhangd4e641b2017-07-12 12:55:28 -07003596func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3597 return c.outputFile
3598}
3599
Colin Cross41955e82019-05-29 14:40:35 -07003600func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3601 switch tag {
3602 case "":
3603 if c.outputFile.Valid() {
3604 return android.Paths{c.outputFile.Path()}, nil
3605 }
3606 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003607 case "unstripped":
3608 if c.linker != nil {
3609 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3610 }
3611 return nil, nil
Wei Li5f5d2712023-12-11 15:40:29 -08003612 case "stripped_all":
3613 if c.linker != nil {
3614 return android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), nil
3615 }
3616 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003617 default:
3618 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003619 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003620}
3621
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003622func (c *Module) static() bool {
3623 if static, ok := c.linker.(interface {
3624 static() bool
3625 }); ok {
3626 return static.static()
3627 }
3628 return false
3629}
3630
Jiyong Park379de2f2018-12-19 02:47:14 +09003631func (c *Module) staticBinary() bool {
3632 if static, ok := c.linker.(interface {
3633 staticBinary() bool
3634 }); ok {
3635 return static.staticBinary()
3636 }
3637 return false
3638}
3639
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003640func (c *Module) testBinary() bool {
3641 if test, ok := c.linker.(interface {
3642 testBinary() bool
3643 }); ok {
3644 return test.testBinary()
3645 }
3646 return false
3647}
3648
Jingwen Chen537242c2022-08-24 11:53:27 +00003649func (c *Module) testLibrary() bool {
3650 if test, ok := c.linker.(interface {
3651 testLibrary() bool
3652 }); ok {
3653 return test.testLibrary()
3654 }
3655 return false
3656}
3657
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003658func (c *Module) benchmarkBinary() bool {
3659 if b, ok := c.linker.(interface {
3660 benchmarkBinary() bool
3661 }); ok {
3662 return b.benchmarkBinary()
3663 }
3664 return false
3665}
3666
3667func (c *Module) fuzzBinary() bool {
3668 if f, ok := c.linker.(interface {
3669 fuzzBinary() bool
3670 }); ok {
3671 return f.fuzzBinary()
3672 }
3673 return false
3674}
3675
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003676// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3677func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003678 if h, ok := c.linker.(interface {
3679 header() bool
3680 }); ok {
3681 return h.header()
3682 }
3683 return false
3684}
3685
Ivan Lozanod7586b62021-04-01 09:49:36 -04003686func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003687 if b, ok := c.linker.(interface {
3688 binary() bool
3689 }); ok {
3690 return b.binary()
3691 }
3692 return false
3693}
3694
Justin Yun5e035862021-06-29 20:50:37 +09003695func (c *Module) StaticExecutable() bool {
3696 if b, ok := c.linker.(*binaryDecorator); ok {
3697 return b.static()
3698 }
3699 return false
3700}
3701
Ivan Lozanod7586b62021-04-01 09:49:36 -04003702func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003703 if o, ok := c.linker.(interface {
3704 object() bool
3705 }); ok {
3706 return o.object()
3707 }
3708 return false
3709}
3710
Kiyoung Kim37693d02024-04-04 09:56:15 +09003711func (m *Module) Dylib() bool {
3712 return false
3713}
3714
3715func (m *Module) Rlib() bool {
3716 return false
3717}
3718
Ivan Lozanof9e21722020-12-02 09:00:51 -05003719func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003720 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003721 if c.IsLlndk() {
3722 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003723 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003724 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003725 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003726 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003727 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003728 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003729 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003730 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003731 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003732 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003733 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003734 return "native:product"
3735 }
Jooyung Han38002912019-05-16 04:01:54 +09003736 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003737 } else if c.InRamdisk() {
3738 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003739 } else if c.InVendorRamdisk() {
3740 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003741 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003742 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003743 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003744 return "native:ndk:none:none"
3745 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3746 //family, link := getNdkStlFamilyAndLinkType(c)
3747 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003748 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003749 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003750 } else {
3751 return "native:platform"
3752 }
3753}
3754
Jiyong Park9d452992018-10-03 00:38:19 +09003755// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003756// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003757func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003758 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003759 // Stub libs and prebuilt libs in a versioned SDK are not
3760 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003761 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003762 } else if _, ok := c.linker.(testPerSrc); ok {
3763 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003764 }
3765 return false
3766}
3767
Jiyong Parka90ca002019-10-07 15:47:24 +09003768func (c *Module) AvailableFor(what string) bool {
3769 if linker, ok := c.linker.(interface {
3770 availableFor(string) bool
3771 }); ok {
3772 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3773 } else {
3774 return c.ApexModuleBase.AvailableFor(what)
3775 }
3776}
3777
Jiyong Park62304bb2020-04-13 16:19:48 +09003778func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003779 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003780}
3781
Paul Duffin0cb37b92020-03-04 14:52:46 +00003782func (c *Module) EverInstallable() bool {
3783 return c.installer != nil &&
3784 // Check to see whether the module is actually ever installable.
3785 c.installer.everInstallable()
3786}
3787
Ivan Lozanod7586b62021-04-01 09:49:36 -04003788func (c *Module) PreventInstall() bool {
3789 return c.Properties.PreventInstall
3790}
3791
3792func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003793 if c.library != nil {
3794 if i := c.library.installable(); i != nil {
3795 return i
3796 }
3797 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003798 return c.Properties.Installable
3799}
3800
3801func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003802 ret := c.EverInstallable() &&
3803 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003804 proptools.BoolDefault(c.Installable(), true) &&
3805 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003806
3807 // The platform variant doesn't need further condition. Apex variants however might not
3808 // be installable because it will likely to be included in the APEX and won't appear
3809 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003810 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003811 return ret
3812 }
3813
3814 // Special case for modules that are configured to be installed to /data, which includes
3815 // test modules. For these modules, both APEX and non-APEX variants are considered as
3816 // installable. This is because even the APEX variants won't be included in the APEX, but
3817 // will anyway be installed to /data/*.
3818 // See b/146995717
3819 if c.InstallInData() {
3820 return ret
3821 }
3822
3823 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003824}
3825
Logan Chien41eabe62019-04-10 13:33:58 +08003826func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3827 if c.linker != nil {
3828 if library, ok := c.linker.(*libraryDecorator); ok {
3829 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3830 }
3831 }
3832}
3833
Jiyong Park45bf82e2020-12-15 22:29:02 +09003834var _ android.ApexModule = (*Module)(nil)
3835
3836// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003837func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003838 depTag := ctx.OtherModuleDependencyTag(dep)
3839 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3840
3841 if cc, ok := dep.(*Module); ok {
3842 if cc.HasStubsVariants() {
3843 if isLibDepTag && libDepTag.shared() {
3844 // dynamic dep to a stubs lib crosses APEX boundary
3845 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003846 }
Colin Cross6e511a92020-07-27 21:26:48 -07003847 if IsRuntimeDepTag(depTag) {
3848 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003849 return false
3850 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003851 }
Zhijun Heec285872021-04-24 10:47:08 -07003852 if cc.IsLlndk() {
3853 return false
3854 }
Colin Crossaac32222020-07-29 12:51:56 -07003855 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003856 // shared_lib dependency from a static lib is considered as crossing
3857 // the APEX boundary because the dependency doesn't actually is
3858 // linked; the dependency is used only during the compilation phase.
3859 return false
3860 }
Jiyong Parke3867542020-12-03 17:28:25 +09003861
3862 if isLibDepTag && libDepTag.excludeInApex {
3863 return false
3864 }
Colin Cross6e511a92020-07-27 21:26:48 -07003865 }
Colin Crossc1b36442021-05-06 13:42:48 -07003866 if depTag == stubImplDepTag {
3867 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003868 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003869 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003870 if depTag == staticVariantTag {
3871 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3872 // actually mean that the static lib (and its dependencies) are copied into the
3873 // APEX.
3874 return false
3875 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003876 return true
3877}
3878
Jiyong Park45bf82e2020-12-15 22:29:02 +09003879// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003880func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3881 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003882 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3883 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3884 return nil
3885 }
Jooyung Han749dc692020-04-15 11:03:39 +09003886 // We don't check for prebuilt modules
3887 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3888 return nil
3889 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003890
Jooyung Han749dc692020-04-15 11:03:39 +09003891 minSdkVersion := c.MinSdkVersion()
3892 if minSdkVersion == "apex_inherit" {
3893 return nil
3894 }
3895 if minSdkVersion == "" {
3896 // JNI libs within APK-in-APEX fall into here
3897 // Those are okay to set sdk_version instead
3898 // We don't have to check if this is a SDK variant because
3899 // non-SDK variant resets sdk_version, which works too.
3900 minSdkVersion = c.SdkVersion()
3901 }
Dan Albertc8060532020-07-22 22:32:17 -07003902 if minSdkVersion == "" {
3903 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3904 }
3905 // Not using nativeApiLevelFromUser because the context here is not
3906 // necessarily a native context.
3907 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003908 if err != nil {
3909 return err
3910 }
Dan Albertc8060532020-07-22 22:32:17 -07003911
Colin Cross8ca61c12022-10-06 21:00:14 -07003912 // A dependency only needs to support a min_sdk_version at least
3913 // as high as the api level that the architecture was introduced in.
3914 // This allows introducing new architectures in the platform that
3915 // need to be included in apexes that normally require an older
3916 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08003917 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07003918 if sdkVersion.LessThan(minApiForArch) {
3919 sdkVersion = minApiForArch
3920 }
3921
Dan Albertc8060532020-07-22 22:32:17 -07003922 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003923 return fmt.Errorf("newer SDK(%v)", ver)
3924 }
3925 return nil
3926}
3927
Paul Duffinb5769c12021-05-12 16:16:51 +01003928// Implements android.ApexModule
3929func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3930 // stub libraries and native bridge libraries are always available to platform
3931 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3932}
3933
Jooyung Han91f92032022-02-04 12:36:33 +09003934// Overrides android.ApexModuleBase.UniqueApexVariations
3935func (c *Module) UniqueApexVariations() bool {
3936 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
3937 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
3938 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09003939 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09003940 return c.UseVndk() && c.IsVndk()
3941}
3942
Inseob Kima1888ce2022-10-04 14:42:02 +09003943func (c *Module) overriddenModules() []string {
3944 if o, ok := c.linker.(overridable); ok {
3945 return o.overriddenModules()
3946 }
3947 return nil
3948}
3949
Liz Kammer35ca77e2021-12-22 15:31:40 -05003950type moduleType int
3951
3952const (
3953 unknownType moduleType = iota
3954 binary
3955 object
3956 fullLibrary
3957 staticLibrary
3958 sharedLibrary
3959 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00003960 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00003961 ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00003962 ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05003963)
3964
3965func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00003966 if c.testBinary() {
3967 // testBinary is also a binary, so this comes before the c.Binary()
3968 // conditional. A testBinary has additional implicit dependencies and
3969 // other test-only semantics.
3970 return testBin
3971 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003972 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003973 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003974 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00003975 } else if c.testLibrary() {
3976 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
3977 // will let them add implicit compile deps on gtest, for example.
3978 //
Liz Kammerefc51d92023-04-21 15:11:25 -04003979 // For now, treat them as regular libraries.
3980 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003981 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05003982 static := false
3983 shared := false
3984 if library, ok := c.linker.(*libraryDecorator); ok {
3985 static = library.MutatedProperties.BuildStatic
3986 shared = library.MutatedProperties.BuildShared
3987 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
3988 static = library.MutatedProperties.BuildStatic
3989 shared = library.MutatedProperties.BuildShared
3990 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003991 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003992 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003993 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003994 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003995 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003996 return staticLibrary
3997 }
3998 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00003999 } else if c.isNDKStubLibrary() {
4000 return ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004001 } else if c.IsNdkPrebuiltStl() {
4002 return ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004003 }
4004 return unknownType
4005}
4006
Colin Crosscfad1192015-11-02 16:43:11 -08004007// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004008type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004009 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004010 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004011 android.ApexModuleBase
LaMont Jonesafe7baf2024-01-09 22:47:39 +00004012
4013 // Aconfig files for all transitive deps. Also exposed via TransitiveDeclarationsInfo
4014 mergedAconfigFiles map[string]android.Paths
Colin Crosscfad1192015-11-02 16:43:11 -08004015}
4016
Patrice Arrudac249c712019-03-19 17:00:29 -07004017// cc_defaults provides a set of properties that can be inherited by other cc
4018// modules. A module can use the properties from a cc_defaults using
4019// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4020// merged (when possible) by prepending the default module's values to the
4021// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004022func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004023 return DefaultsFactory()
4024}
4025
Colin Cross36242852017-06-23 15:06:31 -07004026func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004027 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004028
Colin Cross36242852017-06-23 15:06:31 -07004029 module.AddProperties(props...)
4030 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004031 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004032 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004033 &BaseCompilerProperties{},
4034 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004035 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004036 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004037 &StaticProperties{},
4038 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004039 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004040 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004041 &TestLinkerProperties{},
4042 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004043 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004044 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004045 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004046 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004047 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004048 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004049 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004050 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004051 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004052 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004053 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004054 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004055 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004056 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004057 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004058 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4059 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004060 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004061 )
Colin Crosscfad1192015-11-02 16:43:11 -08004062
Jooyung Hancc372c52019-09-25 15:18:44 +09004063 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004064
4065 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004066}
4067
Jiyong Park2286afd2020-06-16 21:58:53 +09004068func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004069 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004070}
4071
Kiyoung Kim51279d32022-08-24 14:10:46 +09004072func (c *Module) isImportedApiLibrary() bool {
4073 _, ok := c.linker.(*apiLibraryDecorator)
4074 return ok
4075}
4076
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004077func kytheExtractAllFactory() android.Singleton {
4078 return &kytheExtractAllSingleton{}
4079}
4080
4081type kytheExtractAllSingleton struct {
4082}
4083
4084func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4085 var xrefTargets android.Paths
4086 ctx.VisitAllModules(func(module android.Module) {
4087 if ccModule, ok := module.(xref); ok {
4088 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4089 }
4090 })
4091 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4092 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004093 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004094 }
4095}
4096
Jihoon Kangf78a8902022-09-01 22:47:07 +00004097func (c *Module) Partition() string {
4098 if p, ok := c.installer.(interface {
4099 getPartition() string
4100 }); ok {
4101 return p.getPartition()
4102 }
4103 return ""
4104}
4105
Spandan Das2b6dfb52024-01-19 00:22:22 +00004106type sourceModuleName interface {
4107 sourceModuleName() string
4108}
4109
4110func (c *Module) BaseModuleName() string {
4111 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4112 // if the prebuilt module sets a source_module_name in Android.bp, use that
4113 return smn.sourceModuleName()
4114 }
4115 return c.ModuleBase.BaseModuleName()
4116}
4117
Colin Cross06a931b2015-10-28 17:23:31 -07004118var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004119var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004120var BoolPtr = proptools.BoolPtr
4121var String = proptools.String
4122var StringPtr = proptools.StringPtr