blob: 9f32c447792f96f7a8c2b7b5bc27baf46bf4eed1 [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"
Colin Cross97ba0732015-03-23 17:50:24 -070028 "github.com/google/blueprint"
Colin Cross06a931b2015-10-28 17:23:31 -070029 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070030
Vinh Tran367d89d2023-04-28 11:21:25 -040031 "android/soong/aidl_library"
Colin Cross635c3b02016-05-18 15:37:25 -070032 "android/soong/android"
Colin Crossb98c8b02016-07-29 13:44:28 -070033 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070034 "android/soong/fuzz"
Colin Cross5049f022015-03-18 13:28:46 -070035 "android/soong/genrule"
Kiyoung Kim487689e2022-07-26 09:48:22 +090036 "android/soong/multitree"
Rob Seymour925aa092021-08-10 20:42:03 +000037 "android/soong/snapshot"
Colin Cross3f40fa42015-01-30 17:27:36 -080038)
39
Colin Cross463a90e2015-06-17 14:20:06 -070040func init() {
Paul Duffin036e7002019-12-19 19:16:28 +000041 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -070042
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()
Vinh Tran44cb78c2023-03-09 22:07:19 -050057 ctx.BottomUp("fdo_profile", fdoProfileMutator)
Colin Cross1e676be2016-10-12 14:38:15 -070058 })
Colin Cross16b23492016-01-06 14:41:07 -080059
Paul Duffin036e7002019-12-19 19:16:28 +000060 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -040061 for _, san := range Sanitizers {
62 san.registerMutators(ctx)
63 }
Dan Willemsen581341d2017-02-09 16:16:31 -080064
Colin Cross0b908332019-06-19 23:00:20 -070065 ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel()
Jiyong Park379de2f2018-12-19 02:47:14 +090066 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
Ivan Lozano30c5db22018-02-21 15:49:20 -080067
Cory Barkera1da26f2022-06-07 20:12:06 +000068 ctx.TopDown("fuzz_deps", fuzzMutatorDeps)
Cory Barkera1da26f2022-06-07 20:12:06 +000069
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -080070 ctx.BottomUp("coverage", coverageMutator).Parallel()
Stephen Craneba090d12017-05-09 15:44:35 -070071
Yi Kongeb8efc92021-12-09 18:06:29 +080072 ctx.TopDown("afdo_deps", afdoDepsMutator)
73 ctx.BottomUp("afdo", afdoMutator).Parallel()
74
Sharjeel Khanc6a93d82023-07-18 21:01:11 +000075 ctx.TopDown("orderfile_deps", orderfileDepsMutator)
76 ctx.BottomUp("orderfile", orderfileMutator).Parallel()
77
Stephen Craneba090d12017-05-09 15:44:35 -070078 ctx.TopDown("lto_deps", ltoDepsMutator)
79 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090080
Jooyung Han479ca172020-10-19 18:51:07 +090081 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090082 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070083 })
Colin Crossb98c8b02016-07-29 13:44:28 -070084
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080085 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
86 // sabi mutator needs to be run after apex mutator finishes.
87 ctx.TopDown("sabi_deps", sabiDepsMutator)
88 })
89
LaMont Jones0c10e4d2023-05-16 00:58:37 +000090 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070091}
92
Chris Parsonsef6e0cf2020-12-01 18:26:21 -050093// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
94// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
95// edges to these modules.
96// This object is constructed in DepsMutator, by calling to various module delegates to set
97// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
98// dependencies.
99// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
100// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800101type Deps struct {
102 SharedLibs, LateSharedLibs []string
103 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800104 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800105 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700106
Colin Cross3e5e7782022-06-17 22:17:05 +0000107 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
108 // prevent automatically exporting symbols.
109 UnexportedStaticLibs []string
110
Chris Parsons79d66a52020-06-05 17:26:16 -0400111 // Used for data dependencies adjacent to tests
112 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700113 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400114
Yo Chiang219968c2020-09-22 18:45:04 +0800115 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
116 SystemSharedLibs []string
117
Vinh Tran367d89d2023-04-28 11:21:25 -0400118 // Used by DepMutator to pass aidl_library modules to aidl compiler
119 AidlLibs []string
120
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500121 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800122 StaticUnwinderIfLegacy bool
123
Colin Cross5950f382016-12-13 12:50:57 -0800124 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700125
Colin Cross81413472016-04-11 14:37:39 -0700126 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700127
Dan Willemsenb40aab62016-04-20 14:21:14 -0700128 GeneratedSources []string
129 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900130 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700131
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700132 ReexportGeneratedHeaders []string
133
Colin Crossc465efd2021-06-11 18:00:04 -0700134 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700135
136 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700137 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900138
139 // List of libs that need to be excluded for APEX variant
140 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900141 // List of libs that need to be excluded for non-APEX variant
142 ExcludeLibsForNonApex []string
Colin Crossc472d572015-03-17 15:06:21 -0700143}
144
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500145// PathDeps is a struct containing file paths to dependencies of a module.
146// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
147// It's used to construct flags for various build statements (such as for compiling and linking).
148// It is then passed to module decorator functions responsible for registering build statements
149// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800150type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700151 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900152 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700153 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900154 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700155 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700156 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700157
Colin Cross0de8a1e2020-09-18 14:15:30 -0700158 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossc85750b2022-04-21 12:50:51 -0700159 TranstiveStaticLibrariesForOrdering *android.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700160
Colin Cross26c34ed2016-09-30 17:10:16 -0700161 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100162 Objs Objects
163 // Paths to .o files in dependencies that provide them. Note that these lists
164 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800165 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700166 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700167
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100168 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
169 // the libs from all whole_static_lib dependencies.
170 WholeStaticLibsFromPrebuilts android.Paths
171
Colin Cross26c34ed2016-09-30 17:10:16 -0700172 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700173 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900174 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700175
Inseob Kimd110f872019-12-06 13:15:38 +0900176 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000177 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900178 IncludeDirs android.Paths
179 SystemIncludeDirs android.Paths
180 ReexportedDirs android.Paths
181 ReexportedSystemDirs android.Paths
182 ReexportedFlags []string
183 ReexportedGeneratedHeaders android.Paths
184 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700185
Colin Cross26c34ed2016-09-30 17:10:16 -0700186 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700187 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700188
Dan Willemsena0790e32018-10-12 00:24:23 -0700189 // Path to the dynamic linker binary
190 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700191
192 // For Darwin builds, the path to the second architecture's output that should
193 // be combined with this architectures's output into a FAT MachO file.
194 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400195
196 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
197 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700198}
199
Colin Cross4af21ed2019-11-04 09:37:55 -0800200// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
201// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
202// command line so they can be overridden by the local module flags).
203type LocalOrGlobalFlags struct {
204 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700205 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800206 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700207 CFlags []string // Flags that apply to C and C++ source files
208 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
209 ConlyFlags []string // Flags that apply to C source files
210 CppFlags []string // Flags that apply to C++ source files
211 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700212 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800213}
214
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500215// Flags contains various types of command line flags (and settings) for use in building build
216// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800217type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500218 // Local flags (which individual modules are responsible for). These may override global flags.
219 Local LocalOrGlobalFlags
220 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800221 Global LocalOrGlobalFlags
222
223 aidlFlags []string // Flags that apply to aidl source files
224 rsFlags []string // Flags that apply to renderscript source files
225 libFlags []string // Flags to add libraries early to the link order
226 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
227 TidyFlags []string // Flags that apply to clang-tidy
228 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700229
Colin Crossc3199482017-03-30 15:03:04 -0700230 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800231 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700232 SystemIncludeFlags []string
233
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800234 Toolchain config.Toolchain
235 Tidy bool // True if ninja .tidy rules should be generated.
236 NeedTidyFiles bool // True if module link should depend on .tidy files
237 GcovCoverage bool // True if coverage files should be generated.
238 SAbiDump bool // True if header abi dumps should be generated.
239 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800240
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500241 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800242 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500243 // The target-device system path to the dynamic linker.
244 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800245
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700246 CFlagsDeps android.Paths // Files depended on by compiler flags
247 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800248
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500249 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700250 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800251
Colin Cross19878da2019-03-28 14:45:07 -0700252 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700253 protoC bool // Whether to use C instead of C++
254 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700255
256 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200257 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700258}
259
Colin Crossca860ac2016-01-04 14:34:37 -0800260// Properties used to compile all C or C++ modules
261type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700262 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800263 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700264
Jiyong Parkb35a8192020-08-10 15:59:36 +0900265 // The API level that this module is built against. The APIs of this API level will be
266 // visible at build time, but use of any APIs newer than min_sdk_version will render the
267 // module unloadable on older devices. In the future it will be possible to weakly-link new
268 // APIs, making the behavior match Java: such modules will load on older devices, but
269 // calling new APIs on devices that do not support them will result in a crash.
270 //
271 // This property has the same behavior as sdk_version does for Java modules. For those
272 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
273 // does for Java code.
274 //
275 // In addition, setting this property causes two variants to be built, one for the platform
276 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800277 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700278
Jiyong Parkb35a8192020-08-10 15:59:36 +0900279 // Minimum OS API level supported by this C or C++ module. This property becomes the value
280 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
281 // this property is also used to ensure that the min_sdk_version of the containing module is
282 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
283 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
284 // min_sdk_version of the containing APEX. When the module
285 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900286 Min_sdk_version *string
287
Colin Crossc511bc52020-04-07 16:50:32 +0000288 // If true, always create an sdk variant and don't create a platform variant.
289 Sdk_variant_only *bool
290
Jiyong Parkde866cb2018-12-07 23:08:36 +0900291 AndroidMkSharedLibs []string `blueprint:"mutated"`
292 AndroidMkStaticLibs []string `blueprint:"mutated"`
293 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
294 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700295 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900296 HideFromMake bool `blueprint:"mutated"`
297 PreventInstall bool `blueprint:"mutated"`
298 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700299
Yo Chiang219968c2020-09-22 18:45:04 +0800300 // Set by DepsMutator.
301 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
302
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200303 // The name of the image this module is built for, suffixed with a '.'
Justin Yun5f7f7e82019-11-18 19:52:14 +0900304 ImageVariationPrefix string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200305
306 // The VNDK version this module is built against. If empty, the module is not
307 // build against the VNDK.
308 VndkVersion string `blueprint:"mutated"`
309
310 // Suffix for the name of Android.mk entries generated by this module
311 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800312
313 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
314 // file
315 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900316
Yifan Hong39143a92020-10-26 12:43:12 -0700317 // Make this module available when building for ramdisk.
318 // On device without a dedicated recovery partition, the module is only
319 // available after switching root into
320 // /first_stage_ramdisk. To expose the module before switching root, install
321 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800322 Ramdisk_available *bool
323
Yifan Hong39143a92020-10-26 12:43:12 -0700324 // Make this module available when building for vendor ramdisk.
325 // On device without a dedicated recovery partition, the module is only
326 // available after switching root into
327 // /first_stage_ramdisk. To expose the module before switching root, install
328 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700329 Vendor_ramdisk_available *bool
330
Jiyong Parkf9332f12018-02-01 00:54:12 +0900331 // Make this module available when building for recovery
332 Recovery_available *bool
333
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200334 // Used by imageMutator, set by ImageMutatorBegin()
335 CoreVariantNeeded bool `blueprint:"mutated"`
336 RamdiskVariantNeeded bool `blueprint:"mutated"`
337 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
338 RecoveryVariantNeeded bool `blueprint:"mutated"`
339
340 // A list of variations for the "image" mutator of the form
341 //<image name> '.' <version char>, for example, 'vendor.S'
342 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900343
344 // Allows this module to use non-APEX version of libraries. Useful
345 // for building binaries that are started before APEXes are activated.
346 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900347
348 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
349 // see soong/cc/config/vndk.go
350 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900351
352 // Used by vendor snapshot to record dependencies from snapshot modules.
353 SnapshotSharedLibs []string `blueprint:"mutated"`
Justin Yun5e035862021-06-29 20:50:37 +0900354 SnapshotStaticLibs []string `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900355 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000356
Colin Cross1bc94122021-10-28 13:25:54 -0700357 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000358
359 // Set by factories of module types that can only be referenced from variants compiled against
360 // the SDK.
361 AlwaysSdk bool `blueprint:"mutated"`
362
363 // Variant is an SDK variant created by sdkMutator
364 IsSdkVariant bool `blueprint:"mutated"`
365 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
366 // variant to have a ".sdk" suffix.
367 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700368
369 // Normally Soong uses the directory structure to decide which modules
370 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800371 // different snapshots (vendor, recovery, etc.), but this property
372 // allows a partner to exclude a module normally thought of as a
373 // framework module from the vendor snapshot.
374 Exclude_from_vendor_snapshot *bool
375
376 // Normally Soong uses the directory structure to decide which modules
377 // should be included (framework) or excluded (non-framework) from the
378 // different snapshots (vendor, recovery, etc.), but this property
379 // allows a partner to exclude a module normally thought of as a
380 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800381 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900382
383 // List of APEXes that this module has private access to for testing purpose. The module
384 // can depend on libraries that are not exported by the APEXes and use private symbols
385 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000386 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800387
388 Target struct {
389 Platform struct {
390 // List of modules required by the core variant.
391 Required []string `android:"arch_variant"`
392
393 // List of modules not required by the core variant.
394 Exclude_required []string `android:"arch_variant"`
395 } `android:"arch_variant"`
396
397 Recovery struct {
398 // List of modules required by the recovery variant.
399 Required []string `android:"arch_variant"`
400
401 // List of modules not required by the recovery variant.
402 Exclude_required []string `android:"arch_variant"`
403 } `android:"arch_variant"`
404 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700405}
406
407type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900408 // whether this module should be allowed to be directly depended by other
409 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900410 // If set to true, two variants will be built separately, one like
411 // normal, and the other limited to the set of libraries and headers
412 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700413 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900414 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700415 // so it shouldn't have any unversioned runtime dependencies, or
416 // make assumptions about the system that may not be true in the
417 // future.
418 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900419 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900420 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900421 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900422 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900423 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700424 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
425 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900426
Justin Yunebcf0c52021-01-08 18:00:19 +0900427 // This is the same as the "vendor_available" except that the install path
428 // of the vendor variant is /odm or /vendor/odm.
429 // By replacing "vendor_available: true" with "odm_available: true", the
430 // module will install its vendor variant to the /odm partition or /vendor/odm.
431 // As the modules with "odm_available: true" still create the vendor variants,
432 // they can link to the other vendor modules as the vendor_available modules do.
433 // Also, the vendor modules can link to odm_available modules.
434 //
435 // It may not be used for VNDK modules.
436 Odm_available *bool
437
Justin Yun63e9ec72020-10-29 16:49:43 +0900438 // whether this module should be allowed to be directly depended by other
439 // modules with `product_specific: true` or `product_available: true`.
440 // If set to true, an additional product variant will be built separately
441 // that is limited to the set of libraries and headers that are exposed to
442 // /product modules.
443 //
444 // The product variant may be used with a different (newer) /system,
445 // so it shouldn't have any unversioned runtime dependencies, or
446 // make assumptions about the system that may not be true in the
447 // future.
448 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900449 // If set to false, this module becomes inaccessible from /product modules.
450 //
451 // Different from the 'vendor_available' property, the modules with
452 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
453 // library without 'product_available' may not be depended on by any other
454 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900455 //
456 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
457 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
458 Product_available *bool
459
Jiyong Park5fb8c102018-04-09 12:03:06 +0900460 // whether this module is capable of being loaded with other instance
461 // (possibly an older version) of the same module in the same process.
462 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
463 // can be double loaded in a vendor process if the library is also a
464 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
465 // explicitly marked as `double_loadable: true` by the owner, or the dependency
466 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
467 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800468
469 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
470 IsLLNDK bool `blueprint:"mutated"`
471
Colin Cross78212242021-01-06 14:51:30 -0800472 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
473 // set and the module is not listed in VndkMustUseVendorVariantList.
474 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
475
476 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
477 IsVNDKCore bool `blueprint:"mutated"`
478
479 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
480 IsVNDKSP bool `blueprint:"mutated"`
481
482 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
483 // module sets the llndk.private property.
484 IsVNDKPrivate bool `blueprint:"mutated"`
485
486 // IsVNDKProduct is set if a VNDK module sets the product_available property.
487 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700488
489 // IsVendorPublicLibrary is set for the core and product variants of a library that has
490 // vendor_public_library stubs.
491 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800492}
493
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500494// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
495// to understanding details about the type of the current module.
496// For example, one might call these functions to determine whether the current module is a static
497// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800498type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800499 static() bool
500 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700501 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800502 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900503 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900504 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900505 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700506 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900507 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700508 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800509 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900510 minSdkVersion() string
511 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700512 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700513 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800514 IsLlndk() bool
515 IsLlndkPublic() bool
516 isImplementationForLLNDKPublic() bool
517 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900518 isVndk() bool
519 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500520 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700521 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900522 inProduct() bool
523 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800524 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700525 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900526 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700527 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700528 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800529 getVndkExtendsModuleName() string
Yi Kong4ef54592022-02-14 20:00:10 +0800530 isAfdoCompile() bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000531 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800532 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900533 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800534 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800535 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800536 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700537 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700538 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900539 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800540 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700541 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700542 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800543 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800544 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800545 getSharedFlags() *SharedFlags
546}
547
548type SharedFlags struct {
549 numSharedFlags int
550 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800551}
552
553type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700554 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800555 ModuleContextIntf
556}
557
558type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700559 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800560 ModuleContextIntf
561}
562
Colin Cross37047f12016-12-13 17:06:13 -0800563type DepsContext interface {
564 android.BottomUpMutatorContext
565 ModuleContextIntf
566}
567
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500568// feature represents additional (optional) steps to building cc-related modules, such as invocation
569// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800570type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800571 flags(ctx ModuleContext, flags Flags) Flags
572 props() []interface{}
573}
574
Joe Onorato37f900c2023-07-18 16:58:16 -0700575// Information returned from Generator about the source code it's generating
576type GeneratedSource struct {
577 IncludeDirs android.Paths
578 Sources android.Paths
579 Headers android.Paths
580 ReexportedDirs android.Paths
581}
582
583// generator allows injection of generated code
584type Generator interface {
585 GeneratorProps() []interface{}
586 GeneratorInit(ctx BaseModuleContext)
587 GeneratorDeps(ctx DepsContext, deps Deps) Deps
588 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
589 GeneratorSources(ctx ModuleContext) GeneratedSource
590 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
591}
592
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500593// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500594// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800595type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700596 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800597 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800598 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700599 compilerProps() []interface{}
600
Colin Cross76fada02016-07-27 10:31:13 -0700601 appendCflags([]string)
602 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700603 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800604}
605
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500606// linker is the interface for a linker decorator object. Individual module types can provide
607// their own implementation for this decorator, and thus specify custom logic regarding build
608// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800609type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700610 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800611 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700612 linkerFlags(ctx ModuleContext, flags Flags) Flags
613 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800614 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700615
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700616 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700617 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900618 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800619 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700620
621 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900622 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000623
624 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000625 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
626}
627
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500628// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000629type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500630 sharedLibs []string
631 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
632 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700633 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800634}
635
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500636// installer is the interface for an installer helper object. This helper is responsible for
637// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800638type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700639 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700640 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000641 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800642 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700643 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700644 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900645 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000646 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900647 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800648}
649
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800650type xref interface {
651 XrefCcFiles() android.Paths
652}
653
Inseob Kima1888ce2022-10-04 14:42:02 +0900654type overridable interface {
655 overriddenModules() []string
656}
657
Colin Cross6e511a92020-07-27 21:26:48 -0700658type libraryDependencyKind int
659
660const (
661 headerLibraryDependency = iota
662 sharedLibraryDependency
663 staticLibraryDependency
664)
665
666func (k libraryDependencyKind) String() string {
667 switch k {
668 case headerLibraryDependency:
669 return "headerLibraryDependency"
670 case sharedLibraryDependency:
671 return "sharedLibraryDependency"
672 case staticLibraryDependency:
673 return "staticLibraryDependency"
674 default:
675 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
676 }
677}
678
679type libraryDependencyOrder int
680
681const (
682 earlyLibraryDependency = -1
683 normalLibraryDependency = 0
684 lateLibraryDependency = 1
685)
686
687func (o libraryDependencyOrder) String() string {
688 switch o {
689 case earlyLibraryDependency:
690 return "earlyLibraryDependency"
691 case normalLibraryDependency:
692 return "normalLibraryDependency"
693 case lateLibraryDependency:
694 return "lateLibraryDependency"
695 default:
696 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
697 }
698}
699
700// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
701// tags that have a set of predefined tag objects that are reused for each dependency, a
702// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
703// That means that comparing a libraryDependencyTag for equality will only be equal if all
704// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
705// then check individual metadata fields instead.
706type libraryDependencyTag struct {
707 blueprint.BaseDependencyTag
708
709 // These are exported so that fmt.Printf("%#v") can call their String methods.
710 Kind libraryDependencyKind
711 Order libraryDependencyOrder
712
713 wholeStatic bool
714
715 reexportFlags bool
716 explicitlyVersioned bool
717 dataLib bool
718 ndk bool
719
720 staticUnwinder bool
721
722 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900723
Cindy Zhou18417cb2020-12-10 07:12:38 -0800724 // Whether or not this dependency should skip the apex dependency check
725 skipApexAllowedDependenciesCheck bool
726
Jiyong Parke3867542020-12-03 17:28:25 +0900727 // Whether or not this dependency has to be followed for the apex variants
728 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900729 // Whether or not this dependency has to be followed for the non-apex variants
730 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000731
732 // If true, don't automatically export symbols from the static library into a shared library.
733 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700734}
735
736// header returns true if the libraryDependencyTag is tagging a header lib dependency.
737func (d libraryDependencyTag) header() bool {
738 return d.Kind == headerLibraryDependency
739}
740
741// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
742func (d libraryDependencyTag) shared() bool {
743 return d.Kind == sharedLibraryDependency
744}
745
746// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
747func (d libraryDependencyTag) static() bool {
748 return d.Kind == staticLibraryDependency
749}
750
Colin Cross65cb3142021-12-10 23:05:02 +0000751func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
752 if d.shared() {
753 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
754 }
755 return nil
756}
757
758var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
759
Colin Crosse9fe2942020-11-10 18:12:15 -0800760// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
761// binaries or other shared libraries are installed as dependencies.
762func (d libraryDependencyTag) InstallDepNeeded() bool {
763 return d.shared()
764}
765
766var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
767
768// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700769// libraryDependencyTag. Each tag object is created globally and reused for multiple
770// dependencies (although since the object contains no references, assigning a tag to a
771// variable and modifying it will not modify the original). Users can compare the tag
772// returned by ctx.OtherModuleDependencyTag against the global original
773type dependencyTag struct {
774 blueprint.BaseDependencyTag
775 name string
776}
777
Colin Crosse9fe2942020-11-10 18:12:15 -0800778// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
779// libraryDependencyTag, but where the dependency needs to be installed when the parent is
780// installed.
781type installDependencyTag struct {
782 blueprint.BaseDependencyTag
783 android.InstallAlwaysNeededDependencyTag
784 name string
785}
786
Colin Crossc99deeb2016-04-11 15:06:20 -0700787var (
Colin Cross6e511a92020-07-27 21:26:48 -0700788 genSourceDepTag = dependencyTag{name: "gen source"}
789 genHeaderDepTag = dependencyTag{name: "gen header"}
790 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
791 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900792 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700793 reuseObjTag = dependencyTag{name: "reuse objects"}
794 staticVariantTag = dependencyTag{name: "static variant"}
795 vndkExtDepTag = dependencyTag{name: "vndk extends"}
796 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700797 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800798 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700799 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700800 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000801 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500802 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400803 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700804)
805
Roland Levillainf89cd092019-07-29 16:22:59 +0100806func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700807 ccLibDepTag, ok := depTag.(libraryDependencyTag)
808 return ok && ccLibDepTag.shared()
809}
810
811func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
812 ccLibDepTag, ok := depTag.(libraryDependencyTag)
813 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100814}
815
Zach Johnson3df4e632020-11-06 11:56:27 -0800816func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
817 ccLibDepTag, ok := depTag.(libraryDependencyTag)
818 return ok && ccLibDepTag.header()
819}
820
Roland Levillainf89cd092019-07-29 16:22:59 +0100821func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800822 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100823}
824
825func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700826 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100827 return ok && ccDepTag == testPerSrcDepTag
828}
829
Colin Crossca860ac2016-01-04 14:34:37 -0800830// Module contains the properties and members used by all C/C++ module types, and implements
831// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500832// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
833// interface.
834//
835// To define a C/C++ related module, construct a new Module object and point its delegates to
836// type-specific structs. These delegates will be invoked to register module-specific build
837// statements which may be unique to the module type. For example, module.compiler.compile() should
838// be defined so as to register build statements which are responsible for compiling the module.
839//
840// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
841// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
842// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
843// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800844type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700845 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700846
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700847 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700848 Properties BaseProperties
Colin Crossfa138792015-04-24 17:31:52 -0700849
Colin Crossca860ac2016-01-04 14:34:37 -0800850 // initialize before calling Init
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000851 hod android.HostOrDeviceSupported
852 multilib android.Multilib
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000853 testModule bool
Colin Crossc472d572015-03-17 15:06:21 -0700854
Paul Duffina0843f62019-12-13 19:50:38 +0000855 // Allowable SdkMemberTypes of this module type.
856 sdkMemberTypes []android.SdkMemberType
857
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500858 // decorator delegates, initialize before calling Init
859 // these may contain module-specific implementations, and effectively allow for custom
860 // type-specific logic. These members may reference different objects or the same object.
861 // Functions of these decorators will be invoked to initialize and register type-specific
862 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800863 generators []Generator
864 compiler compiler
865 linker linker
866 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500867
Spandan Dase12d2522023-09-12 21:42:31 +0000868 features []feature
869 stl *stl
870 sanitize *sanitize
871 coverage *coverage
872 fuzzer *fuzzer
873 sabi *sabi
874 vndkdep *vndkdep
875 lto *lto
876 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000877 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800878
Colin Cross31076b32020-10-23 17:22:06 -0700879 library libraryInterface
880
Colin Cross635c3b02016-05-18 15:37:25 -0700881 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800882
Colin Crossb98c8b02016-07-29 13:44:28 -0700883 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700884
885 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800886
887 // Flags used to compile this module
888 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700889
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800890 // Shared flags among build rules of this module
891 sharedFlags SharedFlags
892
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800893 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700894 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900895
896 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800897 // Kythe (source file indexer) paths for this compilation module
898 kytheFiles android.Paths
Chih-Hung Hsieh80783772021-10-11 16:46:56 -0700899 // Object .o file output paths for this compilation module
900 objFiles android.Paths
901 // Tidy .tidy file output paths for this compilation module
902 tidyFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900903
904 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700905 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700906
907 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -0800908
909 // Aconfig files for all transitive deps. Also exposed via TransitiveDeclarationsInfo
Colin Crossd788b3e2023-11-28 13:14:56 -0800910 mergedAconfigFiles map[string]android.Paths
Colin Crossc472d572015-03-17 15:06:21 -0700911}
912
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200913func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400914 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
915 if b, ok := c.compiler.(*baseCompiler); ok {
916 hasAidl = b.hasSrcExt(".aidl")
917 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
918 hasProto = b.hasSrcExt(".proto")
919 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
920 hasSysprop = b.hasSrcExt(".sysprop")
921 hasWinMsg = b.hasSrcExt(".mc")
922 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
923 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200924 c.AndroidModuleBase().AddJSONData(d)
925 (*d)["Cc"] = map[string]interface{}{
926 "SdkVersion": c.SdkVersion(),
927 "MinSdkVersion": c.MinSdkVersion(),
928 "VndkVersion": c.VndkVersion(),
929 "ProductSpecific": c.ProductSpecific(),
930 "SocSpecific": c.SocSpecific(),
931 "DeviceSpecific": c.DeviceSpecific(),
932 "InProduct": c.InProduct(),
933 "InVendor": c.InVendor(),
934 "InRamdisk": c.InRamdisk(),
935 "InVendorRamdisk": c.InVendorRamdisk(),
936 "InRecovery": c.InRecovery(),
937 "VendorAvailable": c.VendorAvailable(),
938 "ProductAvailable": c.ProductAvailable(),
939 "RamdiskAvailable": c.RamdiskAvailable(),
940 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
941 "RecoveryAvailable": c.RecoveryAvailable(),
942 "OdmAvailable": c.OdmAvailable(),
943 "InstallInData": c.InstallInData(),
944 "InstallInRamdisk": c.InstallInRamdisk(),
945 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
946 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
947 "InstallInRecovery": c.InstallInRecovery(),
948 "InstallInRoot": c.InstallInRoot(),
949 "IsVndk": c.IsVndk(),
950 "IsVndkExt": c.IsVndkExt(),
951 "IsVndkPrivate": c.IsVndkPrivate(),
952 "IsVndkSp": c.IsVndkSp(),
953 "IsLlndk": c.IsLlndk(),
954 "IsLlndkPublic": c.IsLlndkPublic(),
955 "IsSnapshotLibrary": c.IsSnapshotLibrary(),
956 "IsSnapshotPrebuilt": c.IsSnapshotPrebuilt(),
957 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
958 "ApexSdkVersion": c.apexSdkVersion,
959 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400960 "AidlSrcs": hasAidl,
961 "LexSrcs": hasLex,
962 "ProtoSrcs": hasProto,
963 "RenderscriptSrcs": hasRenderscript,
964 "SyspropSrcs": hasSysprop,
965 "WinMsgSrcs": hasWinMsg,
966 "YaccSrsc": hasYacc,
967 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200968 }
969}
970
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500971func (c *Module) SetPreventInstall() {
972 c.Properties.PreventInstall = true
973}
974
975func (c *Module) SetHideFromMake() {
976 c.Properties.HideFromMake = true
977}
978
Ivan Lozanod7586b62021-04-01 09:49:36 -0400979func (c *Module) HiddenFromMake() bool {
980 return c.Properties.HideFromMake
981}
982
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800983func (c *Module) RequiredModuleNames() []string {
984 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
985 if c.ImageVariation().Variation == android.CoreVariation {
986 required = append(required, c.Properties.Target.Platform.Required...)
987 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
988 } else if c.InRecovery() {
989 required = append(required, c.Properties.Target.Recovery.Required...)
990 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
991 }
992 return android.FirstUniqueStrings(required)
993}
994
Ivan Lozano52767be2019-10-18 14:49:46 -0700995func (c *Module) Toc() android.OptionalPath {
996 if c.linker != nil {
997 if library, ok := c.linker.(libraryInterface); ok {
998 return library.toc()
999 }
1000 }
1001 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1002}
1003
1004func (c *Module) ApiLevel() string {
1005 if c.linker != nil {
1006 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001007 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001008 }
1009 }
1010 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1011}
1012
1013func (c *Module) Static() bool {
1014 if c.linker != nil {
1015 if library, ok := c.linker.(libraryInterface); ok {
1016 return library.static()
1017 }
1018 }
1019 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1020}
1021
1022func (c *Module) Shared() bool {
1023 if c.linker != nil {
1024 if library, ok := c.linker.(libraryInterface); ok {
1025 return library.shared()
1026 }
1027 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001028
Ivan Lozano52767be2019-10-18 14:49:46 -07001029 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1030}
1031
1032func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001033 if c.stl != nil {
1034 return c.stl.Properties.SelectedStl
1035 }
1036 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001037}
1038
Ivan Lozano52767be2019-10-18 14:49:46 -07001039func (c *Module) NdkPrebuiltStl() bool {
1040 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1041 return true
1042 }
1043 return false
1044}
1045
1046func (c *Module) StubDecorator() bool {
1047 if _, ok := c.linker.(*stubDecorator); ok {
1048 return true
1049 }
1050 return false
1051}
1052
1053func (c *Module) SdkVersion() string {
1054 return String(c.Properties.Sdk_version)
1055}
1056
Artur Satayev480e25b2020-04-27 18:53:18 +01001057func (c *Module) MinSdkVersion() string {
1058 return String(c.Properties.Min_sdk_version)
1059}
1060
Jiyong Park5df7bd32021-08-25 16:18:46 +09001061func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001062 if linker, ok := c.linker.(*objectLinker); ok {
1063 return linker.isCrt()
1064 }
1065 return false
1066}
1067
Jiyong Park5df7bd32021-08-25 16:18:46 +09001068func (c *Module) SplitPerApiLevel() bool {
1069 return c.canUseSdk() && c.isCrt()
1070}
1071
Colin Crossc511bc52020-04-07 16:50:32 +00001072func (c *Module) AlwaysSdk() bool {
1073 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1074}
1075
Ivan Lozano183a3212019-10-18 14:18:45 -07001076func (c *Module) CcLibrary() bool {
1077 if c.linker != nil {
1078 if _, ok := c.linker.(*libraryDecorator); ok {
1079 return true
1080 }
Colin Crossd48fe732020-09-23 20:37:24 -07001081 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1082 return true
1083 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001084 }
1085 return false
1086}
1087
1088func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001089 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001090 return true
1091 }
1092 return false
1093}
1094
Spandan Dase12d2522023-09-12 21:42:31 +00001095func (c *Module) IsNdkPrebuiltStl() bool {
1096 if c.linker == nil {
1097 return false
1098 }
1099 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1100 return true
1101 }
1102 return false
1103}
1104
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001105func (c *Module) RlibStd() bool {
1106 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1107}
1108
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001109func (c *Module) RustLibraryInterface() bool {
1110 return false
1111}
1112
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001113func (c *Module) IsFuzzModule() bool {
1114 if _, ok := c.compiler.(*fuzzBinary); ok {
1115 return true
1116 }
1117 return false
1118}
1119
1120func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1121 return c.FuzzModule
1122}
1123
1124func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1125 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1126 return fuzzer.fuzzPackagedModule
1127 }
1128 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1129}
1130
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001131func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001132 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1133 return fuzzer.sharedLibraries
1134 }
1135 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1136}
1137
Ivan Lozano2b262972019-11-21 12:30:50 -08001138func (c *Module) NonCcVariants() bool {
1139 return false
1140}
1141
Ivan Lozano183a3212019-10-18 14:18:45 -07001142func (c *Module) SetStatic() {
1143 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001144 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001145 library.setStatic()
1146 return
1147 }
1148 }
1149 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1150}
1151
1152func (c *Module) SetShared() {
1153 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001154 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001155 library.setShared()
1156 return
1157 }
1158 }
1159 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1160}
1161
1162func (c *Module) BuildStaticVariant() bool {
1163 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001164 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001165 return library.buildStatic()
1166 }
1167 }
1168 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1169}
1170
1171func (c *Module) BuildSharedVariant() bool {
1172 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001173 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001174 return library.buildShared()
1175 }
1176 }
1177 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1178}
1179
1180func (c *Module) Module() android.Module {
1181 return c
1182}
1183
Jiyong Parkc20eee32018-09-05 22:36:17 +09001184func (c *Module) OutputFile() android.OptionalPath {
1185 return c.outputFile
1186}
1187
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001188func (c *Module) CoverageFiles() android.Paths {
1189 if c.linker != nil {
1190 if library, ok := c.linker.(libraryInterface); ok {
1191 return library.objs().coverageFiles
1192 }
1193 }
1194 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1195}
1196
Ivan Lozano183a3212019-10-18 14:18:45 -07001197var _ LinkableInterface = (*Module)(nil)
1198
Jiyong Park719b4462019-01-13 00:39:51 +09001199func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001200 if c.linker != nil {
1201 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001202 }
1203 return nil
1204}
1205
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001206func (c *Module) CoverageOutputFile() android.OptionalPath {
1207 if c.linker != nil {
1208 return c.linker.coverageOutputFilePath()
1209 }
1210 return android.OptionalPath{}
1211}
1212
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001213func (c *Module) RelativeInstallPath() string {
1214 if c.installer != nil {
1215 return c.installer.relativeInstallPath()
1216 }
1217 return ""
1218}
1219
Jooyung Han344d5432019-08-23 11:17:39 +09001220func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001221 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001222}
1223
Colin Cross36242852017-06-23 15:06:31 -07001224func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001225 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001226 for _, generator := range c.generators {
1227 c.AddProperties(generator.GeneratorProps()...)
1228 }
Colin Crossca860ac2016-01-04 14:34:37 -08001229 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001230 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001231 }
1232 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001233 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001234 }
1235 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001236 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001237 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001238 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001239 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001240 }
Colin Cross16b23492016-01-06 14:41:07 -08001241 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001242 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001243 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001244 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001245 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001246 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001247 if c.fuzzer != nil {
1248 c.AddProperties(c.fuzzer.props()...)
1249 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001250 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001251 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001252 }
Justin Yun8effde42017-06-23 19:24:43 +09001253 if c.vndkdep != nil {
1254 c.AddProperties(c.vndkdep.props()...)
1255 }
Stephen Craneba090d12017-05-09 15:44:35 -07001256 if c.lto != nil {
1257 c.AddProperties(c.lto.props()...)
1258 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001259 if c.afdo != nil {
1260 c.AddProperties(c.afdo.props()...)
1261 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001262 if c.orderfile != nil {
1263 c.AddProperties(c.orderfile.props()...)
1264 }
Colin Crossca860ac2016-01-04 14:34:37 -08001265 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001266 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001267 }
Colin Crossc472d572015-03-17 15:06:21 -07001268
Colin Cross36242852017-06-23 15:06:31 -07001269 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001270 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001271 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001272
Colin Cross36242852017-06-23 15:06:31 -07001273 return c
Colin Crossc472d572015-03-17 15:06:21 -07001274}
1275
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001276// UseVndk() returns true if this module is built against VNDK.
1277// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001278func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001279 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001280}
1281
Colin Crossc511bc52020-04-07 16:50:32 +00001282func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001283 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1284 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001285}
1286
1287func (c *Module) UseSdk() bool {
1288 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001289 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001290 }
1291 return false
1292}
1293
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001294func (c *Module) isCoverageVariant() bool {
1295 return c.coverage.Properties.IsCoverageVariant
1296}
1297
Colin Cross95f1ca02020-10-29 20:47:22 -07001298func (c *Module) IsNdk(config android.Config) bool {
1299 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001300}
1301
Colin Cross127bb8b2020-12-16 16:46:01 -08001302func (c *Module) IsLlndk() bool {
1303 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001304}
1305
Colin Cross127bb8b2020-12-16 16:46:01 -08001306func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001307 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001308}
1309
Colin Cross1f3f1302021-04-26 18:37:44 -07001310func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001311 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001312 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001313}
1314
Colin Cross5271fea2021-04-27 13:06:04 -07001315func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1316 lib := moduleLibraryInterface(m)
1317 return lib != nil && (lib.hasVendorPublicLibrary())
1318}
1319
1320// IsVendorPublicLibrary returns true for vendor public libraries.
1321func (c *Module) IsVendorPublicLibrary() bool {
1322 return c.VendorProperties.IsVendorPublicLibrary
1323}
1324
Ivan Lozanof1868af2022-04-12 13:08:36 -04001325func (c *Module) IsVndkPrebuiltLibrary() bool {
1326 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1327 return true
1328 }
1329 return false
1330}
1331
1332func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1333 return c.Properties.SdkAndPlatformVariantVisibleToMake
1334}
1335
Ivan Lozanod7586b62021-04-01 09:49:36 -04001336func (c *Module) HasLlndkStubs() bool {
1337 lib := moduleLibraryInterface(c)
1338 return lib != nil && lib.hasLLNDKStubs()
1339}
1340
1341func (c *Module) StubsVersion() string {
1342 if lib, ok := c.linker.(versionedInterface); ok {
1343 return lib.stubsVersion()
1344 }
1345 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1346}
1347
Colin Cross127bb8b2020-12-16 16:46:01 -08001348// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1349// and does not set llndk.vendor_available: false.
1350func (c *Module) isImplementationForLLNDKPublic() bool {
1351 library, _ := c.library.(*libraryDecorator)
1352 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001353 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001354}
1355
Justin Yunfd9e8042020-12-23 18:23:14 +09001356// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001357func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001358 // Check if VNDK-core-private or VNDK-SP-private
1359 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001360 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001361 }
1362
1363 // Check if LLNDK-private
1364 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001365 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001366 }
1367
1368 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001369}
1370
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001371// IsVndk() returns true if this module has a vndk variant.
1372// Note that IsVndk() returns true for all variants of vndk-enabled libraries. Not only vendor variant,
1373// but also platform and product variants of vndk-enabled libraries return true for IsVndk().
Ivan Lozano52767be2019-10-18 14:49:46 -07001374func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001375 if vndkdep := c.vndkdep; vndkdep != nil {
1376 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001377 }
1378 return false
1379}
1380
Yi Kong4ef54592022-02-14 20:00:10 +08001381func (c *Module) isAfdoCompile() bool {
1382 if afdo := c.afdo; afdo != nil {
Vinh Tran44cb78c2023-03-09 22:07:19 -05001383 return afdo.Properties.FdoProfilePath != nil
Yi Kong4ef54592022-02-14 20:00:10 +08001384 }
1385 return false
1386}
1387
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001388func (c *Module) isOrderfileCompile() bool {
1389 if orderfile := c.orderfile; orderfile != nil {
1390 return orderfile.Properties.OrderfileLoad
1391 }
1392 return false
1393}
1394
Yi Kongc702ebd2022-08-19 16:02:45 +08001395func (c *Module) isCfi() bool {
1396 if sanitize := c.sanitize; sanitize != nil {
Yi Kongddffe722023-07-18 16:40:36 +09001397 return Bool(sanitize.Properties.SanitizeMutated.Cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001398 }
1399 return false
1400}
1401
Yi Konged79fa32023-06-04 17:15:42 +09001402func (c *Module) isFuzzer() bool {
1403 if sanitize := c.sanitize; sanitize != nil {
1404 return Bool(sanitize.Properties.SanitizeMutated.Fuzzer)
1405 }
1406 return false
1407}
1408
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001409func (c *Module) isNDKStubLibrary() bool {
1410 if _, ok := c.compiler.(*stubDecorator); ok {
1411 return true
1412 }
1413 return false
1414}
1415
Ivan Lozanod7586b62021-04-01 09:49:36 -04001416func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001417 if vndkdep := c.vndkdep; vndkdep != nil {
1418 return vndkdep.isVndkSp()
1419 }
1420 return false
1421}
1422
Ivan Lozanof9e21722020-12-02 09:00:51 -05001423func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001424 if vndkdep := c.vndkdep; vndkdep != nil {
1425 return vndkdep.isVndkExt()
1426 }
1427 return false
1428}
1429
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001430func (c *Module) SubName() string {
1431 return c.Properties.SubName
1432}
1433
Ivan Lozano52767be2019-10-18 14:49:46 -07001434func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001435 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001436}
1437
Logan Chienf3511742017-10-31 18:04:35 +08001438func (c *Module) getVndkExtendsModuleName() string {
1439 if vndkdep := c.vndkdep; vndkdep != nil {
1440 return vndkdep.getVndkExtendsModuleName()
1441 }
1442 return ""
1443}
1444
Jiyong Park25fc6a92018-11-18 18:02:45 +09001445func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001446 if lib := c.library; lib != nil {
1447 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001448 }
1449 return false
1450}
1451
1452func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001453 if lib := c.library; lib != nil {
1454 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001455 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001456 return false
1457}
1458
Alan Stokes73feba32022-11-14 12:21:24 +00001459func (c *Module) IsStubsImplementationRequired() bool {
1460 if lib := c.library; lib != nil {
1461 return lib.isStubsImplementationRequired()
1462 }
1463 return false
1464}
1465
Colin Cross0477b422020-10-13 18:43:54 -07001466// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1467// the implementation. If it is an implementation library it returns its own name.
1468func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1469 name := ctx.OtherModuleName(c)
1470 if versioned, ok := c.linker.(versionedInterface); ok {
1471 name = versioned.implementationModuleName(name)
1472 }
1473 return name
1474}
1475
Martin Stjernholm2856c662020-12-02 15:03:42 +00001476// Similar to ImplementationModuleName, but uses the Make variant of the module
1477// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1478// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1479// under the premise that the prebuilt module overrides its source counterpart
1480// if it is exposed to Make).
1481func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1482 name := c.BaseModuleName()
1483 if versioned, ok := c.linker.(versionedInterface); ok {
1484 name = versioned.implementationModuleName(name)
1485 }
1486 return name
1487}
1488
Jiyong Park7d55b612021-06-11 17:22:09 +09001489func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001490 return Bool(c.Properties.Bootstrap)
1491}
1492
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001493func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001494 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1495 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1496 return false
1497 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001498 return c.linker != nil && c.linker.nativeCoverage()
1499}
1500
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001501func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001502 if p, ok := c.linker.(SnapshotInterface); ok {
1503 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001504 }
1505 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001506}
1507
Bill Peckham945441c2020-08-31 16:07:58 -07001508func (c *Module) ExcludeFromVendorSnapshot() bool {
1509 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1510}
1511
Jose Galmesf7294582020-11-13 12:07:36 -08001512func (c *Module) ExcludeFromRecoverySnapshot() bool {
1513 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1514}
1515
Jiyong Parkf1194352019-02-25 11:05:47 +09001516func isBionic(name string) bool {
1517 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001518 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001519 return true
1520 }
1521 return false
1522}
1523
Martin Stjernholm279de572019-09-10 23:18:20 +01001524func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001525 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001526 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001527 }
1528 return isBionic(name)
1529}
1530
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001531func (c *Module) XrefCcFiles() android.Paths {
1532 return c.kytheFiles
1533}
1534
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001535func (c *Module) isCfiAssemblySupportEnabled() bool {
1536 return c.sanitize != nil &&
1537 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1538}
1539
Inseob Kim800d1142021-06-14 12:03:51 +09001540func (c *Module) InstallInRoot() bool {
1541 return c.installer != nil && c.installer.installInRoot()
1542}
1543
Colin Crossca860ac2016-01-04 14:34:37 -08001544type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001545 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001546 moduleContextImpl
1547}
1548
Colin Cross37047f12016-12-13 17:06:13 -08001549type depsContext struct {
1550 android.BottomUpMutatorContext
1551 moduleContextImpl
1552}
1553
Colin Crossca860ac2016-01-04 14:34:37 -08001554type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001555 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001556 moduleContextImpl
1557}
1558
1559type moduleContextImpl struct {
1560 mod *Module
1561 ctx BaseModuleContext
1562}
1563
Colin Crossb98c8b02016-07-29 13:44:28 -07001564func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001565 return ctx.mod.toolchain(ctx.ctx)
1566}
1567
1568func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001569 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001570}
1571
1572func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001573 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001574}
1575
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001576func (ctx *moduleContextImpl) testBinary() bool {
1577 return ctx.mod.testBinary()
1578}
1579
Yi Kong56fc1b62022-09-06 16:24:00 +08001580func (ctx *moduleContextImpl) testLibrary() bool {
1581 return ctx.mod.testLibrary()
1582}
1583
Jiyong Park1d1119f2019-07-29 21:27:18 +09001584func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001585 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001586}
1587
Inseob Kim7f283f42020-06-01 21:53:49 +09001588func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001589 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001590}
1591
Inseob Kim1042d292020-06-01 23:23:05 +09001592func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001593 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001594}
1595
Jooyung Hanccce2f22020-03-07 03:45:53 +09001596func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001597 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001598}
1599
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001600func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001601 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001602}
1603
1604func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001605 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001606 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001607 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001608 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001609 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001610 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001611 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001612 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001613 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001614 }
1615 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001616}
1617
Jiyong Parkb35a8192020-08-10 15:59:36 +09001618func (ctx *moduleContextImpl) minSdkVersion() string {
1619 ver := ctx.mod.MinSdkVersion()
1620 if ver == "apex_inherit" && !ctx.isForPlatform() {
1621 ver = ctx.apexSdkVersion().String()
1622 }
1623 if ver == "apex_inherit" || ver == "" {
1624 ver = ctx.sdkVersion()
1625 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001626 // For crt objects, the meaning of min_sdk_version is very different from other types of
1627 // module. For them, min_sdk_version defines the oldest version that the build system will
1628 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1629 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1630 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001631 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1632 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1633 // support such an old version. The version is set to the later version in case when the
1634 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1635 // it's for an APEX.
1636 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1637 if ctx.isForPlatform() {
1638 ver = strconv.Itoa(android.FutureApiLevelInt)
1639 } else { // for apex
1640 ver = ctx.apexSdkVersion().String()
1641 if ver == "" { // in case when min_sdk_version was not set by the APEX
1642 ver = ctx.sdkVersion()
1643 }
1644 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001645 }
1646
Jiyong Parkb35a8192020-08-10 15:59:36 +09001647 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1648 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1649 minSdkVersionInt, err2 := strconv.Atoi(ver)
1650 if err == nil && err2 == nil {
1651 if sdkVersionInt < minSdkVersionInt {
1652 return strconv.Itoa(sdkVersionInt)
1653 }
1654 }
1655 return ver
1656}
1657
1658func (ctx *moduleContextImpl) isSdkVariant() bool {
1659 return ctx.mod.IsSdkVariant()
1660}
1661
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001662func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001663 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001664}
Justin Yun8effde42017-06-23 19:24:43 +09001665
Colin Cross95f1ca02020-10-29 20:47:22 -07001666func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1667 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001668}
1669
Colin Cross127bb8b2020-12-16 16:46:01 -08001670func (ctx *moduleContextImpl) IsLlndk() bool {
1671 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001672}
1673
Colin Cross127bb8b2020-12-16 16:46:01 -08001674func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1675 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001676}
1677
Colin Cross127bb8b2020-12-16 16:46:01 -08001678func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1679 return ctx.mod.isImplementationForLLNDKPublic()
1680}
1681
1682func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1683 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001684}
1685
Logan Chienf3511742017-10-31 18:04:35 +08001686func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001687 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001688}
1689
Yi Kong4ef54592022-02-14 20:00:10 +08001690func (ctx *moduleContextImpl) isAfdoCompile() bool {
1691 return ctx.mod.isAfdoCompile()
1692}
1693
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001694func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1695 return ctx.mod.isOrderfileCompile()
1696}
1697
Yi Kongc702ebd2022-08-19 16:02:45 +08001698func (ctx *moduleContextImpl) isCfi() bool {
1699 return ctx.mod.isCfi()
1700}
1701
Yi Konged79fa32023-06-04 17:15:42 +09001702func (ctx *moduleContextImpl) isFuzzer() bool {
1703 return ctx.mod.isFuzzer()
1704}
1705
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001706func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1707 return ctx.mod.isNDKStubLibrary()
1708}
1709
Justin Yun8effde42017-06-23 19:24:43 +09001710func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001711 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001712}
1713
Ivan Lozanof9e21722020-12-02 09:00:51 -05001714func (ctx *moduleContextImpl) IsVndkExt() bool {
1715 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001716}
1717
Colin Cross5271fea2021-04-27 13:06:04 -07001718func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1719 return ctx.mod.IsVendorPublicLibrary()
1720}
1721
Vic Yangefd249e2018-11-12 20:19:56 -08001722func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001723 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001724}
1725
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001726func (ctx *moduleContextImpl) selectedStl() string {
1727 if stl := ctx.mod.stl; stl != nil {
1728 return stl.Properties.SelectedStl
1729 }
1730 return ""
1731}
1732
Ivan Lozanobd721262018-11-27 14:33:03 -08001733func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1734 return ctx.mod.linker.useClangLld(actx)
1735}
1736
Colin Crossce75d2c2016-10-06 16:12:58 -07001737func (ctx *moduleContextImpl) baseModuleName() string {
1738 return ctx.mod.ModuleBase.BaseModuleName()
1739}
1740
Logan Chienf3511742017-10-31 18:04:35 +08001741func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1742 return ctx.mod.getVndkExtendsModuleName()
1743}
1744
Logan Chiene274fc92019-12-03 11:18:32 -08001745func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Crossff694a82023-12-13 15:54:49 -08001746 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1747 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001748}
1749
Colin Crosse07f2312020-08-13 11:24:56 -07001750func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001751 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1752 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001753}
1754
Dan Albertc8060532020-07-22 22:32:17 -07001755func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001756 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001757}
1758
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001759func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001760 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001761}
1762
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001763func (ctx *moduleContextImpl) nativeCoverage() bool {
1764 return ctx.mod.nativeCoverage()
1765}
1766
Colin Cross56a83212020-09-15 18:30:11 -07001767func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1768 return ctx.mod.DirectlyInAnyApex()
1769}
1770
Colin Cross95b07f22020-12-16 11:06:50 -08001771func (ctx *moduleContextImpl) isPreventInstall() bool {
1772 return ctx.mod.Properties.PreventInstall
1773}
1774
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001775func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1776 shared := &ctx.mod.sharedFlags
1777 if shared.flagsMap == nil {
1778 shared.numSharedFlags = 0
1779 shared.flagsMap = make(map[string]string)
1780 }
1781 return shared
1782}
1783
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001784func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1785 return ctx.mod.isCfiAssemblySupportEnabled()
1786}
1787
Colin Cross635c3b02016-05-18 15:37:25 -07001788func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001789 return &Module{
1790 hod: hod,
1791 multilib: multilib,
1792 }
1793}
1794
Colin Cross635c3b02016-05-18 15:37:25 -07001795func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001796 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001797 module.features = []feature{
1798 &tidyFeature{},
1799 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001800 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001801 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001802 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001803 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001804 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001805 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001806 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001807 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001808 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001809 return module
1810}
1811
Colin Crossce75d2c2016-10-06 16:12:58 -07001812func (c *Module) Prebuilt() *android.Prebuilt {
1813 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1814 return p.prebuilt()
1815 }
1816 return nil
1817}
1818
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001819func (c *Module) IsPrebuilt() bool {
1820 return c.Prebuilt() != nil
1821}
1822
Colin Crossce75d2c2016-10-06 16:12:58 -07001823func (c *Module) Name() string {
1824 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001825 if p, ok := c.linker.(interface {
1826 Name(string) string
1827 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001828 name = p.Name(name)
1829 }
1830 return name
1831}
1832
Alex Light3d673592019-01-18 14:37:31 -08001833func (c *Module) Symlinks() []string {
1834 if p, ok := c.installer.(interface {
1835 symlinkList() []string
1836 }); ok {
1837 return p.symlinkList()
1838 }
1839 return nil
1840}
1841
Roland Levillainf89cd092019-07-29 16:22:59 +01001842func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1843 test, ok := c.linker.(testPerSrc)
1844 return ok && test.isAllTestsVariation()
1845}
1846
Chris Parsons216e10a2020-07-09 17:12:52 -04001847func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001848 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001849 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001850 }); ok {
1851 return p.dataPaths()
1852 }
1853 return nil
1854}
1855
Ivan Lozanof1868af2022-04-12 13:08:36 -04001856func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001857 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1858 // "current", it will append the VNDK version to the name suffix.
1859 var vndkVersion string
1860 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001861 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001862 if c.ProductSpecific() {
1863 // If the module is product specific with 'product_specific: true',
1864 // do not add a name suffix because it is a base module.
1865 return ""
1866 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001867 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001868 } else {
1869 vndkVersion = ctx.DeviceConfig().VndkVersion()
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001870 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001871 }
1872 if vndkVersion == "current" {
1873 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1874 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001875 if c.VndkVersion() != vndkVersion && c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001876 // add version suffix only if the module is using different vndk version than the
1877 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001878 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001879 }
1880 return nameSuffix
1881}
1882
Ivan Lozanof1868af2022-04-12 13:08:36 -04001883func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1884 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001885
1886 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001887 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001888 }
1889
Colin Cross127bb8b2020-12-16 16:46:01 -08001890 llndk := c.IsLlndk()
Colin Cross627280f2021-04-26 16:53:58 -07001891 if llndk || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001892 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1893 // added for product variant only when we have vendor and product variants with core
1894 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001895 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001896 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001897 subName += vendorPublicLibrarySuffix
1898 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001899 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1900 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001901 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001902 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001903 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001904 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001905 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001906 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001907 subName += RecoverySuffix
1908 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1909 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001910 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001911 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001912 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001913 } else if c.IsStubs() && c.IsSdkVariant() {
1914 // Public API surface (NDK)
1915 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1916 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001917 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001918
1919 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001920}
1921
Sam Delmerico75dbca22023-04-20 13:13:25 +00001922func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1923 ctx := &moduleContext{
1924 ModuleContext: actx,
1925 moduleContextImpl: moduleContextImpl{
1926 mod: c,
1927 },
1928 }
1929 ctx.ctx = ctx
1930 return ctx
1931}
1932
Spandan Das20fce2d2023-04-12 17:21:39 +00001933// TODO (b/277651159): Remove this allowlist
1934var (
1935 skipStubLibraryMultipleApexViolation = map[string]bool{
1936 "libclang_rt.asan": true,
1937 "libclang_rt.hwasan": true,
1938 // runtime apex
1939 "libc": true,
1940 "libc_hwasan": true,
1941 "libdl_android": true,
1942 "libm": true,
1943 "libdl": true,
1944 // art apex
1945 "libandroidio": true,
1946 "libdexfile": true,
1947 "libnativebridge": true,
1948 "libnativehelper": true,
1949 "libnativeloader": true,
1950 "libsigchain": true,
1951 }
1952)
1953
1954// Returns true if a stub library could be installed in multiple apexes
1955func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
1956 // If this is not an apex variant, no check necessary
1957 if !c.InAnyApex() {
1958 return false
1959 }
1960 // If this is not a stub library, no check necessary
1961 if !c.HasStubsVariants() {
1962 return false
1963 }
1964 // Skip the allowlist
1965 // Use BaseModuleName so that this matches prebuilts.
1966 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
1967 return false
1968 }
1969
1970 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
1971 // Stub libraries should not have more than one apex_available
1972 if len(aaWithoutTestApexes) > 1 {
1973 return true
1974 }
1975 // Stub libraries should not use the wildcard
1976 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
1977 return true
1978 }
1979 // Default: no violation
1980 return false
1981}
1982
Chris Parsons8d6e4332021-02-22 16:13:50 -05001983func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05001984 // Handle the case of a test module split by `test_per_src` mutator.
1985 //
1986 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
1987 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
1988 // module and return early, as this module does not produce an output file per se.
1989 if c.IsTestPerSrcAllTestsVariation() {
1990 c.outputFile = android.OptionalPath{}
1991 return
1992 }
1993
Ivan Lozanof1868af2022-04-12 13:08:36 -04001994 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08001995 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001996 if !apexInfo.IsForPlatform() {
1997 c.hideApexVariantFromMake = true
1998 }
1999
Chris Parsonseefc9e62021-04-02 17:36:47 -04002000 c.makeLinkType = GetMakeLinkType(actx, c)
2001
Sam Delmerico75dbca22023-04-20 13:13:25 +00002002 ctx := moduleContextFromAndroidModuleContext(actx, c)
Colin Crossca860ac2016-01-04 14:34:37 -08002003
Colin Crossf18e1102017-11-16 14:33:08 -08002004 deps := c.depsToPaths(ctx)
2005 if ctx.Failed() {
2006 return
2007 }
2008
Joe Onorato37f900c2023-07-18 16:58:16 -07002009 for _, generator := range c.generators {
2010 gen := generator.GeneratorSources(ctx)
2011 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2012 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2013 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2014 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2015 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2016 if len(deps.Objs.objFiles) == 0 {
2017 // If we are reusuing object files (which happens when we're a shared library and we're
2018 // reusing our static variant's object files), then skip adding the actual source files,
2019 // because we already have the object for it.
2020 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2021 }
2022 }
2023
2024 if ctx.Failed() {
2025 return
2026 }
2027
Spandan Das20fce2d2023-04-12 17:21:39 +00002028 if c.stubLibraryMultipleApexViolation(actx) {
2029 actx.PropertyErrorf("apex_available",
2030 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2031 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002032 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2033 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002034 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2035 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002036 }
2037
Colin Crossca860ac2016-01-04 14:34:37 -08002038 flags := Flags{
2039 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002040 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002041 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002042 for _, generator := range c.generators {
2043 flags = generator.GeneratorFlags(ctx, flags, deps)
2044 }
Colin Crossca860ac2016-01-04 14:34:37 -08002045 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002046 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002047 }
2048 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002049 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002050 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002051 if c.stl != nil {
2052 flags = c.stl.flags(ctx, flags)
2053 }
Colin Cross16b23492016-01-06 14:41:07 -08002054 if c.sanitize != nil {
2055 flags = c.sanitize.flags(ctx, flags)
2056 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002057 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002058 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002059 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002060 if c.fuzzer != nil {
2061 flags = c.fuzzer.flags(ctx, flags)
2062 }
Stephen Craneba090d12017-05-09 15:44:35 -07002063 if c.lto != nil {
2064 flags = c.lto.flags(ctx, flags)
2065 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002066 if c.afdo != nil {
2067 flags = c.afdo.flags(ctx, flags)
2068 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002069 if c.orderfile != nil {
2070 flags = c.orderfile.flags(ctx, flags)
2071 }
Colin Crossca860ac2016-01-04 14:34:37 -08002072 for _, feature := range c.features {
2073 flags = feature.flags(ctx, flags)
2074 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002075 if ctx.Failed() {
2076 return
2077 }
2078
Colin Cross4af21ed2019-11-04 09:37:55 -08002079 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2080 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2081 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002082
Colin Cross4af21ed2019-11-04 09:37:55 -08002083 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002084
2085 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002086 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002087 }
2088 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002089 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002090 }
2091
Colin Cross3e5e7782022-06-17 22:17:05 +00002092 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2093
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002094 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002095 // We need access to all the flags seen by a source file.
2096 if c.sabi != nil {
2097 flags = c.sabi.flags(ctx, flags)
2098 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002099
Colin Cross4af21ed2019-11-04 09:37:55 -08002100 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002101
Joe Onorato37f900c2023-07-18 16:58:16 -07002102 for _, generator := range c.generators {
2103 generator.GeneratorBuildActions(ctx, flags, deps)
2104 }
2105
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002106 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002107 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002108 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002109 if ctx.Failed() {
2110 return
2111 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002112 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07002113 c.objFiles = objs.objFiles
2114 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08002115 }
2116
Colin Crossca860ac2016-01-04 14:34:37 -08002117 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002118 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002119 if ctx.Failed() {
2120 return
2121 }
Colin Cross635c3b02016-05-18 15:37:25 -07002122 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002123
Chris Parsons94a0bba2021-06-04 15:03:47 -04002124 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002125
Jose Galmes6f843bc2020-12-11 13:36:29 -08002126 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
2127 // RECOVERY_SNAPSHOT_VERSION is current.
2128 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04002129 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002130 i.collectHeadersForSnapshot(ctx)
2131 }
2132 }
Colin Crossce75d2c2016-10-06 16:12:58 -07002133 }
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002134 if c.testModule {
Colin Cross40213022023-12-13 15:19:49 -08002135 android.SetProvider(ctx, testing.TestModuleProviderKey, testing.TestModuleProviderData{})
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002136 }
Colin Cross40213022023-12-13 15:19:49 -08002137 android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
Colin Cross5049f022015-03-18 13:28:46 -07002138
LaMont Jonesaa005ae2023-12-19 19:01:57 +00002139 android.CollectDependencyAconfigFiles(ctx, &c.mergedAconfigFiles)
Yu Liueae7b362023-11-16 17:05:47 -08002140
Chris Parsons94a0bba2021-06-04 15:03:47 -04002141 c.maybeInstall(ctx, apexInfo)
2142}
2143
2144func (c *Module) maybeUnhideFromMake() {
2145 // If a lib is directly included in any of the APEXes or is not available to the
2146 // platform (which is often the case when the stub is provided as a prebuilt),
2147 // unhide the stubs variant having the latest version gets visible to make. In
2148 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2149 // force anything in the make world to link against the stubs library. (unless it
2150 // is explicitly referenced via .bootstrap suffix or the module is marked with
2151 // 'bootstrap: true').
2152 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
2153 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
2154 c.IsStubs() && !c.InVendorRamdisk() {
2155 c.Properties.HideFromMake = false // unhide
2156 // Note: this is still non-installable
2157 }
2158}
2159
Colin Cross8ff10582023-12-07 13:10:56 -08002160// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2161// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002162func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002163 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002164 // If the module has been specifically configure to not be installed then
2165 // hide from make as otherwise it will break when running inside make
2166 // as the output path to install will not be specified. Not all uninstallable
2167 // modules can be hidden from make as some are needed for resolving make side
2168 // dependencies.
2169 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002170 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002171 c.SkipInstall()
2172 }
2173
2174 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2175 // to allow using the outputs in a genrule.
2176 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002177 c.installer.install(ctx, c.outputFile.Path())
2178 if ctx.Failed() {
2179 return
Colin Crossca860ac2016-01-04 14:34:37 -08002180 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002181 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002182}
2183
Colin Cross0ea8ba82019-06-06 14:33:29 -07002184func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002185 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002186 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002187 }
Colin Crossca860ac2016-01-04 14:34:37 -08002188 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002189}
2190
Colin Crossca860ac2016-01-04 14:34:37 -08002191func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002192 for _, generator := range c.generators {
2193 generator.GeneratorInit(ctx)
2194 }
Colin Crossca860ac2016-01-04 14:34:37 -08002195 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002196 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002197 }
Colin Crossca860ac2016-01-04 14:34:37 -08002198 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002199 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002200 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002201 if c.stl != nil {
2202 c.stl.begin(ctx)
2203 }
Colin Cross16b23492016-01-06 14:41:07 -08002204 if c.sanitize != nil {
2205 c.sanitize.begin(ctx)
2206 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002207 if c.coverage != nil {
2208 c.coverage.begin(ctx)
2209 }
Yi Kong9723e332023-12-04 14:52:53 +09002210 if c.afdo != nil {
2211 c.afdo.begin(ctx)
2212 }
Stephen Craneba090d12017-05-09 15:44:35 -07002213 if c.lto != nil {
2214 c.lto.begin(ctx)
2215 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002216 if c.orderfile != nil {
2217 c.orderfile.begin(ctx)
2218 }
Dan Albert92fe7402020-07-15 13:33:30 -07002219 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002220 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002221 if err != nil {
2222 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002223 c.Properties.Sdk_version = nil
2224 } else {
2225 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002226 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002227 }
Colin Crossca860ac2016-01-04 14:34:37 -08002228}
2229
Colin Cross37047f12016-12-13 17:06:13 -08002230func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002231 deps := Deps{}
2232
Joe Onorato37f900c2023-07-18 16:58:16 -07002233 for _, generator := range c.generators {
2234 deps = generator.GeneratorDeps(ctx, deps)
2235 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002236 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002237 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002238 }
2239 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002240 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002241 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002242 if c.stl != nil {
2243 deps = c.stl.deps(ctx, deps)
2244 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002245 if c.coverage != nil {
2246 deps = c.coverage.deps(ctx, deps)
2247 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002248
Colin Crossb6715442017-10-24 11:13:31 -07002249 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2250 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2251 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2252 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2253 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2254 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002255 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002256
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002257 for _, lib := range deps.ReexportSharedLibHeaders {
2258 if !inList(lib, deps.SharedLibs) {
2259 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2260 }
2261 }
2262
2263 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002264 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2265 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 -07002266 }
2267 }
2268
Colin Cross5950f382016-12-13 12:50:57 -08002269 for _, lib := range deps.ReexportHeaderLibHeaders {
2270 if !inList(lib, deps.HeaderLibs) {
2271 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2272 }
2273 }
2274
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002275 for _, gen := range deps.ReexportGeneratedHeaders {
2276 if !inList(gen, deps.GeneratedHeaders) {
2277 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2278 }
2279 }
2280
Colin Crossc99deeb2016-04-11 15:06:20 -07002281 return deps
2282}
2283
Dan Albert7e9d2952016-08-04 13:02:36 -07002284func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002285 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002286 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002287 moduleContextImpl: moduleContextImpl{
2288 mod: c,
2289 },
2290 }
2291 ctx.ctx = ctx
2292
Vinh Tran44cb78c2023-03-09 22:07:19 -05002293 if !actx.Host() || !ctx.static() || ctx.staticBinary() {
2294 c.afdo.addDep(ctx, actx)
2295 }
2296
Colin Crossca860ac2016-01-04 14:34:37 -08002297 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002298}
2299
Jiyong Park7ed9de32018-10-15 22:25:07 +09002300// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002301func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002302 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2303 version := name[sharp+1:]
2304 libname := name[:sharp]
2305 return libname, version
2306 }
2307 return name, ""
2308}
2309
Dan Albert92fe7402020-07-15 13:33:30 -07002310func GetCrtVariations(ctx android.BottomUpMutatorContext,
2311 m LinkableInterface) []blueprint.Variation {
2312 if ctx.Os() != android.Android {
2313 return nil
2314 }
2315 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002316 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2317 minSdkVersion := m.MinSdkVersion()
2318 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2319 minSdkVersion = m.SdkVersion()
2320 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002321 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2322 if err != nil {
2323 ctx.PropertyErrorf("min_sdk_version", err.Error())
2324 }
Colin Cross363ec762023-01-13 13:45:14 -08002325
2326 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002327 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002328 if apiLevel.LessThan(minApiForArch) {
2329 apiLevel = minApiForArch
2330 }
2331
Dan Albert92fe7402020-07-15 13:33:30 -07002332 return []blueprint.Variation{
2333 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002334 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002335 }
2336 }
2337 return []blueprint.Variation{
2338 {Mutator: "sdk", Variation: ""},
2339 }
2340}
2341
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002342func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2343 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002344
2345 variations = append([]blueprint.Variation(nil), variations...)
2346
Liz Kammer23942242022-04-08 15:41:00 -04002347 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002348 // Version is explicitly specified. i.e. libFoo#30
2349 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002350 if tag, ok := depTag.(libraryDependencyTag); ok {
2351 tag.explicitlyVersioned = true
2352 } else {
2353 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2354 }
Colin Crosse7257d22020-09-24 09:56:18 -07002355 }
Colin Crosse7257d22020-09-24 09:56:18 -07002356
Colin Cross0de8a1e2020-09-18 14:15:30 -07002357 if far {
2358 ctx.AddFarVariationDependencies(variations, depTag, name)
2359 } else {
2360 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002361 }
2362}
2363
Kiyoung Kim487689e2022-07-26 09:48:22 +09002364func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2365 apiImportInfo := multitree.ApiImportInfo{}
2366
2367 if c.Device() {
2368 var apiImportModule []blueprint.Module
2369 if actx.OtherModuleExists("api_imports") {
2370 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2371 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
Colin Cross313aa542023-12-13 13:47:44 -08002372 apiInfo, _ := android.OtherModuleProvider(actx, apiImportModule[0], multitree.ApiImportsProvider)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002373 apiImportInfo = apiInfo
Colin Cross40213022023-12-13 15:19:49 -08002374 android.SetProvider(actx, multitree.ApiImportsProvider, apiInfo)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002375 }
2376 }
2377 }
2378
2379 return apiImportInfo
2380}
2381
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002382func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002383 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002384 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002385 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002386 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2387 // between the modules in the snapshot and the snapshot itself.
2388 var snapshotModule []blueprint.Module
2389 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2390 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2391 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2392 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2393 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002394 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Colin Cross313aa542023-12-13 13:47:44 -08002395 snapshot, _ := android.OtherModuleProvider(actx, snapshotModule[0], SnapshotInfoProvider)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002396 *snapshotInfo = &snapshot
2397 // republish the snapshot for use in later mutators on this module
Colin Cross40213022023-12-13 15:19:49 -08002398 android.SetProvider(actx, SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002399 }
2400 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002401 if *snapshotInfo == nil {
2402 *snapshotInfo = &SnapshotInfo{}
2403 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002404 return **snapshotInfo
2405}
2406
Kiyoung Kim487689e2022-07-26 09:48:22 +09002407func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2408 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002409 return snapshot
2410 }
2411
2412 return lib
2413}
2414
2415// RewriteLibs takes a list of names of shared libraries and scans it for three types
2416// of names:
2417//
2418// 1. Name of an NDK library that refers to a prebuilt module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002419//
2420// For each of these, it adds the name of the prebuilt module (which will be in
2421// prebuilts/ndk) to the list of nonvariant libs.
2422//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002423// 2. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002424//
2425// For each of these, it adds the name of the ndk_library module to the list of
2426// variant libs.
2427//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002428// 3. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002429//
2430// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002431//
2432// The caller can then know to add the variantLibs dependencies differently from the
2433// nonvariantLibs
2434func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2435 variantLibs = []string{}
2436
2437 nonvariantLibs = []string{}
2438 for _, entry := range list {
2439 // strip #version suffix out
2440 name, _ := StubsLibNameAndVersion(entry)
2441 if c.InRecovery() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002442 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002443 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2444 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2445 } else if c.UseVndk() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002446 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002447 } else {
2448 // put name#version back
2449 nonvariantLibs = append(nonvariantLibs, entry)
2450 }
2451 }
2452 return nonvariantLibs, variantLibs
2453}
2454
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002455func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2456 nonVariantLibs := []string{}
2457 variantLibs := []string{}
2458
2459 for _, lib := range libs {
2460 replaceLibName := GetReplaceModuleName(lib, replaceList)
2461 if replaceLibName == lib {
2462 // Do not handle any libs which are not in API imports
2463 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2464 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2465 variantLibs = append(variantLibs, replaceLibName)
2466 } else {
2467 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2468 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002469 }
2470
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002471 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002472}
2473
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002474func (c *Module) shouldUseApiSurface() bool {
2475 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2476 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2477 // LLNDK Variant
2478 return true
2479 }
2480
2481 if c.Properties.IsSdkVariant {
2482 // NDK Variant
2483 return true
2484 }
2485
2486 if c.isImportedApiLibrary() {
2487 // API Library should depend on API headers
2488 return true
2489 }
2490 }
2491
2492 return false
2493}
2494
Colin Cross1e676be2016-10-12 14:38:15 -07002495func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002496 if !c.Enabled() {
2497 return
2498 }
2499
Colin Cross37047f12016-12-13 17:06:13 -08002500 ctx := &depsContext{
2501 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002502 moduleContextImpl: moduleContextImpl{
2503 mod: c,
2504 },
2505 }
2506 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002507
Colin Crossc99deeb2016-04-11 15:06:20 -07002508 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002509 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002510
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002511 apiNdkLibs := []string{}
2512 apiLateNdkLibs := []string{}
2513
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002514 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002515 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2516 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2517 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2518 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2519 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002520 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002521
Yo Chiang219968c2020-09-22 18:45:04 +08002522 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2523
Colin Crosse0edaf92021-01-11 17:31:17 -08002524 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002525
Dan Albert914449f2016-06-17 16:45:24 -07002526 variantNdkLibs := []string{}
2527 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002528 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002529 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2530 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2531 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002532
2533 for idx, lib := range deps.RuntimeLibs {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002534 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002535 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002536 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002537
Colin Cross32ec36c2016-12-15 07:39:51 -08002538 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002539 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002540 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002541 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002542 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002543
Kiyoung Kim51279d32022-08-24 14:10:46 +09002544 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002545 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002546 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2547 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002548 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002549
Spandan Das73bcafc2022-08-18 23:26:00 +00002550 if c.isNDKStubLibrary() {
2551 // ndk_headers do not have any variations
2552 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002553 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002554 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002555 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002556 } else {
2557 actx.AddVariationDependencies(nil, depTag, lib)
2558 }
2559 }
2560
Dan Albertf1d14c72020-07-30 14:32:55 -07002561 if c.isNDKStubLibrary() {
2562 // NDK stubs depend on their implementation because the ABI dumps are
2563 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002564
Spandan Das8b08aea2023-03-14 19:29:34 +00002565 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2566 c.ImageVariation(),
2567 blueprint.Variation{Mutator: "link", Variation: "shared"},
2568 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002569 }
2570
Jiyong Park5d1598f2019-02-25 22:14:17 +09002571 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002572 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002573
Kiyoung Kim487689e2022-07-26 09:48:22 +09002574 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002575
Jiyong Park5d1598f2019-02-25 22:14:17 +09002576 actx.AddVariationDependencies([]blueprint.Variation{
2577 {Mutator: "link", Variation: "static"},
2578 }, depTag, lib)
2579 }
2580
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002581 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002582 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002583 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002584 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002585 }
Jiyong Parke3867542020-12-03 17:28:25 +09002586 if inList(lib, deps.ExcludeLibsForApex) {
2587 depTag.excludeInApex = true
2588 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002589
Kiyoung Kim487689e2022-07-26 09:48:22 +09002590 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002591
Dan Willemsen59339a22018-07-22 21:18:45 -07002592 actx.AddVariationDependencies([]blueprint.Variation{
2593 {Mutator: "link", Variation: "static"},
2594 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002595 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002596
Jooyung Han75568392020-03-20 04:29:24 +09002597 // staticUnwinderDep is treated as staticDep for Q apexes
2598 // so that native libraries/binaries are linked with static unwinder
2599 // because Q libc doesn't have unwinder APIs
2600 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002601 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002602 actx.AddVariationDependencies([]blueprint.Variation{
2603 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002604 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002605 }
2606
Jiyong Park7ed9de32018-10-15 22:25:07 +09002607 // shared lib names without the #version suffix
2608 var sharedLibNames []string
2609
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002610 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002611 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002612 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002613 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002614 }
Jiyong Parke3867542020-12-03 17:28:25 +09002615 if inList(lib, deps.ExcludeLibsForApex) {
2616 depTag.excludeInApex = true
2617 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002618 if inList(lib, deps.ExcludeLibsForNonApex) {
2619 depTag.excludeInNonApex = true
2620 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002621
Jiyong Park73c54ee2019-10-22 20:31:18 +09002622 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002623 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2624 name = apiLibraryName
2625 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002626 sharedLibNames = append(sharedLibNames, name)
2627
Colin Crosse7257d22020-09-24 09:56:18 -07002628 variations := []blueprint.Variation{
2629 {Mutator: "link", Variation: "shared"},
2630 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002631
2632 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2633 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2634 }
2635
2636 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2637 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2638 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002639 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002640
Colin Crossfe9acfe2021-06-14 16:13:03 -07002641 for _, lib := range deps.LateStaticLibs {
2642 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2643 actx.AddVariationDependencies([]blueprint.Variation{
2644 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002645 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Crossfe9acfe2021-06-14 16:13:03 -07002646 }
2647
Colin Cross3e5e7782022-06-17 22:17:05 +00002648 for _, lib := range deps.UnexportedStaticLibs {
2649 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2650 actx.AddVariationDependencies([]blueprint.Variation{
2651 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002652 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Cross3e5e7782022-06-17 22:17:05 +00002653 }
2654
Jiyong Park7ed9de32018-10-15 22:25:07 +09002655 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002656 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002657 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2658 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2659 // linking against both the stubs lib and the non-stubs lib at the same time.
2660 continue
2661 }
Colin Cross6e511a92020-07-27 21:26:48 -07002662 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002663 variations := []blueprint.Variation{
2664 {Mutator: "link", Variation: "shared"},
2665 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002666 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002667 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002668
Dan Willemsen59339a22018-07-22 21:18:45 -07002669 actx.AddVariationDependencies([]blueprint.Variation{
2670 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002671 }, dataLibDepTag, deps.DataLibs...)
2672
Colin Crossc8caa062021-09-24 16:50:14 -07002673 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2674
Chris Parsons79d66a52020-06-05 17:26:16 -04002675 actx.AddVariationDependencies([]blueprint.Variation{
2676 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002677 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002678
Colin Cross68861832016-07-08 10:41:41 -07002679 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002680
2681 for _, gen := range deps.GeneratedHeaders {
2682 depTag := genHeaderDepTag
2683 if inList(gen, deps.ReexportGeneratedHeaders) {
2684 depTag = genHeaderExportDepTag
2685 }
2686 actx.AddDependency(c, depTag, gen)
2687 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002688
Dan Albert92fe7402020-07-15 13:33:30 -07002689 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002690 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002691 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002692 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002693 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002694 }
Colin Crossc465efd2021-06-11 18:00:04 -07002695 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002696 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002697 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002698 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002699 if deps.DynamicLinker != "" {
2700 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002701 }
Dan Albert914449f2016-06-17 16:45:24 -07002702
2703 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002704
2705 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002706 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002707 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002708 {Mutator: "link", Variation: "shared"},
2709 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002710 actx.AddVariationDependencies([]blueprint.Variation{
2711 {Mutator: "version", Variation: version},
2712 {Mutator: "link", Variation: "shared"},
2713 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002714
2715 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002716 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002717 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002718 {Mutator: "link", Variation: "shared"},
2719 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002720 actx.AddVariationDependencies([]blueprint.Variation{
2721 {Mutator: "version", Variation: version},
2722 {Mutator: "link", Variation: "shared"},
2723 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002724
2725 if vndkdep := c.vndkdep; vndkdep != nil {
2726 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002727 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002728 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002729 {Mutator: "link", Variation: "shared"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002730 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002731 }
2732 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002733
Vinh Tran367d89d2023-04-28 11:21:25 -04002734 if len(deps.AidlLibs) > 0 {
2735 actx.AddDependency(
2736 c,
2737 aidlLibraryTag,
2738 deps.AidlLibs...,
2739 )
2740 }
2741
Kiyoung Kimee58c932022-10-25 22:59:41 +09002742 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002743}
Colin Cross21b9a242015-03-24 14:15:58 -07002744
Colin Crosse40b4ea2018-10-02 22:25:58 -07002745func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002746 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2747 c.beginMutator(ctx)
2748 }
2749}
2750
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002751// Whether a module can link to another module, taking into
2752// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002753func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002754 tag blueprint.DependencyTag) {
2755
2756 switch t := tag.(type) {
2757 case dependencyTag:
2758 if t != vndkExtDepTag {
2759 return
2760 }
2761 case libraryDependencyTag:
2762 default:
2763 return
2764 }
2765
Ivan Lozanof9e21722020-12-02 09:00:51 -05002766 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002767 // Host code is not restricted
2768 return
2769 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002770
2771 // VNDK is cc.Module supported only for now.
2772 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002773 // Though allowed dependency is limited by the image mutator,
2774 // each vendor and product module needs to check link-type
2775 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002776 if ccTo, ok := to.(*Module); ok {
2777 if ccFrom.vndkdep != nil {
2778 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2779 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002780 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002781 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002782 }
2783 return
2784 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002785 // TODO(b/244244438) : Remove this once all variants are implemented
2786 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2787 return
2788 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002789 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002790 // Platform code can link to anything
2791 return
2792 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002793 if from.InRamdisk() {
2794 // Ramdisk code is not NDK
2795 return
2796 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002797 if from.InVendorRamdisk() {
2798 // Vendor ramdisk code is not NDK
2799 return
2800 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002801 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002802 // Recovery code is not NDK
2803 return
2804 }
Colin Cross31076b32020-10-23 17:22:06 -07002805 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002806 if c.NdkPrebuiltStl() {
2807 // These are allowed, but they don't set sdk_version
2808 return
2809 }
2810 if c.StubDecorator() {
2811 // These aren't real libraries, but are the stub shared libraries that are included in
2812 // the NDK.
2813 return
2814 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002815 if c.isImportedApiLibrary() {
2816 // Imported library from the API surface is a stub library built against interface definition.
2817 return
2818 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002819 }
Logan Chien834b9a62019-01-14 15:39:03 +08002820
Ivan Lozano52767be2019-10-18 14:49:46 -07002821 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002822 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2823 // to link to libc++ (non-NDK and without sdk_version).
2824 return
2825 }
2826
Ivan Lozano52767be2019-10-18 14:49:46 -07002827 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002828 // NDK code linking to platform code is never okay.
2829 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002830 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002831 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002832 }
2833
2834 // At this point we know we have two NDK libraries, but we need to
2835 // check that we're not linking against anything built against a higher
2836 // API level, as it is only valid to link against older or equivalent
2837 // APIs.
2838
Inseob Kim01a28722018-04-11 09:48:45 +09002839 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002840 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002841 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002842 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002843 // Current can't be linked against by anything else.
2844 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002845 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002846 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002847 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002848 if err != nil {
2849 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002850 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002851 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002852 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002853 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002854 if err != nil {
2855 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002856 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002857 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002858 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002859
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002860 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09002861 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002862 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002863 }
2864 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002865 }
Dan Albert202fe492017-12-15 13:56:59 -08002866
2867 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002868 fromStl := from.SelectedStl()
2869 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002870 if fromStl == "" || toStl == "" {
2871 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002872 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002873 // We can be permissive with the system "STL" since it is only the C++
2874 // ABI layer, but in the future we should make sure that everyone is
2875 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002876 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002877 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002878 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2879 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002880 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002881}
2882
Jooyung Han479ca172020-10-19 18:51:07 +09002883func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2884 if c, ok := ctx.Module().(*Module); ok {
2885 ctx.VisitDirectDeps(func(dep android.Module) {
2886 depTag := ctx.OtherModuleDependencyTag(dep)
2887 ccDep, ok := dep.(LinkableInterface)
2888 if ok {
2889 checkLinkType(ctx, c, ccDep, depTag)
2890 }
2891 })
2892 }
2893}
2894
Jiyong Park5fb8c102018-04-09 12:03:06 +09002895// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002896// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2897// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002898// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002899func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2900 check := func(child, parent android.Module) bool {
2901 to, ok := child.(*Module)
2902 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002903 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002904 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002905
Jooyung Hana70f0672019-01-18 15:20:43 +09002906 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2907 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002908 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002909
Jiyong Park0474e1f2021-01-14 14:26:06 +09002910 // These dependencies are not excercised at runtime. Tracking these will give us
2911 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002912 depTag := ctx.OtherModuleDependencyTag(child)
2913 if IsHeaderDepTag(depTag) {
2914 return false
2915 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002916 if depTag == staticVariantTag {
2917 return false
2918 }
2919 if depTag == stubImplDepTag {
2920 return false
2921 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002922
Justin Yun63e9ec72020-10-29 16:49:43 +09002923 // Even if target lib has no vendor variant, keep checking dependency
2924 // graph in case it depends on vendor_available or product_available
2925 // but not double_loadable transtively.
2926 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002927 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002928 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002929
Jiyong Park0474e1f2021-01-14 14:26:06 +09002930 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2931 // one.
2932 if Bool(to.VendorProperties.Double_loadable) {
2933 return true
2934 }
2935
Ivan Lozanod7586b62021-04-01 09:49:36 -04002936 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002937 return false
2938 }
2939
Jooyung Hana70f0672019-01-18 15:20:43 +09002940 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2941 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002942 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002943 return false
2944 }
2945 if module, ok := ctx.Module().(*Module); ok {
2946 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002947 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002948 ctx.WalkDeps(check)
2949 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002950 }
2951 }
2952}
2953
Yu Liue4312402023-01-18 09:15:31 -08002954func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
2955 // For the dependency from platform to apex, use the latest stubs
2956 apexSdkVersion := android.FutureApiLevel
2957 if !apexInfo.IsForPlatform() {
2958 apexSdkVersion = apexInfo.MinSdkVersion
2959 }
2960
2961 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2962 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2963 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2964 // (b/144430859)
2965 apexSdkVersion = android.FutureApiLevel
2966 }
2967
2968 return apexSdkVersion
2969}
2970
Colin Crossc99deeb2016-04-11 15:06:20 -07002971// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002972func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002973 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002974
Colin Cross0de8a1e2020-09-18 14:15:30 -07002975 var directStaticDeps []StaticLibraryInfo
2976 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002977
Colin Cross0de8a1e2020-09-18 14:15:30 -07002978 reexportExporter := func(exporter FlagExporterInfo) {
2979 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2980 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2981 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2982 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2983 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002984 }
2985
Colin Crossff694a82023-12-13 15:54:49 -08002986 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08002987 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09002988
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002989 skipModuleList := map[string]bool{}
2990
2991 var apiImportInfo multitree.ApiImportInfo
2992 hasApiImportInfo := false
2993
2994 ctx.VisitDirectDeps(func(dep android.Module) {
2995 if dep.Name() == "api_imports" {
Colin Cross313aa542023-12-13 13:47:44 -08002996 apiImportInfo, _ = android.OtherModuleProvider(ctx, dep, multitree.ApiImportsProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002997 hasApiImportInfo = true
2998 }
2999 })
3000
3001 if hasApiImportInfo {
3002 targetStubModuleList := map[string]string{}
3003 targetOrigModuleList := map[string]string{}
3004
3005 // Search for dependency which both original module and API imported library with APEX stub exists
3006 ctx.VisitDirectDeps(func(dep android.Module) {
3007 depName := ctx.OtherModuleName(dep)
3008 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
3009 targetStubModuleList[apiLibrary] = depName
3010 }
3011 })
3012 ctx.VisitDirectDeps(func(dep android.Module) {
3013 depName := ctx.OtherModuleName(dep)
3014 if origLibrary, ok := targetStubModuleList[depName]; ok {
3015 targetOrigModuleList[origLibrary] = depName
3016 }
3017 })
3018
3019 // Decide which library should be used between original and API imported library
3020 ctx.VisitDirectDeps(func(dep android.Module) {
3021 depName := ctx.OtherModuleName(dep)
3022 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003023 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003024 skipModuleList[depName] = true
3025 } else {
3026 skipModuleList[apiLibrary] = true
3027 }
3028 }
3029 })
3030 }
3031
Colin Crossd11fcda2017-10-23 17:59:01 -07003032 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003033 depName := ctx.OtherModuleName(dep)
3034 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003035
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003036 if _, ok := skipModuleList[depName]; ok {
3037 // skip this module because original module or API imported module matching with this should be used instead.
3038 return
3039 }
3040
Dan Willemsen47450072021-10-19 20:24:49 -07003041 if depTag == android.DarwinUniversalVariantTag {
3042 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3043 return
3044 }
3045
Vinh Tran367d89d2023-04-28 11:21:25 -04003046 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003047 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003048 depPaths.AidlLibraryInfos = append(
3049 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003050 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003051 )
3052 }
3053 }
3054
Ivan Lozano52767be2019-10-18 14:49:46 -07003055 ccDep, ok := dep.(LinkableInterface)
3056 if !ok {
3057
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003058 // handling for a few module types that aren't cc Module but that are also supported
3059 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003060 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003061 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003062 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3063 genRule.GeneratedSourceFiles()...)
3064 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003065 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003066 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003067 // Support exported headers from a generated_sources dependency
3068 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003069 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003070 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003071 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003072 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003073 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003074 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003075 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003076 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003077 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3078 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003079 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003080 // 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 +09003081 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003082
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003083 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003084 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003085 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003086 }
Colin Crosscef792e2021-06-11 18:01:26 -07003087 case CrtBeginDepTag:
3088 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3089 case CrtEndDepTag:
3090 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003091 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003092 return
3093 }
3094
Colin Crossfe17f6f2019-03-28 19:30:56 -07003095 if depTag == android.ProtoPluginDepTag {
3096 return
3097 }
3098
Colin Crossd11fcda2017-10-23 17:59:01 -07003099 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003100 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3101 return
3102 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003103 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003104 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3105 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003106 return
3107 }
3108
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003109 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003110 // Skip reused objects for stub libraries, they use their own stub object file instead.
3111 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3112 // version mutator, so the stubs variant is created from the shared variant that
3113 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003114 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003115 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003116 objs := staticAnalogue.ReuseObjects
3117 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003118 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003119 reexportExporter(depExporterInfo)
3120 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003121 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003122 }
3123
Colin Cross6e511a92020-07-27 21:26:48 -07003124 linkFile := ccDep.OutputFile()
3125
3126 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3127 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003128 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003129 return
3130 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003131
Jiyong Parke3867542020-12-03 17:28:25 +09003132 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3133 return
3134 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003135 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3136 return
3137 }
Jiyong Parke3867542020-12-03 17:28:25 +09003138
Colin Cross313aa542023-12-13 13:47:44 -08003139 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003140
Colin Cross6e511a92020-07-27 21:26:48 -07003141 var ptr *android.Paths
3142 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003143
Colin Cross6e511a92020-07-27 21:26:48 -07003144 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003145
Colin Cross6e511a92020-07-27 21:26:48 -07003146 switch {
3147 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003148 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003149 if !ctx.Config().AllowMissingDependencies() {
3150 ctx.ModuleErrorf("module %q is not a header library", depName)
3151 } else {
3152 ctx.AddMissingDependencies([]string{depName})
3153 }
3154 return
3155 }
Colin Cross6e511a92020-07-27 21:26:48 -07003156 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003157 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003158 if !ctx.Config().AllowMissingDependencies() {
3159 ctx.ModuleErrorf("module %q is not a shared library", depName)
3160 } else {
3161 ctx.AddMissingDependencies([]string{depName})
3162 }
3163 return
3164 }
Jiyong Parke3867542020-12-03 17:28:25 +09003165
Jiyong Park7d55b612021-06-11 17:22:09 +09003166 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3167 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003168
Jiyong Park1ad8e162020-12-01 23:40:09 +09003169 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3170 // linkFile, depFile, and ptr.
3171 if c.IsStubs() {
3172 break
3173 }
3174
Colin Cross0de8a1e2020-09-18 14:15:30 -07003175 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3176 depFile = sharedLibraryInfo.TableOfContents
3177
Colin Cross6e511a92020-07-27 21:26:48 -07003178 ptr = &depPaths.SharedLibs
3179 switch libDepTag.Order {
3180 case earlyLibraryDependency:
3181 ptr = &depPaths.EarlySharedLibs
3182 depPtr = &depPaths.EarlySharedLibsDeps
3183 case normalLibraryDependency:
3184 ptr = &depPaths.SharedLibs
3185 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003186 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003187 case lateLibraryDependency:
3188 ptr = &depPaths.LateSharedLibs
3189 depPtr = &depPaths.LateSharedLibsDeps
3190 default:
3191 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003192 }
Colin Cross6e511a92020-07-27 21:26:48 -07003193 case libDepTag.static():
Colin Cross313aa542023-12-13 13:47:44 -08003194 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3195 if !isStaticLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003196 if !ctx.Config().AllowMissingDependencies() {
3197 ctx.ModuleErrorf("module %q is not a static library", depName)
3198 } else {
3199 ctx.AddMissingDependencies([]string{depName})
3200 }
3201 return
3202 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003203
3204 // Stubs lib doesn't link to the static lib dependencies. Don't set
3205 // linkFile, depFile, and ptr.
3206 if c.IsStubs() {
3207 break
3208 }
3209
Colin Cross0de8a1e2020-09-18 14:15:30 -07003210 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003211 if libDepTag.wholeStatic {
3212 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003213 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3214 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003215 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003216 // This case normally catches prebuilt static
3217 // libraries, but it can also occur when
3218 // AllowMissingDependencies is on and the
3219 // dependencies has no sources of its own
3220 // but has a whole_static_libs dependency
3221 // on a missing library. We want to depend
3222 // on the .a file so that there is something
3223 // in the dependency tree that contains the
3224 // error rule for the missing transitive
3225 // dependency.
3226 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003227 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003228 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3229 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003230 } else {
3231 switch libDepTag.Order {
3232 case earlyLibraryDependency:
3233 panic(fmt.Errorf("early static libs not suppported"))
3234 case normalLibraryDependency:
3235 // static dependencies will be handled separately so they can be ordered
3236 // using transitive dependencies.
3237 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003238 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003239 case lateLibraryDependency:
3240 ptr = &depPaths.LateStaticLibs
3241 default:
3242 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003243 }
3244 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003245 if libDepTag.unexportedSymbols {
3246 depPaths.LdFlags = append(depPaths.LdFlags,
3247 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3248 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003249 }
3250
Colin Cross6e511a92020-07-27 21:26:48 -07003251 if libDepTag.static() && !libDepTag.wholeStatic {
3252 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3253 ctx.ModuleErrorf("module %q not a static library", depName)
3254 return
3255 }
Logan Chien43d34c32017-12-20 01:17:32 +08003256
Colin Cross6e511a92020-07-27 21:26:48 -07003257 // When combining coverage files for shared libraries and executables, coverage files
3258 // in static libraries act as if they were whole static libraries. The same goes for
3259 // source based Abi dump files.
3260 if c, ok := ccDep.(*Module); ok {
3261 staticLib := c.linker.(libraryInterface)
3262 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3263 staticLib.objs().coverageFiles...)
3264 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3265 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003266 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003267 // Handle non-CC modules here
3268 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003269 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003270 }
3271 }
3272
Colin Cross6e511a92020-07-27 21:26:48 -07003273 if ptr != nil {
3274 if !linkFile.Valid() {
3275 if !ctx.Config().AllowMissingDependencies() {
3276 ctx.ModuleErrorf("module %q missing output file", depName)
3277 } else {
3278 ctx.AddMissingDependencies([]string{depName})
3279 }
3280 return
3281 }
3282 *ptr = append(*ptr, linkFile.Path())
3283 }
3284
3285 if depPtr != nil {
3286 dep := depFile
3287 if !dep.Valid() {
3288 dep = linkFile
3289 }
3290 *depPtr = append(*depPtr, dep.Path())
3291 }
3292
Colin Cross0de8a1e2020-09-18 14:15:30 -07003293 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3294 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3295 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3296 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3297
3298 if libDepTag.reexportFlags {
3299 reexportExporter(depExporterInfo)
3300 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3301 // Re-exported shared library headers must be included as well since they can help us with type information
3302 // about template instantiations (instantiated from their headers).
3303 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
3304 // scripts.
3305 c.sabi.Properties.ReexportedIncludes = append(
3306 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3307 }
3308
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003309 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003310 switch {
3311 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003312 c.Properties.AndroidMkHeaderLibs = append(
3313 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003314 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003315 if lib := moduleLibraryInterface(dep); lib != nil {
3316 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003317 // Add the dependency to the APEX(es) providing the library so that
3318 // m <module> can trigger building the APEXes as well.
Colin Cross313aa542023-12-13 13:47:44 -08003319 depApexInfo, _ := android.OtherModuleProvider(ctx, dep, android.ApexInfoProvider)
Jiyong Parkab50b072021-05-12 17:13:56 +09003320 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003321 c.Properties.ApexesProvidingSharedLibs = append(
3322 c.Properties.ApexesProvidingSharedLibs, an)
3323 }
3324 }
3325 }
3326
3327 // Note: the order of libs in this list is not important because
3328 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003329 c.Properties.AndroidMkSharedLibs = append(
3330 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003331 // Record BaseLibName for snapshots.
3332 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003333 case libDepTag.static():
3334 if libDepTag.wholeStatic {
3335 c.Properties.AndroidMkWholeStaticLibs = append(
3336 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3337 } else {
3338 c.Properties.AndroidMkStaticLibs = append(
3339 c.Properties.AndroidMkStaticLibs, makeLibName)
3340 }
Justin Yun5e035862021-06-29 20:50:37 +09003341 // Record BaseLibName for snapshots.
3342 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003343 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003344 } else if !c.IsStubs() {
3345 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3346
Colin Cross6e511a92020-07-27 21:26:48 -07003347 switch depTag {
3348 case runtimeDepTag:
3349 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003350 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003351 // Record BaseLibName for snapshots.
3352 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003353 case objDepTag:
3354 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3355 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003356 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003357 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003358 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003359 case dynamicLinkerDepTag:
3360 depPaths.DynamicLinker = linkFile
3361 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003362 }
Colin Crossca860ac2016-01-04 14:34:37 -08003363 })
3364
Jeff Gaston294356f2017-09-27 17:05:30 -07003365 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003366 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3367 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3368 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003369
Colin Crossdd84e052017-05-17 13:44:16 -07003370 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003371 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003372 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3373 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003374 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003375 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3376 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003377 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003378 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003379 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003380
3381 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003382 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003383 }
Colin Crossdd84e052017-05-17 13:44:16 -07003384
Colin Crossca860ac2016-01-04 14:34:37 -08003385 return depPaths
3386}
3387
Spandan Das604f3762023-03-16 22:51:40 +00003388func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003389 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003390 thisModule, ok := ctx.Module().(android.ApexModule)
3391 if !ok {
3392 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3393 }
3394
3395 useVndk := false
3396 bootstrap := false
3397 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3398 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3399 } else {
3400 useVndk = linkable.UseVndk()
3401 bootstrap = linkable.Bootstrap()
3402 }
3403
Colin Crossff694a82023-12-13 15:54:49 -08003404 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003405
3406 useStubs := false
3407
3408 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3409 if !apexInfo.IsForPlatform() {
3410 // For platform libraries, use current version of LLNDK
3411 // If this is for use_vendor apex we will apply the same rules
3412 // of apex sdk enforcement below to choose right version.
3413 useStubs = true
3414 }
3415 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3416 // If not building for APEX or the containing APEX allows the use of
3417 // platform APIs, use stubs only when it is from an APEX (and not from
3418 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3419 // bootstrap modules, always link to non-stub variant
3420 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3421
3422 isApexImportedApiLibrary := false
3423
3424 if cc, ok := dep.(*Module); ok {
3425 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3426 if apiLibrary.hasApexStubs() {
3427 isApexImportedApiLibrary = true
3428 }
3429 }
3430 }
3431
3432 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3433
3434 if useStubs {
3435 // Another exception: if this module is a test for an APEX, then
3436 // it is linked with the non-stub variant of a module in the APEX
3437 // as if this is part of the APEX.
Colin Crossff694a82023-12-13 15:54:49 -08003438 testFor, _ := android.ModuleProvider(ctx, android.ApexTestForInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003439 for _, apexContents := range testFor.ApexContents {
3440 if apexContents.DirectlyInApex(depName) {
3441 useStubs = false
3442 break
3443 }
3444 }
3445 }
3446 if useStubs {
3447 // Yet another exception: If this module and the dependency are
3448 // available to the same APEXes then skip stubs between their
3449 // platform variants. This complements the test_for case above,
3450 // which avoids the stubs on a direct APEX library dependency, by
3451 // avoiding stubs for indirect test dependencies as well.
3452 //
3453 // TODO(b/183882457): This doesn't work if the two libraries have
3454 // only partially overlapping apex_available. For that test_for
3455 // modules would need to be split into APEX variants and resolved
3456 // separately for each APEX they have access to.
3457 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3458 useStubs = false
3459 }
3460 }
3461 } else {
3462 // If building for APEX, use stubs when the parent is in any APEX that
3463 // the child is not in.
3464 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3465 }
3466
3467 return useStubs
3468}
3469
3470// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3471// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3472// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3473// has different level of updatability. For example, if a library foo in an APEX depends on a
3474// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3475// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3476// same APEX as foo, the non-stub variant of bar is used.
3477func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3478 depTag := ctx.OtherModuleDependencyTag(dep)
3479 libDepTag, ok := depTag.(libraryDependencyTag)
3480 if !ok || !libDepTag.shared() {
3481 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3482 }
3483
Colin Cross313aa542023-12-13 13:47:44 -08003484 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3485 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3486 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003487
3488 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003489 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003490 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003491 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3492 toUse := stubs[len(stubs)-1]
3493 sharedLibraryInfo = toUse.SharedLibraryInfo
3494 depExporterInfo = toUse.FlagExporterInfo
3495 }
3496 }
3497 return sharedLibraryInfo, depExporterInfo
3498}
3499
Colin Cross0de8a1e2020-09-18 14:15:30 -07003500// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3501// to match the topological order of the dependency tree, including any static analogues of
3502// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3503// of the transitive dependencies.
Colin Crossc85750b2022-04-21 12:50:51 -07003504func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet[android.Path]) {
3505 transitiveStaticLibsBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003506 var staticPaths android.Paths
3507 for _, staticDep := range staticDeps {
3508 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3509 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3510 }
3511 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003512 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3513 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003514 }
3515 }
3516 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3517
3518 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3519
3520 // reorder the dependencies based on transitive dependencies
3521 staticPaths = android.FirstUniquePaths(staticPaths)
3522 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3523
3524 if len(orderedStaticPaths) != len(staticPaths) {
3525 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3526 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3527 }
3528
3529 return orderedStaticPaths, transitiveStaticLibs
3530}
3531
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003532// BaseLibName trims known prefixes and suffixes
3533func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003534 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3535 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003536 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003537 return libName
3538}
3539
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003540func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003541 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003542 ccDepModule, _ := ccDep.(*Module)
3543 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003544 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003545
Justin Yuncbca3732021-02-03 19:24:13 +09003546 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003547 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003548 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003549 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003550
Ivan Lozanod1dec542021-05-26 15:33:11 -04003551 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003552 }
3553 }
3554
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003555 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3556 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003557 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3558 // core module instead.
3559 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003560 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003561 // The vendor and product modules in Make will have been renamed to not conflict with the
3562 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003563 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003564 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003565 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003566 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003567 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003568 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003569 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003570 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003571 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003572 } else {
3573 return libName
3574 }
3575}
3576
Colin Crossca860ac2016-01-04 14:34:37 -08003577func (c *Module) InstallInData() bool {
3578 if c.installer == nil {
3579 return false
3580 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003581 return c.installer.inData()
3582}
3583
3584func (c *Module) InstallInSanitizerDir() bool {
3585 if c.installer == nil {
3586 return false
3587 }
3588 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003589 return true
3590 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003591 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003592}
3593
Yifan Hong1b3348d2020-01-21 15:53:22 -08003594func (c *Module) InstallInRamdisk() bool {
3595 return c.InRamdisk()
3596}
3597
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003598func (c *Module) InstallInVendorRamdisk() bool {
3599 return c.InVendorRamdisk()
3600}
3601
Jiyong Parkf9332f12018-02-01 00:54:12 +09003602func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003603 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003604}
3605
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003606func (c *Module) MakeUninstallable() {
3607 if c.installer == nil {
3608 c.ModuleBase.MakeUninstallable()
3609 return
3610 }
3611 c.installer.makeUninstallable(c)
3612}
3613
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003614func (c *Module) HostToolPath() android.OptionalPath {
3615 if c.installer == nil {
3616 return android.OptionalPath{}
3617 }
3618 return c.installer.hostToolPath()
3619}
3620
Nan Zhangd4e641b2017-07-12 12:55:28 -07003621func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3622 return c.outputFile
3623}
3624
Colin Cross41955e82019-05-29 14:40:35 -07003625func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3626 switch tag {
3627 case "":
3628 if c.outputFile.Valid() {
3629 return android.Paths{c.outputFile.Path()}, nil
3630 }
3631 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003632 case "unstripped":
3633 if c.linker != nil {
3634 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3635 }
3636 return nil, nil
Wei Li5f5d2712023-12-11 15:40:29 -08003637 case "stripped_all":
3638 if c.linker != nil {
3639 return android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), nil
3640 }
3641 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003642 default:
3643 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003644 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003645}
3646
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003647func (c *Module) static() bool {
3648 if static, ok := c.linker.(interface {
3649 static() bool
3650 }); ok {
3651 return static.static()
3652 }
3653 return false
3654}
3655
Jiyong Park379de2f2018-12-19 02:47:14 +09003656func (c *Module) staticBinary() bool {
3657 if static, ok := c.linker.(interface {
3658 staticBinary() bool
3659 }); ok {
3660 return static.staticBinary()
3661 }
3662 return false
3663}
3664
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003665func (c *Module) testBinary() bool {
3666 if test, ok := c.linker.(interface {
3667 testBinary() bool
3668 }); ok {
3669 return test.testBinary()
3670 }
3671 return false
3672}
3673
Jingwen Chen537242c2022-08-24 11:53:27 +00003674func (c *Module) testLibrary() bool {
3675 if test, ok := c.linker.(interface {
3676 testLibrary() bool
3677 }); ok {
3678 return test.testLibrary()
3679 }
3680 return false
3681}
3682
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003683func (c *Module) benchmarkBinary() bool {
3684 if b, ok := c.linker.(interface {
3685 benchmarkBinary() bool
3686 }); ok {
3687 return b.benchmarkBinary()
3688 }
3689 return false
3690}
3691
3692func (c *Module) fuzzBinary() bool {
3693 if f, ok := c.linker.(interface {
3694 fuzzBinary() bool
3695 }); ok {
3696 return f.fuzzBinary()
3697 }
3698 return false
3699}
3700
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003701// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3702func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003703 if h, ok := c.linker.(interface {
3704 header() bool
3705 }); ok {
3706 return h.header()
3707 }
3708 return false
3709}
3710
Ivan Lozanod7586b62021-04-01 09:49:36 -04003711func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003712 if b, ok := c.linker.(interface {
3713 binary() bool
3714 }); ok {
3715 return b.binary()
3716 }
3717 return false
3718}
3719
Justin Yun5e035862021-06-29 20:50:37 +09003720func (c *Module) StaticExecutable() bool {
3721 if b, ok := c.linker.(*binaryDecorator); ok {
3722 return b.static()
3723 }
3724 return false
3725}
3726
Ivan Lozanod7586b62021-04-01 09:49:36 -04003727func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003728 if o, ok := c.linker.(interface {
3729 object() bool
3730 }); ok {
3731 return o.object()
3732 }
3733 return false
3734}
3735
Ivan Lozanof9e21722020-12-02 09:00:51 -05003736func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003737 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003738 if c.IsLlndk() {
3739 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003740 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003741 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003742 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003743 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003744 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003745 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003746 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003747 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003748 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003749 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003750 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003751 return "native:product"
3752 }
Jooyung Han38002912019-05-16 04:01:54 +09003753 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003754 } else if c.InRamdisk() {
3755 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003756 } else if c.InVendorRamdisk() {
3757 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003758 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003759 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003760 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003761 return "native:ndk:none:none"
3762 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3763 //family, link := getNdkStlFamilyAndLinkType(c)
3764 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003765 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003766 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003767 } else {
3768 return "native:platform"
3769 }
3770}
3771
Jiyong Park9d452992018-10-03 00:38:19 +09003772// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003773// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003774func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003775 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003776 // Stub libs and prebuilt libs in a versioned SDK are not
3777 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003778 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003779 } else if _, ok := c.linker.(testPerSrc); ok {
3780 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003781 }
3782 return false
3783}
3784
Jiyong Parka90ca002019-10-07 15:47:24 +09003785func (c *Module) AvailableFor(what string) bool {
3786 if linker, ok := c.linker.(interface {
3787 availableFor(string) bool
3788 }); ok {
3789 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3790 } else {
3791 return c.ApexModuleBase.AvailableFor(what)
3792 }
3793}
3794
Jiyong Park62304bb2020-04-13 16:19:48 +09003795func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003796 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003797}
3798
Paul Duffin0cb37b92020-03-04 14:52:46 +00003799func (c *Module) EverInstallable() bool {
3800 return c.installer != nil &&
3801 // Check to see whether the module is actually ever installable.
3802 c.installer.everInstallable()
3803}
3804
Ivan Lozanod7586b62021-04-01 09:49:36 -04003805func (c *Module) PreventInstall() bool {
3806 return c.Properties.PreventInstall
3807}
3808
3809func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003810 if c.library != nil {
3811 if i := c.library.installable(); i != nil {
3812 return i
3813 }
3814 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003815 return c.Properties.Installable
3816}
3817
3818func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003819 ret := c.EverInstallable() &&
3820 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003821 proptools.BoolDefault(c.Installable(), true) &&
3822 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003823
3824 // The platform variant doesn't need further condition. Apex variants however might not
3825 // be installable because it will likely to be included in the APEX and won't appear
3826 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003827 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003828 return ret
3829 }
3830
3831 // Special case for modules that are configured to be installed to /data, which includes
3832 // test modules. For these modules, both APEX and non-APEX variants are considered as
3833 // installable. This is because even the APEX variants won't be included in the APEX, but
3834 // will anyway be installed to /data/*.
3835 // See b/146995717
3836 if c.InstallInData() {
3837 return ret
3838 }
3839
3840 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003841}
3842
Logan Chien41eabe62019-04-10 13:33:58 +08003843func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3844 if c.linker != nil {
3845 if library, ok := c.linker.(*libraryDecorator); ok {
3846 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3847 }
3848 }
3849}
3850
Jiyong Park45bf82e2020-12-15 22:29:02 +09003851var _ android.ApexModule = (*Module)(nil)
3852
3853// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003854func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003855 depTag := ctx.OtherModuleDependencyTag(dep)
3856 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3857
3858 if cc, ok := dep.(*Module); ok {
3859 if cc.HasStubsVariants() {
3860 if isLibDepTag && libDepTag.shared() {
3861 // dynamic dep to a stubs lib crosses APEX boundary
3862 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003863 }
Colin Cross6e511a92020-07-27 21:26:48 -07003864 if IsRuntimeDepTag(depTag) {
3865 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003866 return false
3867 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003868 }
Zhijun Heec285872021-04-24 10:47:08 -07003869 if cc.IsLlndk() {
3870 return false
3871 }
Colin Crossaac32222020-07-29 12:51:56 -07003872 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003873 // shared_lib dependency from a static lib is considered as crossing
3874 // the APEX boundary because the dependency doesn't actually is
3875 // linked; the dependency is used only during the compilation phase.
3876 return false
3877 }
Jiyong Parke3867542020-12-03 17:28:25 +09003878
3879 if isLibDepTag && libDepTag.excludeInApex {
3880 return false
3881 }
Colin Cross6e511a92020-07-27 21:26:48 -07003882 }
Colin Crossc1b36442021-05-06 13:42:48 -07003883 if depTag == stubImplDepTag {
3884 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003885 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003886 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003887 if depTag == staticVariantTag {
3888 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3889 // actually mean that the static lib (and its dependencies) are copied into the
3890 // APEX.
3891 return false
3892 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003893 return true
3894}
3895
Jiyong Park45bf82e2020-12-15 22:29:02 +09003896// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003897func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3898 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003899 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3900 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3901 return nil
3902 }
Jooyung Han749dc692020-04-15 11:03:39 +09003903 // We don't check for prebuilt modules
3904 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3905 return nil
3906 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003907
Jooyung Han749dc692020-04-15 11:03:39 +09003908 minSdkVersion := c.MinSdkVersion()
3909 if minSdkVersion == "apex_inherit" {
3910 return nil
3911 }
3912 if minSdkVersion == "" {
3913 // JNI libs within APK-in-APEX fall into here
3914 // Those are okay to set sdk_version instead
3915 // We don't have to check if this is a SDK variant because
3916 // non-SDK variant resets sdk_version, which works too.
3917 minSdkVersion = c.SdkVersion()
3918 }
Dan Albertc8060532020-07-22 22:32:17 -07003919 if minSdkVersion == "" {
3920 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3921 }
3922 // Not using nativeApiLevelFromUser because the context here is not
3923 // necessarily a native context.
3924 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003925 if err != nil {
3926 return err
3927 }
Dan Albertc8060532020-07-22 22:32:17 -07003928
Colin Cross8ca61c12022-10-06 21:00:14 -07003929 // A dependency only needs to support a min_sdk_version at least
3930 // as high as the api level that the architecture was introduced in.
3931 // This allows introducing new architectures in the platform that
3932 // need to be included in apexes that normally require an older
3933 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08003934 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07003935 if sdkVersion.LessThan(minApiForArch) {
3936 sdkVersion = minApiForArch
3937 }
3938
Dan Albertc8060532020-07-22 22:32:17 -07003939 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003940 return fmt.Errorf("newer SDK(%v)", ver)
3941 }
3942 return nil
3943}
3944
Paul Duffinb5769c12021-05-12 16:16:51 +01003945// Implements android.ApexModule
3946func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3947 // stub libraries and native bridge libraries are always available to platform
3948 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3949}
3950
Jooyung Han91f92032022-02-04 12:36:33 +09003951// Overrides android.ApexModuleBase.UniqueApexVariations
3952func (c *Module) UniqueApexVariations() bool {
3953 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
3954 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
3955 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09003956 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09003957 return c.UseVndk() && c.IsVndk()
3958}
3959
Inseob Kima1888ce2022-10-04 14:42:02 +09003960func (c *Module) overriddenModules() []string {
3961 if o, ok := c.linker.(overridable); ok {
3962 return o.overriddenModules()
3963 }
3964 return nil
3965}
3966
Rob Seymour925aa092021-08-10 20:42:03 +00003967var _ snapshot.RelativeInstallPath = (*Module)(nil)
3968
Liz Kammer35ca77e2021-12-22 15:31:40 -05003969type moduleType int
3970
3971const (
3972 unknownType moduleType = iota
3973 binary
3974 object
3975 fullLibrary
3976 staticLibrary
3977 sharedLibrary
3978 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00003979 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00003980 ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00003981 ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05003982)
3983
3984func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00003985 if c.testBinary() {
3986 // testBinary is also a binary, so this comes before the c.Binary()
3987 // conditional. A testBinary has additional implicit dependencies and
3988 // other test-only semantics.
3989 return testBin
3990 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003991 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003992 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003993 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00003994 } else if c.testLibrary() {
3995 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
3996 // will let them add implicit compile deps on gtest, for example.
3997 //
Liz Kammerefc51d92023-04-21 15:11:25 -04003998 // For now, treat them as regular libraries.
3999 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004000 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004001 static := false
4002 shared := false
4003 if library, ok := c.linker.(*libraryDecorator); ok {
4004 static = library.MutatedProperties.BuildStatic
4005 shared = library.MutatedProperties.BuildShared
4006 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4007 static = library.MutatedProperties.BuildStatic
4008 shared = library.MutatedProperties.BuildShared
4009 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004010 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004011 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004012 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004013 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004014 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004015 return staticLibrary
4016 }
4017 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004018 } else if c.isNDKStubLibrary() {
4019 return ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004020 } else if c.IsNdkPrebuiltStl() {
4021 return ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004022 }
4023 return unknownType
4024}
4025
Colin Crosscfad1192015-11-02 16:43:11 -08004026// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004027type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004028 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004029 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004030 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004031}
4032
Patrice Arrudac249c712019-03-19 17:00:29 -07004033// cc_defaults provides a set of properties that can be inherited by other cc
4034// modules. A module can use the properties from a cc_defaults using
4035// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4036// merged (when possible) by prepending the default module's values to the
4037// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004038func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004039 return DefaultsFactory()
4040}
4041
Colin Cross36242852017-06-23 15:06:31 -07004042func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004043 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004044
Colin Cross36242852017-06-23 15:06:31 -07004045 module.AddProperties(props...)
4046 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004047 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004048 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004049 &BaseCompilerProperties{},
4050 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004051 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004052 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004053 &StaticProperties{},
4054 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004055 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004056 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004057 &TestLinkerProperties{},
4058 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004059 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004060 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004061 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004062 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004063 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004064 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004065 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004066 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004067 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004068 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004069 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004070 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004071 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004072 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004073 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004074 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4075 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004076 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004077 )
Colin Crosscfad1192015-11-02 16:43:11 -08004078
Jooyung Hancc372c52019-09-25 15:18:44 +09004079 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004080
4081 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004082}
4083
Jiyong Park2286afd2020-06-16 21:58:53 +09004084func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004085 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004086}
4087
Kiyoung Kim51279d32022-08-24 14:10:46 +09004088func (c *Module) isImportedApiLibrary() bool {
4089 _, ok := c.linker.(*apiLibraryDecorator)
4090 return ok
4091}
4092
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004093func kytheExtractAllFactory() android.Singleton {
4094 return &kytheExtractAllSingleton{}
4095}
4096
4097type kytheExtractAllSingleton struct {
4098}
4099
4100func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4101 var xrefTargets android.Paths
4102 ctx.VisitAllModules(func(module android.Module) {
4103 if ccModule, ok := module.(xref); ok {
4104 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4105 }
4106 })
4107 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4108 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004109 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004110 }
4111}
4112
Jihoon Kangf78a8902022-09-01 22:47:07 +00004113func (c *Module) Partition() string {
4114 if p, ok := c.installer.(interface {
4115 getPartition() string
4116 }); ok {
4117 return p.getPartition()
4118 }
4119 return ""
4120}
4121
Colin Cross06a931b2015-10-28 17:23:31 -07004122var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004123var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004124var BoolPtr = proptools.BoolPtr
4125var String = proptools.String
4126var StringPtr = proptools.StringPtr