blob: 2980c1a11c830f0c1c6a43e1e1b5cf3b93e4902d [file] [log] [blame]
Colin Cross5049f022015-03-18 13:28:46 -07001// Copyright 2015 Google Inc. All rights reserved.
Colin Cross3f40fa42015-01-30 17:27:36 -08002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file contains the module types for compiling C/C++ for Android, and converts the properties
18// into the flags and filenames necessary to pass to the compiler. The final creation of the rules
19// is handled in builder.go
20
21import (
Colin Cross41955e82019-05-29 14:40:35 -070022 "fmt"
Logan Chien41eabe62019-04-10 13:33:58 +080023 "io"
Dan Albert9e10cd42016-08-03 14:12:14 -070024 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080025 "strings"
26
Aditya Choudhary87b2ab22023-11-17 15:27:06 +000027 "android/soong/testing"
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +090028
Colin Cross97ba0732015-03-23 17:50:24 -070029 "github.com/google/blueprint"
Colin Cross06a931b2015-10-28 17:23:31 -070030 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070031
Vinh Tran367d89d2023-04-28 11:21:25 -040032 "android/soong/aidl_library"
Colin Cross635c3b02016-05-18 15:37:25 -070033 "android/soong/android"
Colin Crossb98c8b02016-07-29 13:44:28 -070034 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070035 "android/soong/fuzz"
Colin Cross5049f022015-03-18 13:28:46 -070036 "android/soong/genrule"
Kiyoung Kim487689e2022-07-26 09:48:22 +090037 "android/soong/multitree"
Colin Cross3f40fa42015-01-30 17:27:36 -080038)
39
Colin Cross463a90e2015-06-17 14:20:06 -070040func init() {
Paul Duffin036e7002019-12-19 19:16:28 +000041 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -070042
Inseob Kim3b244062023-07-11 13:31:36 +090043 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +000044 pctx.Import("android/soong/cc/config")
45}
46
47func RegisterCCBuildComponents(ctx android.RegistrationContext) {
48 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
49
50 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossc511bc52020-04-07 16:50:32 +000051 ctx.BottomUp("sdk", sdkMutator).Parallel()
Inseob Kim64c43952019-08-26 16:52:35 +090052 ctx.BottomUp("vndk", VndkMutator).Parallel()
Kiyoung Kim973cb6f2024-04-29 14:14:53 +090053 ctx.BottomUp("llndk", llndkMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070054 ctx.BottomUp("link", LinkageMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +010055 ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
Colin Crossd1f898e2020-08-18 18:35:15 -070056 ctx.BottomUp("version", versionMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070057 ctx.BottomUp("begin", BeginMutator).Parallel()
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
Colin Crossf5f4ad32024-01-19 15:41:48 -080070 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -070071
Colin Crossd38feb02024-01-23 16:38:06 -080072 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +080073
Colin Cross33e0c812024-01-23 16:36:07 -080074 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +000075
Colin Cross6ac83a82024-01-23 11:23:10 -080076 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +090077
Jooyung Han479ca172020-10-19 18:51:07 +090078 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090079 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070080 })
Colin Crossb98c8b02016-07-29 13:44:28 -070081
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080082 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
83 // sabi mutator needs to be run after apex mutator finishes.
84 ctx.TopDown("sabi_deps", sabiDepsMutator)
85 })
86
LaMont Jones0c10e4d2023-05-16 00:58:37 +000087 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070088}
89
Chris Parsonsef6e0cf2020-12-01 18:26:21 -050090// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
91// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
92// edges to these modules.
93// This object is constructed in DepsMutator, by calling to various module delegates to set
94// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
95// dependencies.
96// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
97// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -080098type Deps struct {
99 SharedLibs, LateSharedLibs []string
100 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800101 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800102 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700103
Colin Cross3e5e7782022-06-17 22:17:05 +0000104 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
105 // prevent automatically exporting symbols.
106 UnexportedStaticLibs []string
107
Chris Parsons79d66a52020-06-05 17:26:16 -0400108 // Used for data dependencies adjacent to tests
109 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700110 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400111
Yo Chiang219968c2020-09-22 18:45:04 +0800112 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
113 SystemSharedLibs []string
114
Vinh Tran367d89d2023-04-28 11:21:25 -0400115 // Used by DepMutator to pass aidl_library modules to aidl compiler
116 AidlLibs []string
117
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500118 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800119 StaticUnwinderIfLegacy bool
120
Colin Cross5950f382016-12-13 12:50:57 -0800121 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700122
Colin Cross81413472016-04-11 14:37:39 -0700123 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700124
Dan Willemsenb40aab62016-04-20 14:21:14 -0700125 GeneratedSources []string
126 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900127 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700128
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700129 ReexportGeneratedHeaders []string
130
Colin Crossc465efd2021-06-11 18:00:04 -0700131 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700132
133 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700134 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900135
136 // List of libs that need to be excluded for APEX variant
137 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900138 // List of libs that need to be excluded for non-APEX variant
139 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800140
141 // LLNDK headers for the ABI checker to check LLNDK implementation library.
142 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
143 // The core variant cannot depend on the vendor variant because of the order of CreateVariations.
144 // Instead, the LLNDK implementation depends on the LLNDK header libs.
145 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700146}
147
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500148// PathDeps is a struct containing file paths to dependencies of a module.
149// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
150// It's used to construct flags for various build statements (such as for compiling and linking).
151// It is then passed to module decorator functions responsible for registering build statements
152// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800153type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700154 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900155 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700156 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900157 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700158 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700159 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700160
Colin Cross0de8a1e2020-09-18 14:15:30 -0700161 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossc85750b2022-04-21 12:50:51 -0700162 TranstiveStaticLibrariesForOrdering *android.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700163
Colin Cross26c34ed2016-09-30 17:10:16 -0700164 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100165 Objs Objects
166 // Paths to .o files in dependencies that provide them. Note that these lists
167 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800168 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700169 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700170
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100171 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
172 // the libs from all whole_static_lib dependencies.
173 WholeStaticLibsFromPrebuilts android.Paths
174
Colin Cross26c34ed2016-09-30 17:10:16 -0700175 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700176 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900177 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700178
Inseob Kimd110f872019-12-06 13:15:38 +0900179 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000180 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900181 IncludeDirs android.Paths
182 SystemIncludeDirs android.Paths
183 ReexportedDirs android.Paths
184 ReexportedSystemDirs android.Paths
185 ReexportedFlags []string
186 ReexportedGeneratedHeaders android.Paths
187 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700188
Colin Cross26c34ed2016-09-30 17:10:16 -0700189 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700190 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700191
Dan Willemsena0790e32018-10-12 00:24:23 -0700192 // Path to the dynamic linker binary
193 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700194
195 // For Darwin builds, the path to the second architecture's output that should
196 // be combined with this architectures's output into a FAT MachO file.
197 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400198
199 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
200 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800201
202 // LLNDK headers for the ABI checker to check LLNDK implementation library.
203 LlndkIncludeDirs android.Paths
204 LlndkSystemIncludeDirs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700205}
206
Colin Cross4af21ed2019-11-04 09:37:55 -0800207// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
208// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
209// command line so they can be overridden by the local module flags).
210type LocalOrGlobalFlags struct {
211 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700212 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800213 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700214 CFlags []string // Flags that apply to C and C++ source files
215 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
216 ConlyFlags []string // Flags that apply to C source files
217 CppFlags []string // Flags that apply to C++ source files
218 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700219 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800220}
221
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500222// Flags contains various types of command line flags (and settings) for use in building build
223// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800224type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500225 // Local flags (which individual modules are responsible for). These may override global flags.
226 Local LocalOrGlobalFlags
227 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700228 Global LocalOrGlobalFlags
229 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800230
231 aidlFlags []string // Flags that apply to aidl source files
232 rsFlags []string // Flags that apply to renderscript source files
233 libFlags []string // Flags to add libraries early to the link order
234 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
235 TidyFlags []string // Flags that apply to clang-tidy
236 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700237
Colin Crossc3199482017-03-30 15:03:04 -0700238 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800239 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700240 SystemIncludeFlags []string
241
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800242 Toolchain config.Toolchain
243 Tidy bool // True if ninja .tidy rules should be generated.
244 NeedTidyFiles bool // True if module link should depend on .tidy files
245 GcovCoverage bool // True if coverage files should be generated.
246 SAbiDump bool // True if header abi dumps should be generated.
247 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800248
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500249 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800250 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500251 // The target-device system path to the dynamic linker.
252 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800253
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700254 CFlagsDeps android.Paths // Files depended on by compiler flags
255 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800256
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500257 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700258 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800259
Colin Cross19878da2019-03-28 14:45:07 -0700260 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700261 protoC bool // Whether to use C instead of C++
262 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700263
264 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200265 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700266}
267
Colin Crossca860ac2016-01-04 14:34:37 -0800268// Properties used to compile all C or C++ modules
269type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700270 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800271 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700272
Jiyong Parkb35a8192020-08-10 15:59:36 +0900273 // The API level that this module is built against. The APIs of this API level will be
274 // visible at build time, but use of any APIs newer than min_sdk_version will render the
275 // module unloadable on older devices. In the future it will be possible to weakly-link new
276 // APIs, making the behavior match Java: such modules will load on older devices, but
277 // calling new APIs on devices that do not support them will result in a crash.
278 //
279 // This property has the same behavior as sdk_version does for Java modules. For those
280 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
281 // does for Java code.
282 //
283 // In addition, setting this property causes two variants to be built, one for the platform
284 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800285 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700286
Jiyong Parkb35a8192020-08-10 15:59:36 +0900287 // Minimum OS API level supported by this C or C++ module. This property becomes the value
288 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
289 // this property is also used to ensure that the min_sdk_version of the containing module is
290 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
291 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
292 // min_sdk_version of the containing APEX. When the module
293 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900294 Min_sdk_version *string
295
Colin Crossc511bc52020-04-07 16:50:32 +0000296 // If true, always create an sdk variant and don't create a platform variant.
297 Sdk_variant_only *bool
298
Jiyong Parkde866cb2018-12-07 23:08:36 +0900299 AndroidMkSharedLibs []string `blueprint:"mutated"`
300 AndroidMkStaticLibs []string `blueprint:"mutated"`
301 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
302 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700303 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900304 HideFromMake bool `blueprint:"mutated"`
305 PreventInstall bool `blueprint:"mutated"`
306 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700307
Yo Chiang219968c2020-09-22 18:45:04 +0800308 // Set by DepsMutator.
309 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
310
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900311 // The name of the image this module is built for
312 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200313
314 // The VNDK version this module is built against. If empty, the module is not
315 // build against the VNDK.
316 VndkVersion string `blueprint:"mutated"`
317
318 // Suffix for the name of Android.mk entries generated by this module
319 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800320
321 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
322 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900323 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900324
Yifan Hong39143a92020-10-26 12:43:12 -0700325 // Make this module available when building for ramdisk.
326 // On device without a dedicated recovery partition, the module is only
327 // available after switching root into
328 // /first_stage_ramdisk. To expose the module before switching root, install
329 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800330 Ramdisk_available *bool
331
Yifan Hong39143a92020-10-26 12:43:12 -0700332 // Make this module available when building for vendor ramdisk.
333 // On device without a dedicated recovery partition, the module is only
334 // available after switching root into
335 // /first_stage_ramdisk. To expose the module before switching root, install
336 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700337 Vendor_ramdisk_available *bool
338
Jiyong Parkf9332f12018-02-01 00:54:12 +0900339 // Make this module available when building for recovery
340 Recovery_available *bool
341
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200342 // Used by imageMutator, set by ImageMutatorBegin()
343 CoreVariantNeeded bool `blueprint:"mutated"`
344 RamdiskVariantNeeded bool `blueprint:"mutated"`
345 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
346 RecoveryVariantNeeded bool `blueprint:"mutated"`
347
348 // A list of variations for the "image" mutator of the form
349 //<image name> '.' <version char>, for example, 'vendor.S'
350 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900351
352 // Allows this module to use non-APEX version of libraries. Useful
353 // for building binaries that are started before APEXes are activated.
354 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900355
356 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
357 // see soong/cc/config/vndk.go
358 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900359
Colin Cross1bc94122021-10-28 13:25:54 -0700360 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000361
362 // Set by factories of module types that can only be referenced from variants compiled against
363 // the SDK.
364 AlwaysSdk bool `blueprint:"mutated"`
365
366 // Variant is an SDK variant created by sdkMutator
367 IsSdkVariant bool `blueprint:"mutated"`
368 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
369 // variant to have a ".sdk" suffix.
370 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700371
Jiyong Park46a512f2020-12-04 18:02:13 +0900372 // List of APEXes that this module has private access to for testing purpose. The module
373 // can depend on libraries that are not exported by the APEXes and use private symbols
374 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000375 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800376
377 Target struct {
378 Platform struct {
379 // List of modules required by the core variant.
380 Required []string `android:"arch_variant"`
381
382 // List of modules not required by the core variant.
383 Exclude_required []string `android:"arch_variant"`
384 } `android:"arch_variant"`
385
386 Recovery struct {
387 // List of modules required by the recovery variant.
388 Required []string `android:"arch_variant"`
389
390 // List of modules not required by the recovery variant.
391 Exclude_required []string `android:"arch_variant"`
392 } `android:"arch_variant"`
393 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700394}
395
396type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900397 // whether this module should be allowed to be directly depended by other
398 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900399 // If set to true, two variants will be built separately, one like
400 // normal, and the other limited to the set of libraries and headers
401 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700402 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900403 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700404 // so it shouldn't have any unversioned runtime dependencies, or
405 // make assumptions about the system that may not be true in the
406 // future.
407 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900408 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900409 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900410 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900411 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900412 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700413 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
414 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900415
Justin Yunebcf0c52021-01-08 18:00:19 +0900416 // This is the same as the "vendor_available" except that the install path
417 // of the vendor variant is /odm or /vendor/odm.
418 // By replacing "vendor_available: true" with "odm_available: true", the
419 // module will install its vendor variant to the /odm partition or /vendor/odm.
420 // As the modules with "odm_available: true" still create the vendor variants,
421 // they can link to the other vendor modules as the vendor_available modules do.
422 // Also, the vendor modules can link to odm_available modules.
423 //
424 // It may not be used for VNDK modules.
425 Odm_available *bool
426
Justin Yun63e9ec72020-10-29 16:49:43 +0900427 // whether this module should be allowed to be directly depended by other
428 // modules with `product_specific: true` or `product_available: true`.
429 // If set to true, an additional product variant will be built separately
430 // that is limited to the set of libraries and headers that are exposed to
431 // /product modules.
432 //
433 // The product variant may be used with a different (newer) /system,
434 // so it shouldn't have any unversioned runtime dependencies, or
435 // make assumptions about the system that may not be true in the
436 // future.
437 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900438 // If set to false, this module becomes inaccessible from /product modules.
439 //
440 // Different from the 'vendor_available' property, the modules with
441 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
442 // library without 'product_available' may not be depended on by any other
443 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900444 //
445 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
446 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
447 Product_available *bool
448
Jiyong Park5fb8c102018-04-09 12:03:06 +0900449 // whether this module is capable of being loaded with other instance
450 // (possibly an older version) of the same module in the same process.
451 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
452 // can be double loaded in a vendor process if the library is also a
453 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
454 // explicitly marked as `double_loadable: true` by the owner, or the dependency
455 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
456 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800457
458 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
459 IsLLNDK bool `blueprint:"mutated"`
460
Colin Cross78212242021-01-06 14:51:30 -0800461 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
462 // set and the module is not listed in VndkMustUseVendorVariantList.
463 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
464
465 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
466 IsVNDKCore bool `blueprint:"mutated"`
467
468 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
469 IsVNDKSP bool `blueprint:"mutated"`
470
471 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
472 // module sets the llndk.private property.
473 IsVNDKPrivate bool `blueprint:"mutated"`
474
475 // IsVNDKProduct is set if a VNDK module sets the product_available property.
476 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700477
478 // IsVendorPublicLibrary is set for the core and product variants of a library that has
479 // vendor_public_library stubs.
480 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800481}
482
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500483// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
484// to understanding details about the type of the current module.
485// For example, one might call these functions to determine whether the current module is a static
486// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800487type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800488 static() bool
489 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700490 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800491 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900492 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900493 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900494 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700495 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900496 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700497 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800498 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900499 minSdkVersion() string
500 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700501 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700502 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800503 IsLlndk() bool
504 IsLlndkPublic() bool
505 isImplementationForLLNDKPublic() bool
506 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900507 isVndk() bool
508 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500509 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700510 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900511 inProduct() bool
512 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800513 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700514 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900515 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900516 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700517 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700518 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800519 getVndkExtendsModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800520 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000521 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800522 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900523 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800524 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800525 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800526 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700527 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700528 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900529 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800530 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700531 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700532 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800533 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800534 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800535 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800536 notInPlatform() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800537}
538
539type SharedFlags struct {
540 numSharedFlags int
541 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800542}
543
544type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700545 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800546 ModuleContextIntf
547}
548
549type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700550 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800551 ModuleContextIntf
552}
553
Colin Cross37047f12016-12-13 17:06:13 -0800554type DepsContext interface {
555 android.BottomUpMutatorContext
556 ModuleContextIntf
557}
558
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500559// feature represents additional (optional) steps to building cc-related modules, such as invocation
560// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800561type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800562 flags(ctx ModuleContext, flags Flags) Flags
563 props() []interface{}
564}
565
Joe Onorato37f900c2023-07-18 16:58:16 -0700566// Information returned from Generator about the source code it's generating
567type GeneratedSource struct {
568 IncludeDirs android.Paths
569 Sources android.Paths
570 Headers android.Paths
571 ReexportedDirs android.Paths
572}
573
574// generator allows injection of generated code
575type Generator interface {
576 GeneratorProps() []interface{}
577 GeneratorInit(ctx BaseModuleContext)
578 GeneratorDeps(ctx DepsContext, deps Deps) Deps
579 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
580 GeneratorSources(ctx ModuleContext) GeneratedSource
581 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
582}
583
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500584// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500585// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800586type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700587 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800588 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800589 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700590 compilerProps() []interface{}
591
Colin Cross76fada02016-07-27 10:31:13 -0700592 appendCflags([]string)
593 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700594 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800595}
596
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500597// linker is the interface for a linker decorator object. Individual module types can provide
598// their own implementation for this decorator, and thus specify custom logic regarding build
599// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800600type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700601 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800602 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700603 linkerFlags(ctx ModuleContext, flags Flags) Flags
604 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800605 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700606
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700607 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700608 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900609 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800610 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700611
612 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900613 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000614
615 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000616 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800617
618 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000619}
620
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500621// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000622type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500623 sharedLibs []string
624 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
625 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700626 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800627}
628
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500629// installer is the interface for an installer helper object. This helper is responsible for
630// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800631type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700632 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700633 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000634 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800635 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700636 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700637 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900638 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000639 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900640 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800641}
642
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800643type xref interface {
644 XrefCcFiles() android.Paths
645}
646
Inseob Kima1888ce2022-10-04 14:42:02 +0900647type overridable interface {
648 overriddenModules() []string
649}
650
Colin Cross6e511a92020-07-27 21:26:48 -0700651type libraryDependencyKind int
652
653const (
654 headerLibraryDependency = iota
655 sharedLibraryDependency
656 staticLibraryDependency
657)
658
659func (k libraryDependencyKind) String() string {
660 switch k {
661 case headerLibraryDependency:
662 return "headerLibraryDependency"
663 case sharedLibraryDependency:
664 return "sharedLibraryDependency"
665 case staticLibraryDependency:
666 return "staticLibraryDependency"
667 default:
668 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
669 }
670}
671
672type libraryDependencyOrder int
673
674const (
675 earlyLibraryDependency = -1
676 normalLibraryDependency = 0
677 lateLibraryDependency = 1
678)
679
680func (o libraryDependencyOrder) String() string {
681 switch o {
682 case earlyLibraryDependency:
683 return "earlyLibraryDependency"
684 case normalLibraryDependency:
685 return "normalLibraryDependency"
686 case lateLibraryDependency:
687 return "lateLibraryDependency"
688 default:
689 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
690 }
691}
692
693// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
694// tags that have a set of predefined tag objects that are reused for each dependency, a
695// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
696// That means that comparing a libraryDependencyTag for equality will only be equal if all
697// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
698// then check individual metadata fields instead.
699type libraryDependencyTag struct {
700 blueprint.BaseDependencyTag
701
702 // These are exported so that fmt.Printf("%#v") can call their String methods.
703 Kind libraryDependencyKind
704 Order libraryDependencyOrder
705
706 wholeStatic bool
707
708 reexportFlags bool
709 explicitlyVersioned bool
710 dataLib bool
711 ndk bool
712
713 staticUnwinder bool
714
715 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900716
Cindy Zhou18417cb2020-12-10 07:12:38 -0800717 // Whether or not this dependency should skip the apex dependency check
718 skipApexAllowedDependenciesCheck bool
719
Jiyong Parke3867542020-12-03 17:28:25 +0900720 // Whether or not this dependency has to be followed for the apex variants
721 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900722 // Whether or not this dependency has to be followed for the non-apex variants
723 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000724
725 // If true, don't automatically export symbols from the static library into a shared library.
726 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700727}
728
729// header returns true if the libraryDependencyTag is tagging a header lib dependency.
730func (d libraryDependencyTag) header() bool {
731 return d.Kind == headerLibraryDependency
732}
733
734// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
735func (d libraryDependencyTag) shared() bool {
736 return d.Kind == sharedLibraryDependency
737}
738
739// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
740func (d libraryDependencyTag) static() bool {
741 return d.Kind == staticLibraryDependency
742}
743
Colin Cross65cb3142021-12-10 23:05:02 +0000744func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
745 if d.shared() {
746 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
747 }
748 return nil
749}
750
751var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
752
Colin Crosse9fe2942020-11-10 18:12:15 -0800753// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
754// binaries or other shared libraries are installed as dependencies.
755func (d libraryDependencyTag) InstallDepNeeded() bool {
756 return d.shared()
757}
758
759var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
760
Yu Liu67a28422024-03-05 00:36:31 +0000761func (d libraryDependencyTag) PropagateAconfigValidation() bool {
762 return d.static()
763}
764
765var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
766
Colin Crosse9fe2942020-11-10 18:12:15 -0800767// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700768// libraryDependencyTag. Each tag object is created globally and reused for multiple
769// dependencies (although since the object contains no references, assigning a tag to a
770// variable and modifying it will not modify the original). Users can compare the tag
771// returned by ctx.OtherModuleDependencyTag against the global original
772type dependencyTag struct {
773 blueprint.BaseDependencyTag
774 name string
775}
776
Colin Crosse9fe2942020-11-10 18:12:15 -0800777// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
778// libraryDependencyTag, but where the dependency needs to be installed when the parent is
779// installed.
780type installDependencyTag struct {
781 blueprint.BaseDependencyTag
782 android.InstallAlwaysNeededDependencyTag
783 name string
784}
785
Colin Crossc99deeb2016-04-11 15:06:20 -0700786var (
Colin Cross6e511a92020-07-27 21:26:48 -0700787 genSourceDepTag = dependencyTag{name: "gen source"}
788 genHeaderDepTag = dependencyTag{name: "gen header"}
789 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
790 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900791 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700792 reuseObjTag = dependencyTag{name: "reuse objects"}
793 staticVariantTag = dependencyTag{name: "static variant"}
794 vndkExtDepTag = dependencyTag{name: "vndk extends"}
795 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700796 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800797 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700798 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700799 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000800 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500801 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400802 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800803 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
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
Ronald Braunsteina115e262024-04-09 18:07:38 -0700849 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700850
Colin Crossca860ac2016-01-04 14:34:37 -0800851 // initialize before calling Init
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000852 hod android.HostOrDeviceSupported
853 multilib android.Multilib
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000854 testModule bool
Colin Crossc472d572015-03-17 15:06:21 -0700855
Paul Duffina0843f62019-12-13 19:50:38 +0000856 // Allowable SdkMemberTypes of this module type.
857 sdkMemberTypes []android.SdkMemberType
858
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500859 // decorator delegates, initialize before calling Init
860 // these may contain module-specific implementations, and effectively allow for custom
861 // type-specific logic. These members may reference different objects or the same object.
862 // Functions of these decorators will be invoked to initialize and register type-specific
863 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800864 generators []Generator
865 compiler compiler
866 linker linker
867 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500868
Spandan Dase12d2522023-09-12 21:42:31 +0000869 features []feature
870 stl *stl
871 sanitize *sanitize
872 coverage *coverage
873 fuzzer *fuzzer
874 sabi *sabi
875 vndkdep *vndkdep
876 lto *lto
877 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000878 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800879
Colin Cross31076b32020-10-23 17:22:06 -0700880 library libraryInterface
881
Colin Cross635c3b02016-05-18 15:37:25 -0700882 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800883
Colin Crossb98c8b02016-07-29 13:44:28 -0700884 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700885
886 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800887
888 // Flags used to compile this module
889 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700890
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800891 // Shared flags among build rules of this module
892 sharedFlags SharedFlags
893
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800894 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700895 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900896
897 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800898 // Kythe (source file indexer) paths for this compilation module
899 kytheFiles android.Paths
Chih-Hung Hsieh80783772021-10-11 16:46:56 -0700900 // Object .o file output paths for this compilation module
901 objFiles android.Paths
902 // Tidy .tidy file output paths for this compilation module
903 tidyFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900904
905 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700906 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700907
908 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -0800909
910 // Aconfig files for all transitive deps. Also exposed via TransitiveDeclarationsInfo
Colin Crossd788b3e2023-11-28 13:14:56 -0800911 mergedAconfigFiles map[string]android.Paths
Inseob Kim37e0bb02024-04-29 15:54:44 +0900912
913 logtagsPaths android.Paths
Colin Crossc472d572015-03-17 15:06:21 -0700914}
915
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200916func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400917 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
918 if b, ok := c.compiler.(*baseCompiler); ok {
919 hasAidl = b.hasSrcExt(".aidl")
920 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
921 hasProto = b.hasSrcExt(".proto")
922 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
923 hasSysprop = b.hasSrcExt(".sysprop")
924 hasWinMsg = b.hasSrcExt(".mc")
925 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
926 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200927 c.AndroidModuleBase().AddJSONData(d)
928 (*d)["Cc"] = map[string]interface{}{
929 "SdkVersion": c.SdkVersion(),
930 "MinSdkVersion": c.MinSdkVersion(),
931 "VndkVersion": c.VndkVersion(),
932 "ProductSpecific": c.ProductSpecific(),
933 "SocSpecific": c.SocSpecific(),
934 "DeviceSpecific": c.DeviceSpecific(),
935 "InProduct": c.InProduct(),
936 "InVendor": c.InVendor(),
937 "InRamdisk": c.InRamdisk(),
938 "InVendorRamdisk": c.InVendorRamdisk(),
939 "InRecovery": c.InRecovery(),
940 "VendorAvailable": c.VendorAvailable(),
941 "ProductAvailable": c.ProductAvailable(),
942 "RamdiskAvailable": c.RamdiskAvailable(),
943 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
944 "RecoveryAvailable": c.RecoveryAvailable(),
945 "OdmAvailable": c.OdmAvailable(),
946 "InstallInData": c.InstallInData(),
947 "InstallInRamdisk": c.InstallInRamdisk(),
948 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
949 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
950 "InstallInRecovery": c.InstallInRecovery(),
951 "InstallInRoot": c.InstallInRoot(),
952 "IsVndk": c.IsVndk(),
953 "IsVndkExt": c.IsVndkExt(),
954 "IsVndkPrivate": c.IsVndkPrivate(),
955 "IsVndkSp": c.IsVndkSp(),
956 "IsLlndk": c.IsLlndk(),
957 "IsLlndkPublic": c.IsLlndkPublic(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200958 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
959 "ApexSdkVersion": c.apexSdkVersion,
960 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400961 "AidlSrcs": hasAidl,
962 "LexSrcs": hasLex,
963 "ProtoSrcs": hasProto,
964 "RenderscriptSrcs": hasRenderscript,
965 "SyspropSrcs": hasSysprop,
966 "WinMsgSrcs": hasWinMsg,
967 "YaccSrsc": hasYacc,
968 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200969 }
970}
971
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500972func (c *Module) SetPreventInstall() {
973 c.Properties.PreventInstall = true
974}
975
976func (c *Module) SetHideFromMake() {
977 c.Properties.HideFromMake = true
978}
979
Ivan Lozanod7586b62021-04-01 09:49:36 -0400980func (c *Module) HiddenFromMake() bool {
981 return c.Properties.HideFromMake
982}
983
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800984func (c *Module) RequiredModuleNames() []string {
985 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
986 if c.ImageVariation().Variation == android.CoreVariation {
987 required = append(required, c.Properties.Target.Platform.Required...)
988 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
989 } else if c.InRecovery() {
990 required = append(required, c.Properties.Target.Recovery.Required...)
991 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
992 }
993 return android.FirstUniqueStrings(required)
994}
995
Ivan Lozano52767be2019-10-18 14:49:46 -0700996func (c *Module) Toc() android.OptionalPath {
997 if c.linker != nil {
998 if library, ok := c.linker.(libraryInterface); ok {
999 return library.toc()
1000 }
1001 }
1002 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1003}
1004
1005func (c *Module) ApiLevel() string {
1006 if c.linker != nil {
1007 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001008 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001009 }
1010 }
1011 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1012}
1013
1014func (c *Module) Static() bool {
1015 if c.linker != nil {
1016 if library, ok := c.linker.(libraryInterface); ok {
1017 return library.static()
1018 }
1019 }
1020 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1021}
1022
1023func (c *Module) Shared() bool {
1024 if c.linker != nil {
1025 if library, ok := c.linker.(libraryInterface); ok {
1026 return library.shared()
1027 }
1028 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001029
Ivan Lozano52767be2019-10-18 14:49:46 -07001030 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1031}
1032
1033func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001034 if c.stl != nil {
1035 return c.stl.Properties.SelectedStl
1036 }
1037 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001038}
1039
Ivan Lozano52767be2019-10-18 14:49:46 -07001040func (c *Module) NdkPrebuiltStl() bool {
1041 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1042 return true
1043 }
1044 return false
1045}
1046
1047func (c *Module) StubDecorator() bool {
1048 if _, ok := c.linker.(*stubDecorator); ok {
1049 return true
1050 }
1051 return false
1052}
1053
1054func (c *Module) SdkVersion() string {
1055 return String(c.Properties.Sdk_version)
1056}
1057
Artur Satayev480e25b2020-04-27 18:53:18 +01001058func (c *Module) MinSdkVersion() string {
1059 return String(c.Properties.Min_sdk_version)
1060}
1061
Jiyong Park5df7bd32021-08-25 16:18:46 +09001062func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001063 if linker, ok := c.linker.(*objectLinker); ok {
1064 return linker.isCrt()
1065 }
1066 return false
1067}
1068
Jiyong Park5df7bd32021-08-25 16:18:46 +09001069func (c *Module) SplitPerApiLevel() bool {
1070 return c.canUseSdk() && c.isCrt()
1071}
1072
Colin Crossc511bc52020-04-07 16:50:32 +00001073func (c *Module) AlwaysSdk() bool {
1074 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1075}
1076
Ivan Lozano183a3212019-10-18 14:18:45 -07001077func (c *Module) CcLibrary() bool {
1078 if c.linker != nil {
1079 if _, ok := c.linker.(*libraryDecorator); ok {
1080 return true
1081 }
Colin Crossd48fe732020-09-23 20:37:24 -07001082 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1083 return true
1084 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001085 }
1086 return false
1087}
1088
1089func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001090 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001091 return true
1092 }
1093 return false
1094}
1095
Spandan Dase12d2522023-09-12 21:42:31 +00001096func (c *Module) IsNdkPrebuiltStl() bool {
1097 if c.linker == nil {
1098 return false
1099 }
1100 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1101 return true
1102 }
1103 return false
1104}
1105
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001106func (c *Module) RlibStd() bool {
1107 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1108}
1109
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001110func (c *Module) RustLibraryInterface() bool {
1111 return false
1112}
1113
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001114func (c *Module) IsFuzzModule() bool {
1115 if _, ok := c.compiler.(*fuzzBinary); ok {
1116 return true
1117 }
1118 return false
1119}
1120
1121func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1122 return c.FuzzModule
1123}
1124
1125func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1126 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1127 return fuzzer.fuzzPackagedModule
1128 }
1129 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1130}
1131
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001132func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001133 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1134 return fuzzer.sharedLibraries
1135 }
1136 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1137}
1138
Ivan Lozano2b262972019-11-21 12:30:50 -08001139func (c *Module) NonCcVariants() bool {
1140 return false
1141}
1142
Ivan Lozano183a3212019-10-18 14:18:45 -07001143func (c *Module) SetStatic() {
1144 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001145 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001146 library.setStatic()
1147 return
1148 }
1149 }
1150 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1151}
1152
1153func (c *Module) SetShared() {
1154 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001155 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001156 library.setShared()
1157 return
1158 }
1159 }
1160 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1161}
1162
1163func (c *Module) BuildStaticVariant() bool {
1164 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001165 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001166 return library.buildStatic()
1167 }
1168 }
1169 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1170}
1171
1172func (c *Module) BuildSharedVariant() bool {
1173 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001174 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001175 return library.buildShared()
1176 }
1177 }
1178 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1179}
1180
1181func (c *Module) Module() android.Module {
1182 return c
1183}
1184
Jiyong Parkc20eee32018-09-05 22:36:17 +09001185func (c *Module) OutputFile() android.OptionalPath {
1186 return c.outputFile
1187}
1188
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001189func (c *Module) CoverageFiles() android.Paths {
1190 if c.linker != nil {
1191 if library, ok := c.linker.(libraryInterface); ok {
1192 return library.objs().coverageFiles
1193 }
1194 }
1195 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1196}
1197
Ivan Lozano183a3212019-10-18 14:18:45 -07001198var _ LinkableInterface = (*Module)(nil)
1199
Jiyong Park719b4462019-01-13 00:39:51 +09001200func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001201 if c.linker != nil {
1202 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001203 }
1204 return nil
1205}
1206
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001207func (c *Module) CoverageOutputFile() android.OptionalPath {
1208 if c.linker != nil {
1209 return c.linker.coverageOutputFilePath()
1210 }
1211 return android.OptionalPath{}
1212}
1213
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001214func (c *Module) RelativeInstallPath() string {
1215 if c.installer != nil {
1216 return c.installer.relativeInstallPath()
1217 }
1218 return ""
1219}
1220
Jooyung Han344d5432019-08-23 11:17:39 +09001221func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001222 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001223}
1224
Colin Cross36242852017-06-23 15:06:31 -07001225func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001226 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001227 for _, generator := range c.generators {
1228 c.AddProperties(generator.GeneratorProps()...)
1229 }
Colin Crossca860ac2016-01-04 14:34:37 -08001230 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001231 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001232 }
1233 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001234 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001235 }
1236 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001237 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001238 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001239 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001240 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001241 }
Colin Cross16b23492016-01-06 14:41:07 -08001242 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001243 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001244 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001245 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001246 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001247 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001248 if c.fuzzer != nil {
1249 c.AddProperties(c.fuzzer.props()...)
1250 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001251 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001252 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001253 }
Justin Yun8effde42017-06-23 19:24:43 +09001254 if c.vndkdep != nil {
1255 c.AddProperties(c.vndkdep.props()...)
1256 }
Stephen Craneba090d12017-05-09 15:44:35 -07001257 if c.lto != nil {
1258 c.AddProperties(c.lto.props()...)
1259 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001260 if c.afdo != nil {
1261 c.AddProperties(c.afdo.props()...)
1262 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001263 if c.orderfile != nil {
1264 c.AddProperties(c.orderfile.props()...)
1265 }
Colin Crossca860ac2016-01-04 14:34:37 -08001266 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001267 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001268 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001269 // Allow test-only on libraries that are not cc_test_library
1270 if c.library != nil && !c.testLibrary() {
1271 c.AddProperties(&c.sourceProperties)
1272 }
Colin Crossc472d572015-03-17 15:06:21 -07001273
Colin Cross36242852017-06-23 15:06:31 -07001274 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001275 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001276 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001277
Colin Cross36242852017-06-23 15:06:31 -07001278 return c
Colin Crossc472d572015-03-17 15:06:21 -07001279}
1280
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001281// UseVndk() returns true if this module is built against VNDK.
1282// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001283func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001284 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001285}
1286
Colin Crossc511bc52020-04-07 16:50:32 +00001287func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001288 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001289 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001290}
1291
1292func (c *Module) UseSdk() bool {
1293 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001294 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001295 }
1296 return false
1297}
1298
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001299func (c *Module) isCoverageVariant() bool {
1300 return c.coverage.Properties.IsCoverageVariant
1301}
1302
Colin Cross95f1ca02020-10-29 20:47:22 -07001303func (c *Module) IsNdk(config android.Config) bool {
1304 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001305}
1306
Colin Cross127bb8b2020-12-16 16:46:01 -08001307func (c *Module) IsLlndk() bool {
1308 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001309}
1310
Colin Cross127bb8b2020-12-16 16:46:01 -08001311func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001312 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001313}
1314
Colin Cross1f3f1302021-04-26 18:37:44 -07001315func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001316 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001317 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001318}
1319
Colin Cross5271fea2021-04-27 13:06:04 -07001320func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1321 lib := moduleLibraryInterface(m)
1322 return lib != nil && (lib.hasVendorPublicLibrary())
1323}
1324
1325// IsVendorPublicLibrary returns true for vendor public libraries.
1326func (c *Module) IsVendorPublicLibrary() bool {
1327 return c.VendorProperties.IsVendorPublicLibrary
1328}
1329
Ivan Lozanof1868af2022-04-12 13:08:36 -04001330func (c *Module) IsVndkPrebuiltLibrary() bool {
1331 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1332 return true
1333 }
1334 return false
1335}
1336
1337func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1338 return c.Properties.SdkAndPlatformVariantVisibleToMake
1339}
1340
Ivan Lozanod7586b62021-04-01 09:49:36 -04001341func (c *Module) HasLlndkStubs() bool {
1342 lib := moduleLibraryInterface(c)
1343 return lib != nil && lib.hasLLNDKStubs()
1344}
1345
1346func (c *Module) StubsVersion() string {
1347 if lib, ok := c.linker.(versionedInterface); ok {
1348 return lib.stubsVersion()
1349 }
1350 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1351}
1352
Colin Cross127bb8b2020-12-16 16:46:01 -08001353// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1354// and does not set llndk.vendor_available: false.
1355func (c *Module) isImplementationForLLNDKPublic() bool {
1356 library, _ := c.library.(*libraryDecorator)
1357 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001358 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001359}
1360
Justin Yunfd9e8042020-12-23 18:23:14 +09001361// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001362func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001363 // Check if VNDK-core-private or VNDK-SP-private
1364 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001365 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001366 }
1367
1368 // Check if LLNDK-private
1369 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001370 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001371 }
1372
1373 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001374}
1375
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001376// IsVndk() returns true if this module has a vndk variant.
1377// Note that IsVndk() returns true for all variants of vndk-enabled libraries. Not only vendor variant,
1378// but also platform and product variants of vndk-enabled libraries return true for IsVndk().
Ivan Lozano52767be2019-10-18 14:49:46 -07001379func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001380 if vndkdep := c.vndkdep; vndkdep != nil {
1381 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001382 }
1383 return false
1384}
1385
Colin Cross3513fb12024-01-24 14:44:47 -08001386func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001387 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001388 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001389 }
1390 return false
1391}
1392
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001393func (c *Module) isOrderfileCompile() bool {
1394 if orderfile := c.orderfile; orderfile != nil {
1395 return orderfile.Properties.OrderfileLoad
1396 }
1397 return false
1398}
1399
Yi Kongc702ebd2022-08-19 16:02:45 +08001400func (c *Module) isCfi() bool {
1401 if sanitize := c.sanitize; sanitize != nil {
Yi Kongddffe722023-07-18 16:40:36 +09001402 return Bool(sanitize.Properties.SanitizeMutated.Cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001403 }
1404 return false
1405}
1406
Yi Konged79fa32023-06-04 17:15:42 +09001407func (c *Module) isFuzzer() bool {
1408 if sanitize := c.sanitize; sanitize != nil {
1409 return Bool(sanitize.Properties.SanitizeMutated.Fuzzer)
1410 }
1411 return false
1412}
1413
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001414func (c *Module) isNDKStubLibrary() bool {
1415 if _, ok := c.compiler.(*stubDecorator); ok {
1416 return true
1417 }
1418 return false
1419}
1420
Ivan Lozanod7586b62021-04-01 09:49:36 -04001421func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001422 if vndkdep := c.vndkdep; vndkdep != nil {
1423 return vndkdep.isVndkSp()
1424 }
1425 return false
1426}
1427
Ivan Lozanof9e21722020-12-02 09:00:51 -05001428func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001429 if vndkdep := c.vndkdep; vndkdep != nil {
1430 return vndkdep.isVndkExt()
1431 }
1432 return false
1433}
1434
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001435func (c *Module) SubName() string {
1436 return c.Properties.SubName
1437}
1438
Ivan Lozano52767be2019-10-18 14:49:46 -07001439func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001440 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001441}
1442
Logan Chienf3511742017-10-31 18:04:35 +08001443func (c *Module) getVndkExtendsModuleName() string {
1444 if vndkdep := c.vndkdep; vndkdep != nil {
1445 return vndkdep.getVndkExtendsModuleName()
1446 }
1447 return ""
1448}
1449
Jiyong Park25fc6a92018-11-18 18:02:45 +09001450func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001451 if lib := c.library; lib != nil {
1452 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001453 }
1454 return false
1455}
1456
1457func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001458 if lib := c.library; lib != nil {
1459 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001460 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001461 return false
1462}
1463
Alan Stokes73feba32022-11-14 12:21:24 +00001464func (c *Module) IsStubsImplementationRequired() bool {
1465 if lib := c.library; lib != nil {
1466 return lib.isStubsImplementationRequired()
1467 }
1468 return false
1469}
1470
Colin Cross0477b422020-10-13 18:43:54 -07001471// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1472// the implementation. If it is an implementation library it returns its own name.
1473func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1474 name := ctx.OtherModuleName(c)
1475 if versioned, ok := c.linker.(versionedInterface); ok {
1476 name = versioned.implementationModuleName(name)
1477 }
1478 return name
1479}
1480
Martin Stjernholm2856c662020-12-02 15:03:42 +00001481// Similar to ImplementationModuleName, but uses the Make variant of the module
1482// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1483// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1484// under the premise that the prebuilt module overrides its source counterpart
1485// if it is exposed to Make).
1486func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1487 name := c.BaseModuleName()
1488 if versioned, ok := c.linker.(versionedInterface); ok {
1489 name = versioned.implementationModuleName(name)
1490 }
1491 return name
1492}
1493
Jiyong Park7d55b612021-06-11 17:22:09 +09001494func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001495 return Bool(c.Properties.Bootstrap)
1496}
1497
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001498func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001499 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1500 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1501 return false
1502 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001503 return c.linker != nil && c.linker.nativeCoverage()
1504}
1505
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001506func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001507 if p, ok := c.linker.(SnapshotInterface); ok {
1508 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001509 }
1510 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001511}
1512
Jiyong Parkf1194352019-02-25 11:05:47 +09001513func isBionic(name string) bool {
1514 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001515 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001516 return true
1517 }
1518 return false
1519}
1520
Martin Stjernholm279de572019-09-10 23:18:20 +01001521func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001522 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001523 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001524 }
1525 return isBionic(name)
1526}
1527
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001528func (c *Module) XrefCcFiles() android.Paths {
1529 return c.kytheFiles
1530}
1531
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001532func (c *Module) isCfiAssemblySupportEnabled() bool {
1533 return c.sanitize != nil &&
1534 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1535}
1536
Inseob Kim800d1142021-06-14 12:03:51 +09001537func (c *Module) InstallInRoot() bool {
1538 return c.installer != nil && c.installer.installInRoot()
1539}
1540
Colin Crossca860ac2016-01-04 14:34:37 -08001541type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001542 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001543 moduleContextImpl
1544}
1545
Colin Cross37047f12016-12-13 17:06:13 -08001546type depsContext struct {
1547 android.BottomUpMutatorContext
1548 moduleContextImpl
1549}
1550
Colin Crossca860ac2016-01-04 14:34:37 -08001551type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001552 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001553 moduleContextImpl
1554}
1555
1556type moduleContextImpl struct {
1557 mod *Module
1558 ctx BaseModuleContext
1559}
1560
Colin Crossb98c8b02016-07-29 13:44:28 -07001561func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001562 return ctx.mod.toolchain(ctx.ctx)
1563}
1564
1565func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001566 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001567}
1568
1569func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001570 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001571}
1572
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001573func (ctx *moduleContextImpl) testBinary() bool {
1574 return ctx.mod.testBinary()
1575}
1576
Yi Kong56fc1b62022-09-06 16:24:00 +08001577func (ctx *moduleContextImpl) testLibrary() bool {
1578 return ctx.mod.testLibrary()
1579}
1580
Jiyong Park1d1119f2019-07-29 21:27:18 +09001581func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001582 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001583}
1584
Inseob Kim7f283f42020-06-01 21:53:49 +09001585func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001586 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001587}
1588
Inseob Kim1042d292020-06-01 23:23:05 +09001589func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001590 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001591}
1592
Jooyung Hanccce2f22020-03-07 03:45:53 +09001593func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001594 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001595}
1596
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001597func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001598 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001599}
1600
1601func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001602 if ctx.ctx.Device() {
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001603 config := ctx.ctx.Config()
1604 if !config.IsVndkDeprecated() && ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001605 vndkVer := ctx.mod.VndkVersion()
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001606 if inList(vndkVer, config.PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001607 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001608 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001609 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001610 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001611 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001612 }
1613 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001614}
1615
Jiyong Parkb35a8192020-08-10 15:59:36 +09001616func (ctx *moduleContextImpl) minSdkVersion() string {
1617 ver := ctx.mod.MinSdkVersion()
1618 if ver == "apex_inherit" && !ctx.isForPlatform() {
1619 ver = ctx.apexSdkVersion().String()
1620 }
1621 if ver == "apex_inherit" || ver == "" {
1622 ver = ctx.sdkVersion()
1623 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001624
1625 if ctx.ctx.Device() {
1626 config := ctx.ctx.Config()
1627 if config.IsVndkDeprecated() && ctx.inVendor() {
1628 // If building for vendor with final API, then use the latest _stable_ API as "current".
1629 if config.VendorApiLevelFrozen() && (ver == "" || ver == "current") {
1630 ver = config.PlatformSdkVersion().String()
1631 }
1632 }
1633 }
1634
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001635 // For crt objects, the meaning of min_sdk_version is very different from other types of
1636 // module. For them, min_sdk_version defines the oldest version that the build system will
1637 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1638 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1639 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001640 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1641 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1642 // support such an old version. The version is set to the later version in case when the
1643 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1644 // it's for an APEX.
1645 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1646 if ctx.isForPlatform() {
1647 ver = strconv.Itoa(android.FutureApiLevelInt)
1648 } else { // for apex
1649 ver = ctx.apexSdkVersion().String()
1650 if ver == "" { // in case when min_sdk_version was not set by the APEX
1651 ver = ctx.sdkVersion()
1652 }
1653 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001654 }
1655
Jiyong Parkb35a8192020-08-10 15:59:36 +09001656 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1657 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1658 minSdkVersionInt, err2 := strconv.Atoi(ver)
1659 if err == nil && err2 == nil {
1660 if sdkVersionInt < minSdkVersionInt {
1661 return strconv.Itoa(sdkVersionInt)
1662 }
1663 }
1664 return ver
1665}
1666
1667func (ctx *moduleContextImpl) isSdkVariant() bool {
1668 return ctx.mod.IsSdkVariant()
1669}
1670
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001671func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001672 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001673}
Justin Yun8effde42017-06-23 19:24:43 +09001674
Kiyoung Kimaa394802024-01-08 12:55:45 +09001675func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1676 return ctx.mod.InVendorOrProduct()
1677}
1678
Colin Cross95f1ca02020-10-29 20:47:22 -07001679func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1680 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001681}
1682
Colin Cross127bb8b2020-12-16 16:46:01 -08001683func (ctx *moduleContextImpl) IsLlndk() bool {
1684 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001685}
1686
Colin Cross127bb8b2020-12-16 16:46:01 -08001687func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1688 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001689}
1690
Colin Cross127bb8b2020-12-16 16:46:01 -08001691func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1692 return ctx.mod.isImplementationForLLNDKPublic()
1693}
1694
1695func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1696 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001697}
1698
Logan Chienf3511742017-10-31 18:04:35 +08001699func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001700 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001701}
1702
Colin Cross3513fb12024-01-24 14:44:47 -08001703func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1704 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001705}
1706
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001707func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1708 return ctx.mod.isOrderfileCompile()
1709}
1710
Yi Kongc702ebd2022-08-19 16:02:45 +08001711func (ctx *moduleContextImpl) isCfi() bool {
1712 return ctx.mod.isCfi()
1713}
1714
Yi Konged79fa32023-06-04 17:15:42 +09001715func (ctx *moduleContextImpl) isFuzzer() bool {
1716 return ctx.mod.isFuzzer()
1717}
1718
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001719func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1720 return ctx.mod.isNDKStubLibrary()
1721}
1722
Justin Yun8effde42017-06-23 19:24:43 +09001723func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001724 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001725}
1726
Ivan Lozanof9e21722020-12-02 09:00:51 -05001727func (ctx *moduleContextImpl) IsVndkExt() bool {
1728 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001729}
1730
Colin Cross5271fea2021-04-27 13:06:04 -07001731func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1732 return ctx.mod.IsVendorPublicLibrary()
1733}
1734
Vic Yangefd249e2018-11-12 20:19:56 -08001735func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001736 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001737}
1738
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001739func (ctx *moduleContextImpl) selectedStl() string {
1740 if stl := ctx.mod.stl; stl != nil {
1741 return stl.Properties.SelectedStl
1742 }
1743 return ""
1744}
1745
Ivan Lozanobd721262018-11-27 14:33:03 -08001746func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1747 return ctx.mod.linker.useClangLld(actx)
1748}
1749
Colin Crossce75d2c2016-10-06 16:12:58 -07001750func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001751 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001752}
1753
Logan Chienf3511742017-10-31 18:04:35 +08001754func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1755 return ctx.mod.getVndkExtendsModuleName()
1756}
1757
Logan Chiene274fc92019-12-03 11:18:32 -08001758func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Crossff694a82023-12-13 15:54:49 -08001759 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1760 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001761}
1762
Colin Crosse07f2312020-08-13 11:24:56 -07001763func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001764 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1765 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001766}
1767
Dan Albertc8060532020-07-22 22:32:17 -07001768func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001769 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001770}
1771
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001772func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001773 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001774}
1775
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001776func (ctx *moduleContextImpl) nativeCoverage() bool {
1777 return ctx.mod.nativeCoverage()
1778}
1779
Colin Cross56a83212020-09-15 18:30:11 -07001780func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1781 return ctx.mod.DirectlyInAnyApex()
1782}
1783
Colin Cross95b07f22020-12-16 11:06:50 -08001784func (ctx *moduleContextImpl) isPreventInstall() bool {
1785 return ctx.mod.Properties.PreventInstall
1786}
1787
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001788func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1789 shared := &ctx.mod.sharedFlags
1790 if shared.flagsMap == nil {
1791 shared.numSharedFlags = 0
1792 shared.flagsMap = make(map[string]string)
1793 }
1794 return shared
1795}
1796
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001797func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1798 return ctx.mod.isCfiAssemblySupportEnabled()
1799}
1800
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001801func (ctx *moduleContextImpl) notInPlatform() bool {
1802 return ctx.mod.NotInPlatform()
1803}
1804
Colin Cross635c3b02016-05-18 15:37:25 -07001805func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001806 return &Module{
1807 hod: hod,
1808 multilib: multilib,
1809 }
1810}
1811
Colin Cross635c3b02016-05-18 15:37:25 -07001812func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001813 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001814 module.features = []feature{
1815 &tidyFeature{},
1816 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001817 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001818 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001819 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001820 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001821 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001822 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001823 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001824 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001825 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001826 return module
1827}
1828
Colin Crossce75d2c2016-10-06 16:12:58 -07001829func (c *Module) Prebuilt() *android.Prebuilt {
1830 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1831 return p.prebuilt()
1832 }
1833 return nil
1834}
1835
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001836func (c *Module) IsPrebuilt() bool {
1837 return c.Prebuilt() != nil
1838}
1839
Colin Crossce75d2c2016-10-06 16:12:58 -07001840func (c *Module) Name() string {
1841 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001842 if p, ok := c.linker.(interface {
1843 Name(string) string
1844 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001845 name = p.Name(name)
1846 }
1847 return name
1848}
1849
Alex Light3d673592019-01-18 14:37:31 -08001850func (c *Module) Symlinks() []string {
1851 if p, ok := c.installer.(interface {
1852 symlinkList() []string
1853 }); ok {
1854 return p.symlinkList()
1855 }
1856 return nil
1857}
1858
Roland Levillainf89cd092019-07-29 16:22:59 +01001859func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1860 test, ok := c.linker.(testPerSrc)
1861 return ok && test.isAllTestsVariation()
1862}
1863
Chris Parsons216e10a2020-07-09 17:12:52 -04001864func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001865 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001866 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001867 }); ok {
1868 return p.dataPaths()
1869 }
1870 return nil
1871}
1872
Ivan Lozanof1868af2022-04-12 13:08:36 -04001873func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001874 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1875 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001876 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001877 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001878 if c.ProductSpecific() {
1879 // If the module is product specific with 'product_specific: true',
1880 // do not add a name suffix because it is a base module.
1881 return ""
1882 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001883 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001884 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001885 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001886 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001887 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001888 // add version suffix only if the module is using different vndk version than the
1889 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001890 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001891 }
1892 return nameSuffix
1893}
1894
Ivan Lozanof1868af2022-04-12 13:08:36 -04001895func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1896 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001897
1898 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001899 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001900 }
1901
Colin Cross127bb8b2020-12-16 16:46:01 -08001902 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001903 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001904 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1905 // added for product variant only when we have vendor and product variants with core
1906 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001907 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001908 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001909 subName += vendorPublicLibrarySuffix
1910 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001911 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1912 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001913 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001914 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001915 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001916 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001917 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001918 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001919 subName += RecoverySuffix
1920 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1921 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001922 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001923 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001924 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001925 } else if c.IsStubs() && c.IsSdkVariant() {
1926 // Public API surface (NDK)
1927 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1928 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001929 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001930
1931 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001932}
1933
Sam Delmerico75dbca22023-04-20 13:13:25 +00001934func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1935 ctx := &moduleContext{
1936 ModuleContext: actx,
1937 moduleContextImpl: moduleContextImpl{
1938 mod: c,
1939 },
1940 }
1941 ctx.ctx = ctx
1942 return ctx
1943}
1944
Spandan Das20fce2d2023-04-12 17:21:39 +00001945// TODO (b/277651159): Remove this allowlist
1946var (
1947 skipStubLibraryMultipleApexViolation = map[string]bool{
1948 "libclang_rt.asan": true,
1949 "libclang_rt.hwasan": true,
1950 // runtime apex
1951 "libc": true,
1952 "libc_hwasan": true,
1953 "libdl_android": true,
1954 "libm": true,
1955 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00001956 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00001957 // art apex
1958 "libandroidio": true,
1959 "libdexfile": true,
1960 "libnativebridge": true,
1961 "libnativehelper": true,
1962 "libnativeloader": true,
1963 "libsigchain": true,
1964 }
1965)
1966
1967// Returns true if a stub library could be installed in multiple apexes
1968func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
1969 // If this is not an apex variant, no check necessary
1970 if !c.InAnyApex() {
1971 return false
1972 }
1973 // If this is not a stub library, no check necessary
1974 if !c.HasStubsVariants() {
1975 return false
1976 }
1977 // Skip the allowlist
1978 // Use BaseModuleName so that this matches prebuilts.
1979 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
1980 return false
1981 }
1982
1983 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
1984 // Stub libraries should not have more than one apex_available
1985 if len(aaWithoutTestApexes) > 1 {
1986 return true
1987 }
1988 // Stub libraries should not use the wildcard
1989 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
1990 return true
1991 }
1992 // Default: no violation
1993 return false
1994}
1995
LaMont Jonesafe7baf2024-01-09 22:47:39 +00001996func (d *Defaults) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1997 android.CollectDependencyAconfigFiles(ctx, &d.mergedAconfigFiles)
1998}
1999
Chris Parsons8d6e4332021-02-22 16:13:50 -05002000func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002001 ctx := moduleContextFromAndroidModuleContext(actx, c)
2002
Inseob Kim37e0bb02024-04-29 15:54:44 +09002003 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2004 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2005 Logtags: c.logtagsPaths,
2006 })
2007
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002008 // If Test_only is set on a module in bp file, respect the setting, otherwise
2009 // see if is a known test module type.
2010 testOnly := c.testModule || c.testLibrary()
2011 if c.sourceProperties.Test_only != nil {
2012 testOnly = Bool(c.sourceProperties.Test_only)
2013 }
2014 // Keep before any early returns.
2015 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2016 TestOnly: testOnly,
2017 TopLevelTarget: c.testModule,
2018 })
2019
Chris Parsons8d6e4332021-02-22 16:13:50 -05002020 // Handle the case of a test module split by `test_per_src` mutator.
2021 //
2022 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
2023 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
2024 // module and return early, as this module does not produce an output file per se.
2025 if c.IsTestPerSrcAllTestsVariation() {
2026 c.outputFile = android.OptionalPath{}
2027 return
2028 }
2029
Ivan Lozanof1868af2022-04-12 13:08:36 -04002030 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002031 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002032 if !apexInfo.IsForPlatform() {
2033 c.hideApexVariantFromMake = true
2034 }
2035
Chris Parsonseefc9e62021-04-02 17:36:47 -04002036 c.makeLinkType = GetMakeLinkType(actx, c)
2037
Colin Crossf18e1102017-11-16 14:33:08 -08002038 deps := c.depsToPaths(ctx)
2039 if ctx.Failed() {
2040 return
2041 }
2042
Joe Onorato37f900c2023-07-18 16:58:16 -07002043 for _, generator := range c.generators {
2044 gen := generator.GeneratorSources(ctx)
2045 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2046 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2047 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2048 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2049 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2050 if len(deps.Objs.objFiles) == 0 {
2051 // If we are reusuing object files (which happens when we're a shared library and we're
2052 // reusing our static variant's object files), then skip adding the actual source files,
2053 // because we already have the object for it.
2054 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2055 }
2056 }
2057
2058 if ctx.Failed() {
2059 return
2060 }
2061
Spandan Das20fce2d2023-04-12 17:21:39 +00002062 if c.stubLibraryMultipleApexViolation(actx) {
2063 actx.PropertyErrorf("apex_available",
2064 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2065 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002066 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2067 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002068 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2069 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002070 }
2071
Colin Crossca860ac2016-01-04 14:34:37 -08002072 flags := Flags{
2073 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002074 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002075 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002076 for _, generator := range c.generators {
2077 flags = generator.GeneratorFlags(ctx, flags, deps)
2078 }
Colin Crossca860ac2016-01-04 14:34:37 -08002079 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002080 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002081 }
2082 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002083 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002084 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002085 if c.stl != nil {
2086 flags = c.stl.flags(ctx, flags)
2087 }
Colin Cross16b23492016-01-06 14:41:07 -08002088 if c.sanitize != nil {
2089 flags = c.sanitize.flags(ctx, flags)
2090 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002091 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002092 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002093 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002094 if c.fuzzer != nil {
2095 flags = c.fuzzer.flags(ctx, flags)
2096 }
Stephen Craneba090d12017-05-09 15:44:35 -07002097 if c.lto != nil {
2098 flags = c.lto.flags(ctx, flags)
2099 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002100 if c.afdo != nil {
2101 flags = c.afdo.flags(ctx, flags)
2102 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002103 if c.orderfile != nil {
2104 flags = c.orderfile.flags(ctx, flags)
2105 }
Colin Crossca860ac2016-01-04 14:34:37 -08002106 for _, feature := range c.features {
2107 flags = feature.flags(ctx, flags)
2108 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002109 if ctx.Failed() {
2110 return
2111 }
2112
Colin Cross4af21ed2019-11-04 09:37:55 -08002113 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2114 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2115 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002116
Colin Cross4af21ed2019-11-04 09:37:55 -08002117 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002118
2119 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002120 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002121 }
2122 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002123 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002124 }
2125
Colin Cross3e5e7782022-06-17 22:17:05 +00002126 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2127
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002128 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002129 // We need access to all the flags seen by a source file.
2130 if c.sabi != nil {
2131 flags = c.sabi.flags(ctx, flags)
2132 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002133
Colin Cross4af21ed2019-11-04 09:37:55 -08002134 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002135
Joe Onorato37f900c2023-07-18 16:58:16 -07002136 for _, generator := range c.generators {
2137 generator.GeneratorBuildActions(ctx, flags, deps)
2138 }
2139
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002140 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002141 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002142 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002143 if ctx.Failed() {
2144 return
2145 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002146 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07002147 c.objFiles = objs.objFiles
2148 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08002149 }
2150
Colin Crossca860ac2016-01-04 14:34:37 -08002151 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002152 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002153 if ctx.Failed() {
2154 return
2155 }
Colin Cross635c3b02016-05-18 15:37:25 -07002156 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002157
Chris Parsons94a0bba2021-06-04 15:03:47 -04002158 c.maybeUnhideFromMake()
Colin Crossce75d2c2016-10-06 16:12:58 -07002159 }
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002160 if c.testModule {
Colin Cross40213022023-12-13 15:19:49 -08002161 android.SetProvider(ctx, testing.TestModuleProviderKey, testing.TestModuleProviderData{})
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002162 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002163
Colin Cross40213022023-12-13 15:19:49 -08002164 android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
Colin Cross5049f022015-03-18 13:28:46 -07002165
LaMont Jonesaa005ae2023-12-19 19:01:57 +00002166 android.CollectDependencyAconfigFiles(ctx, &c.mergedAconfigFiles)
Yu Liueae7b362023-11-16 17:05:47 -08002167
Chris Parsons94a0bba2021-06-04 15:03:47 -04002168 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002169
2170 if c.linker != nil {
2171 moduleInfoJSON := ctx.ModuleInfoJSON()
2172 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2173 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2174 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2175 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2176 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2177
2178 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2179 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2180 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2181 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2182
2183 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2184 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2185 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2186 moduleInfoJSON.SubName += ".cfi"
2187 }
2188 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2189 moduleInfoJSON.SubName += ".hwasan"
2190 }
2191 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2192 moduleInfoJSON.SubName += ".scs"
2193 }
2194 }
2195 moduleInfoJSON.SubName += c.Properties.SubName
2196
2197 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2198 moduleInfoJSON.Uninstallable = true
2199 }
2200
2201 }
Chris Parsons94a0bba2021-06-04 15:03:47 -04002202}
2203
2204func (c *Module) maybeUnhideFromMake() {
2205 // If a lib is directly included in any of the APEXes or is not available to the
2206 // platform (which is often the case when the stub is provided as a prebuilt),
2207 // unhide the stubs variant having the latest version gets visible to make. In
2208 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2209 // force anything in the make world to link against the stubs library. (unless it
2210 // is explicitly referenced via .bootstrap suffix or the module is marked with
2211 // 'bootstrap: true').
2212 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002213 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002214 c.IsStubs() && !c.InVendorRamdisk() {
2215 c.Properties.HideFromMake = false // unhide
2216 // Note: this is still non-installable
2217 }
2218}
2219
Colin Cross8ff10582023-12-07 13:10:56 -08002220// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2221// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002222func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002223 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002224 // If the module has been specifically configure to not be installed then
2225 // hide from make as otherwise it will break when running inside make
2226 // as the output path to install will not be specified. Not all uninstallable
2227 // modules can be hidden from make as some are needed for resolving make side
2228 // dependencies.
2229 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002230 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002231 c.SkipInstall()
2232 }
2233
2234 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2235 // to allow using the outputs in a genrule.
2236 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002237 c.installer.install(ctx, c.outputFile.Path())
2238 if ctx.Failed() {
2239 return
Colin Crossca860ac2016-01-04 14:34:37 -08002240 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002241 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002242}
2243
Colin Cross0ea8ba82019-06-06 14:33:29 -07002244func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002245 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002246 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002247 }
Colin Crossca860ac2016-01-04 14:34:37 -08002248 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002249}
2250
Colin Crossca860ac2016-01-04 14:34:37 -08002251func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002252 for _, generator := range c.generators {
2253 generator.GeneratorInit(ctx)
2254 }
Colin Crossca860ac2016-01-04 14:34:37 -08002255 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002256 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002257 }
Colin Crossca860ac2016-01-04 14:34:37 -08002258 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002259 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002260 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002261 if c.stl != nil {
2262 c.stl.begin(ctx)
2263 }
Colin Cross16b23492016-01-06 14:41:07 -08002264 if c.sanitize != nil {
2265 c.sanitize.begin(ctx)
2266 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002267 if c.coverage != nil {
2268 c.coverage.begin(ctx)
2269 }
Yi Kong9723e332023-12-04 14:52:53 +09002270 if c.afdo != nil {
2271 c.afdo.begin(ctx)
2272 }
Stephen Craneba090d12017-05-09 15:44:35 -07002273 if c.lto != nil {
2274 c.lto.begin(ctx)
2275 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002276 if c.orderfile != nil {
2277 c.orderfile.begin(ctx)
2278 }
Dan Albert92fe7402020-07-15 13:33:30 -07002279 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002280 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002281 if err != nil {
2282 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002283 c.Properties.Sdk_version = nil
2284 } else {
2285 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002286 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002287 }
Colin Crossca860ac2016-01-04 14:34:37 -08002288}
2289
Colin Cross37047f12016-12-13 17:06:13 -08002290func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002291 deps := Deps{}
2292
Joe Onorato37f900c2023-07-18 16:58:16 -07002293 for _, generator := range c.generators {
2294 deps = generator.GeneratorDeps(ctx, deps)
2295 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002296 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002297 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002298 }
2299 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002300 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002301 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002302 if c.stl != nil {
2303 deps = c.stl.deps(ctx, deps)
2304 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002305 if c.coverage != nil {
2306 deps = c.coverage.deps(ctx, deps)
2307 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002308
Colin Crossb6715442017-10-24 11:13:31 -07002309 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2310 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2311 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2312 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2313 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2314 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002315 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002316 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002317
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002318 for _, lib := range deps.ReexportSharedLibHeaders {
2319 if !inList(lib, deps.SharedLibs) {
2320 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2321 }
2322 }
2323
2324 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002325 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2326 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 -07002327 }
2328 }
2329
Colin Cross5950f382016-12-13 12:50:57 -08002330 for _, lib := range deps.ReexportHeaderLibHeaders {
2331 if !inList(lib, deps.HeaderLibs) {
2332 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2333 }
2334 }
2335
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002336 for _, gen := range deps.ReexportGeneratedHeaders {
2337 if !inList(gen, deps.GeneratedHeaders) {
2338 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2339 }
2340 }
2341
Colin Crossc99deeb2016-04-11 15:06:20 -07002342 return deps
2343}
2344
Dan Albert7e9d2952016-08-04 13:02:36 -07002345func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002346 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002347 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002348 moduleContextImpl: moduleContextImpl{
2349 mod: c,
2350 },
2351 }
2352 ctx.ctx = ctx
2353
Colin Crossca860ac2016-01-04 14:34:37 -08002354 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002355}
2356
Jiyong Park7ed9de32018-10-15 22:25:07 +09002357// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002358func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002359 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2360 version := name[sharp+1:]
2361 libname := name[:sharp]
2362 return libname, version
2363 }
2364 return name, ""
2365}
2366
Dan Albert92fe7402020-07-15 13:33:30 -07002367func GetCrtVariations(ctx android.BottomUpMutatorContext,
2368 m LinkableInterface) []blueprint.Variation {
2369 if ctx.Os() != android.Android {
2370 return nil
2371 }
2372 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002373 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2374 minSdkVersion := m.MinSdkVersion()
2375 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2376 minSdkVersion = m.SdkVersion()
2377 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002378 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2379 if err != nil {
2380 ctx.PropertyErrorf("min_sdk_version", err.Error())
2381 }
Colin Cross363ec762023-01-13 13:45:14 -08002382
2383 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002384 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002385 if apiLevel.LessThan(minApiForArch) {
2386 apiLevel = minApiForArch
2387 }
2388
Dan Albert92fe7402020-07-15 13:33:30 -07002389 return []blueprint.Variation{
2390 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002391 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002392 }
2393 }
2394 return []blueprint.Variation{
2395 {Mutator: "sdk", Variation: ""},
2396 }
2397}
2398
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002399func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2400 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002401
2402 variations = append([]blueprint.Variation(nil), variations...)
2403
Liz Kammer23942242022-04-08 15:41:00 -04002404 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002405 // Version is explicitly specified. i.e. libFoo#30
2406 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002407 if tag, ok := depTag.(libraryDependencyTag); ok {
2408 tag.explicitlyVersioned = true
2409 } else {
2410 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2411 }
Colin Crosse7257d22020-09-24 09:56:18 -07002412 }
Colin Crosse7257d22020-09-24 09:56:18 -07002413
Colin Cross0de8a1e2020-09-18 14:15:30 -07002414 if far {
2415 ctx.AddFarVariationDependencies(variations, depTag, name)
2416 } else {
2417 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002418 }
2419}
2420
Kiyoung Kim487689e2022-07-26 09:48:22 +09002421func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2422 apiImportInfo := multitree.ApiImportInfo{}
2423
2424 if c.Device() {
2425 var apiImportModule []blueprint.Module
2426 if actx.OtherModuleExists("api_imports") {
2427 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2428 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
Colin Cross313aa542023-12-13 13:47:44 -08002429 apiInfo, _ := android.OtherModuleProvider(actx, apiImportModule[0], multitree.ApiImportsProvider)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002430 apiImportInfo = apiInfo
Colin Cross40213022023-12-13 15:19:49 -08002431 android.SetProvider(actx, multitree.ApiImportsProvider, apiInfo)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002432 }
2433 }
2434 }
2435
2436 return apiImportInfo
2437}
2438
Kiyoung Kim487689e2022-07-26 09:48:22 +09002439func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2440 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002441 return snapshot
2442 }
2443
2444 return lib
2445}
2446
Kiyoung Kim37693d02024-04-04 09:56:15 +09002447// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002448// of names:
2449//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002450// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002451//
2452// For each of these, it adds the name of the ndk_library module to the list of
2453// variant libs.
2454//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002455// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002456//
2457// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002458//
2459// The caller can then know to add the variantLibs dependencies differently from the
2460// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002461func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002462 variantLibs = []string{}
2463
2464 nonvariantLibs = []string{}
2465 for _, entry := range list {
2466 // strip #version suffix out
2467 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002468 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002469 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002470 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002471 nonvariantLibs = append(nonvariantLibs, entry)
2472 }
2473 }
2474 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002475
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002476}
2477
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002478func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2479 nonVariantLibs := []string{}
2480 variantLibs := []string{}
2481
2482 for _, lib := range libs {
2483 replaceLibName := GetReplaceModuleName(lib, replaceList)
2484 if replaceLibName == lib {
2485 // Do not handle any libs which are not in API imports
2486 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2487 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2488 variantLibs = append(variantLibs, replaceLibName)
2489 } else {
2490 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2491 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002492 }
2493
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002494 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002495}
2496
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002497func (c *Module) shouldUseApiSurface() bool {
2498 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2499 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2500 // LLNDK Variant
2501 return true
2502 }
2503
2504 if c.Properties.IsSdkVariant {
2505 // NDK Variant
2506 return true
2507 }
2508
2509 if c.isImportedApiLibrary() {
2510 // API Library should depend on API headers
2511 return true
2512 }
2513 }
2514
2515 return false
2516}
2517
Colin Cross1e676be2016-10-12 14:38:15 -07002518func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002519 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002520 return
2521 }
2522
Colin Cross37047f12016-12-13 17:06:13 -08002523 ctx := &depsContext{
2524 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002525 moduleContextImpl: moduleContextImpl{
2526 mod: c,
2527 },
2528 }
2529 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002530
Colin Crossc99deeb2016-04-11 15:06:20 -07002531 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002532 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002533
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002534 apiNdkLibs := []string{}
2535 apiLateNdkLibs := []string{}
2536
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002537 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002538 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2539 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2540 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2541 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2542 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002543 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002544
Yo Chiang219968c2020-09-22 18:45:04 +08002545 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2546
Dan Albert914449f2016-06-17 16:45:24 -07002547 variantNdkLibs := []string{}
2548 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002549 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002550 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2551 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2552 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002553 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002554
Colin Cross32ec36c2016-12-15 07:39:51 -08002555 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002556 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002557 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002558 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002559 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002560
Kiyoung Kim51279d32022-08-24 14:10:46 +09002561 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002562 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002563 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2564 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002565
Spandan Das73bcafc2022-08-18 23:26:00 +00002566 if c.isNDKStubLibrary() {
2567 // ndk_headers do not have any variations
2568 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002569 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002570 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002571 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002572 } else {
2573 actx.AddVariationDependencies(nil, depTag, lib)
2574 }
2575 }
2576
Dan Albertf1d14c72020-07-30 14:32:55 -07002577 if c.isNDKStubLibrary() {
2578 // NDK stubs depend on their implementation because the ABI dumps are
2579 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002580
Spandan Das8b08aea2023-03-14 19:29:34 +00002581 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2582 c.ImageVariation(),
2583 blueprint.Variation{Mutator: "link", Variation: "shared"},
2584 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002585 }
2586
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002587 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2588 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2589 c.Target().NativeBridge == android.NativeBridgeDisabled {
2590 actx.AddVariationDependencies(
2591 []blueprint.Variation{{Mutator: "image", Variation: VendorVariation}},
2592 llndkHeaderLibTag,
2593 deps.LlndkHeaderLibs...)
2594 }
2595
Jiyong Park5d1598f2019-02-25 22:14:17 +09002596 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002597 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002598
Jiyong Park5d1598f2019-02-25 22:14:17 +09002599 actx.AddVariationDependencies([]blueprint.Variation{
2600 {Mutator: "link", Variation: "static"},
2601 }, depTag, lib)
2602 }
2603
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002604 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002605 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002606 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002607 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002608 }
Jiyong Parke3867542020-12-03 17:28:25 +09002609 if inList(lib, deps.ExcludeLibsForApex) {
2610 depTag.excludeInApex = true
2611 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002612
Dan Willemsen59339a22018-07-22 21:18:45 -07002613 actx.AddVariationDependencies([]blueprint.Variation{
2614 {Mutator: "link", Variation: "static"},
2615 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002616 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002617
Jooyung Han75568392020-03-20 04:29:24 +09002618 // staticUnwinderDep is treated as staticDep for Q apexes
2619 // so that native libraries/binaries are linked with static unwinder
2620 // because Q libc doesn't have unwinder APIs
2621 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002622 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002623 actx.AddVariationDependencies([]blueprint.Variation{
2624 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002625 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002626 }
2627
Jiyong Park7ed9de32018-10-15 22:25:07 +09002628 // shared lib names without the #version suffix
2629 var sharedLibNames []string
2630
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002631 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002632 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002633 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002634 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002635 }
Jiyong Parke3867542020-12-03 17:28:25 +09002636 if inList(lib, deps.ExcludeLibsForApex) {
2637 depTag.excludeInApex = true
2638 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002639 if inList(lib, deps.ExcludeLibsForNonApex) {
2640 depTag.excludeInNonApex = true
2641 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002642
Jiyong Park73c54ee2019-10-22 20:31:18 +09002643 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002644 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2645 name = apiLibraryName
2646 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002647 sharedLibNames = append(sharedLibNames, name)
2648
Colin Crosse7257d22020-09-24 09:56:18 -07002649 variations := []blueprint.Variation{
2650 {Mutator: "link", Variation: "shared"},
2651 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002652
2653 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2654 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2655 }
2656
2657 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2658 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2659 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002660 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002661
Colin Crossfe9acfe2021-06-14 16:13:03 -07002662 for _, lib := range deps.LateStaticLibs {
2663 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2664 actx.AddVariationDependencies([]blueprint.Variation{
2665 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002666 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002667 }
2668
Colin Cross3e5e7782022-06-17 22:17:05 +00002669 for _, lib := range deps.UnexportedStaticLibs {
2670 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2671 actx.AddVariationDependencies([]blueprint.Variation{
2672 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002673 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002674 }
2675
Jiyong Park7ed9de32018-10-15 22:25:07 +09002676 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002677 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002678 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2679 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2680 // linking against both the stubs lib and the non-stubs lib at the same time.
2681 continue
2682 }
Colin Cross6e511a92020-07-27 21:26:48 -07002683 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002684 variations := []blueprint.Variation{
2685 {Mutator: "link", Variation: "shared"},
2686 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002687 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002688 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002689
Dan Willemsen59339a22018-07-22 21:18:45 -07002690 actx.AddVariationDependencies([]blueprint.Variation{
2691 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002692 }, dataLibDepTag, deps.DataLibs...)
2693
Colin Crossc8caa062021-09-24 16:50:14 -07002694 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2695
Chris Parsons79d66a52020-06-05 17:26:16 -04002696 actx.AddVariationDependencies([]blueprint.Variation{
2697 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002698 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002699
Colin Cross68861832016-07-08 10:41:41 -07002700 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002701
2702 for _, gen := range deps.GeneratedHeaders {
2703 depTag := genHeaderDepTag
2704 if inList(gen, deps.ReexportGeneratedHeaders) {
2705 depTag = genHeaderExportDepTag
2706 }
2707 actx.AddDependency(c, depTag, gen)
2708 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002709
Dan Albert92fe7402020-07-15 13:33:30 -07002710 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002711 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002712 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002713 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002714 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002715 }
Colin Crossc465efd2021-06-11 18:00:04 -07002716 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002717 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002718 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002719 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002720 if deps.DynamicLinker != "" {
2721 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002722 }
Dan Albert914449f2016-06-17 16:45:24 -07002723
2724 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002725
2726 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002727 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002728 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002729 {Mutator: "link", Variation: "shared"},
2730 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002731 actx.AddVariationDependencies([]blueprint.Variation{
2732 {Mutator: "version", Variation: version},
2733 {Mutator: "link", Variation: "shared"},
2734 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002735
2736 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002737 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002738 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002739 {Mutator: "link", Variation: "shared"},
2740 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002741 actx.AddVariationDependencies([]blueprint.Variation{
2742 {Mutator: "version", Variation: version},
2743 {Mutator: "link", Variation: "shared"},
2744 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002745
2746 if vndkdep := c.vndkdep; vndkdep != nil {
2747 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002748 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002749 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002750 {Mutator: "link", Variation: "shared"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002751 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002752 }
2753 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002754
Vinh Tran367d89d2023-04-28 11:21:25 -04002755 if len(deps.AidlLibs) > 0 {
2756 actx.AddDependency(
2757 c,
2758 aidlLibraryTag,
2759 deps.AidlLibs...,
2760 )
2761 }
2762
Kiyoung Kimee58c932022-10-25 22:59:41 +09002763 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002764}
Colin Cross21b9a242015-03-24 14:15:58 -07002765
Colin Crosse40b4ea2018-10-02 22:25:58 -07002766func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002767 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002768 c.beginMutator(ctx)
2769 }
2770}
2771
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002772// Whether a module can link to another module, taking into
2773// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002774func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002775 tag blueprint.DependencyTag) {
2776
2777 switch t := tag.(type) {
2778 case dependencyTag:
2779 if t != vndkExtDepTag {
2780 return
2781 }
2782 case libraryDependencyTag:
2783 default:
2784 return
2785 }
2786
Ivan Lozanof9e21722020-12-02 09:00:51 -05002787 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002788 // Host code is not restricted
2789 return
2790 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002791
2792 // VNDK is cc.Module supported only for now.
2793 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002794 // Though allowed dependency is limited by the image mutator,
2795 // each vendor and product module needs to check link-type
2796 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002797 if ccTo, ok := to.(*Module); ok {
2798 if ccFrom.vndkdep != nil {
2799 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2800 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002801 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002802 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002803 }
2804 return
2805 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002806 // TODO(b/244244438) : Remove this once all variants are implemented
2807 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2808 return
2809 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002810 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002811 // Platform code can link to anything
2812 return
2813 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002814 if from.InRamdisk() {
2815 // Ramdisk code is not NDK
2816 return
2817 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002818 if from.InVendorRamdisk() {
2819 // Vendor ramdisk code is not NDK
2820 return
2821 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002822 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002823 // Recovery code is not NDK
2824 return
2825 }
Colin Cross31076b32020-10-23 17:22:06 -07002826 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002827 if c.NdkPrebuiltStl() {
2828 // These are allowed, but they don't set sdk_version
2829 return
2830 }
2831 if c.StubDecorator() {
2832 // These aren't real libraries, but are the stub shared libraries that are included in
2833 // the NDK.
2834 return
2835 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002836 if c.isImportedApiLibrary() {
2837 // Imported library from the API surface is a stub library built against interface definition.
2838 return
2839 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002840 }
Logan Chien834b9a62019-01-14 15:39:03 +08002841
Ivan Lozano52767be2019-10-18 14:49:46 -07002842 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002843 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2844 // to link to libc++ (non-NDK and without sdk_version).
2845 return
2846 }
2847
Ivan Lozano52767be2019-10-18 14:49:46 -07002848 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002849 // NDK code linking to platform code is never okay.
2850 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002851 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002852 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002853 }
2854
2855 // At this point we know we have two NDK libraries, but we need to
2856 // check that we're not linking against anything built against a higher
2857 // API level, as it is only valid to link against older or equivalent
2858 // APIs.
2859
Inseob Kim01a28722018-04-11 09:48:45 +09002860 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002861 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002862 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002863 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002864 // Current can't be linked against by anything else.
2865 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002866 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002867 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002868 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002869 if err != nil {
2870 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002871 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002872 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002873 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002874 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002875 if err != nil {
2876 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002877 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002878 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002879 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002880
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002881 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09002882 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002883 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002884 }
2885 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002886 }
Dan Albert202fe492017-12-15 13:56:59 -08002887
2888 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002889 fromStl := from.SelectedStl()
2890 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002891 if fromStl == "" || toStl == "" {
2892 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002893 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002894 // We can be permissive with the system "STL" since it is only the C++
2895 // ABI layer, but in the future we should make sure that everyone is
2896 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002897 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002898 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002899 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2900 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002901 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002902}
2903
Jooyung Han479ca172020-10-19 18:51:07 +09002904func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2905 if c, ok := ctx.Module().(*Module); ok {
2906 ctx.VisitDirectDeps(func(dep android.Module) {
2907 depTag := ctx.OtherModuleDependencyTag(dep)
2908 ccDep, ok := dep.(LinkableInterface)
2909 if ok {
2910 checkLinkType(ctx, c, ccDep, depTag)
2911 }
2912 })
2913 }
2914}
2915
Jiyong Park5fb8c102018-04-09 12:03:06 +09002916// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002917// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2918// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002919// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002920func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2921 check := func(child, parent android.Module) bool {
2922 to, ok := child.(*Module)
2923 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002924 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002925 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002926
Jooyung Hana70f0672019-01-18 15:20:43 +09002927 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2928 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002929 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002930
Jiyong Park0474e1f2021-01-14 14:26:06 +09002931 // These dependencies are not excercised at runtime. Tracking these will give us
2932 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002933 depTag := ctx.OtherModuleDependencyTag(child)
2934 if IsHeaderDepTag(depTag) {
2935 return false
2936 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002937 if depTag == staticVariantTag {
2938 return false
2939 }
2940 if depTag == stubImplDepTag {
2941 return false
2942 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09002943 if depTag == android.RequiredDepTag {
2944 return false
2945 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002946
Justin Yun63e9ec72020-10-29 16:49:43 +09002947 // Even if target lib has no vendor variant, keep checking dependency
2948 // graph in case it depends on vendor_available or product_available
2949 // but not double_loadable transtively.
2950 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002951 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002952 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002953
Jiyong Park0474e1f2021-01-14 14:26:06 +09002954 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2955 // one.
2956 if Bool(to.VendorProperties.Double_loadable) {
2957 return true
2958 }
2959
Ivan Lozanod7586b62021-04-01 09:49:36 -04002960 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002961 return false
2962 }
2963
Jooyung Hana70f0672019-01-18 15:20:43 +09002964 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2965 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002966 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002967 return false
2968 }
2969 if module, ok := ctx.Module().(*Module); ok {
2970 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002971 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002972 ctx.WalkDeps(check)
2973 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002974 }
2975 }
2976}
2977
Yu Liue4312402023-01-18 09:15:31 -08002978func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
2979 // For the dependency from platform to apex, use the latest stubs
2980 apexSdkVersion := android.FutureApiLevel
2981 if !apexInfo.IsForPlatform() {
2982 apexSdkVersion = apexInfo.MinSdkVersion
2983 }
2984
2985 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2986 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2987 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2988 // (b/144430859)
2989 apexSdkVersion = android.FutureApiLevel
2990 }
2991
2992 return apexSdkVersion
2993}
2994
Colin Crossc99deeb2016-04-11 15:06:20 -07002995// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002996func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002997 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002998
Colin Cross0de8a1e2020-09-18 14:15:30 -07002999 var directStaticDeps []StaticLibraryInfo
3000 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003001
Colin Cross0de8a1e2020-09-18 14:15:30 -07003002 reexportExporter := func(exporter FlagExporterInfo) {
3003 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3004 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3005 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3006 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3007 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003008 }
3009
Colin Crossff694a82023-12-13 15:54:49 -08003010 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003011 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003012
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003013 skipModuleList := map[string]bool{}
3014
3015 var apiImportInfo multitree.ApiImportInfo
3016 hasApiImportInfo := false
3017
3018 ctx.VisitDirectDeps(func(dep android.Module) {
3019 if dep.Name() == "api_imports" {
Colin Cross313aa542023-12-13 13:47:44 -08003020 apiImportInfo, _ = android.OtherModuleProvider(ctx, dep, multitree.ApiImportsProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003021 hasApiImportInfo = true
3022 }
3023 })
3024
3025 if hasApiImportInfo {
3026 targetStubModuleList := map[string]string{}
3027 targetOrigModuleList := map[string]string{}
3028
3029 // Search for dependency which both original module and API imported library with APEX stub exists
3030 ctx.VisitDirectDeps(func(dep android.Module) {
3031 depName := ctx.OtherModuleName(dep)
3032 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
3033 targetStubModuleList[apiLibrary] = depName
3034 }
3035 })
3036 ctx.VisitDirectDeps(func(dep android.Module) {
3037 depName := ctx.OtherModuleName(dep)
3038 if origLibrary, ok := targetStubModuleList[depName]; ok {
3039 targetOrigModuleList[origLibrary] = depName
3040 }
3041 })
3042
3043 // Decide which library should be used between original and API imported library
3044 ctx.VisitDirectDeps(func(dep android.Module) {
3045 depName := ctx.OtherModuleName(dep)
3046 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003047 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003048 skipModuleList[depName] = true
3049 } else {
3050 skipModuleList[apiLibrary] = true
3051 }
3052 }
3053 })
3054 }
3055
Colin Crossd11fcda2017-10-23 17:59:01 -07003056 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003057 depName := ctx.OtherModuleName(dep)
3058 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003059
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003060 if _, ok := skipModuleList[depName]; ok {
3061 // skip this module because original module or API imported module matching with this should be used instead.
3062 return
3063 }
3064
Dan Willemsen47450072021-10-19 20:24:49 -07003065 if depTag == android.DarwinUniversalVariantTag {
3066 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3067 return
3068 }
3069
Vinh Tran367d89d2023-04-28 11:21:25 -04003070 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003071 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003072 depPaths.AidlLibraryInfos = append(
3073 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003074 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003075 )
3076 }
3077 }
3078
Ivan Lozano52767be2019-10-18 14:49:46 -07003079 ccDep, ok := dep.(LinkableInterface)
3080 if !ok {
3081
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003082 // handling for a few module types that aren't cc Module but that are also supported
3083 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003084 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003085 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003086 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3087 genRule.GeneratedSourceFiles()...)
3088 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003089 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003090 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003091 // Support exported headers from a generated_sources dependency
3092 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003093 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003094 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003095 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003096 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003097 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003098 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003099 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003100 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003101 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3102 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003103 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003104 // 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 +09003105 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003106
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003107 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003108 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003109 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003110 }
Colin Crosscef792e2021-06-11 18:01:26 -07003111 case CrtBeginDepTag:
3112 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3113 case CrtEndDepTag:
3114 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003115 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003116 return
3117 }
3118
Colin Crossfe17f6f2019-03-28 19:30:56 -07003119 if depTag == android.ProtoPluginDepTag {
3120 return
3121 }
3122
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003123 if depTag == android.RequiredDepTag {
3124 return
3125 }
3126
Colin Crossd11fcda2017-10-23 17:59:01 -07003127 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003128 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3129 return
3130 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003131 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003132 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3133 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003134 return
3135 }
3136
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003137 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003138 // Skip reused objects for stub libraries, they use their own stub object file instead.
3139 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3140 // version mutator, so the stubs variant is created from the shared variant that
3141 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003142 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003143 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003144 objs := staticAnalogue.ReuseObjects
3145 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003146 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003147 reexportExporter(depExporterInfo)
3148 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003149 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003150 }
3151
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003152 if depTag == llndkHeaderLibTag {
3153 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3154 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3155 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3156 }
3157
Colin Cross6e511a92020-07-27 21:26:48 -07003158 linkFile := ccDep.OutputFile()
3159
3160 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3161 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003162 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003163 return
3164 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003165
Jiyong Parke3867542020-12-03 17:28:25 +09003166 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3167 return
3168 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003169 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3170 return
3171 }
Jiyong Parke3867542020-12-03 17:28:25 +09003172
Colin Cross313aa542023-12-13 13:47:44 -08003173 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003174
Colin Cross6e511a92020-07-27 21:26:48 -07003175 var ptr *android.Paths
3176 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003177
Colin Cross6e511a92020-07-27 21:26:48 -07003178 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003179
Colin Cross6e511a92020-07-27 21:26:48 -07003180 switch {
3181 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003182 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003183 if !ctx.Config().AllowMissingDependencies() {
3184 ctx.ModuleErrorf("module %q is not a header library", depName)
3185 } else {
3186 ctx.AddMissingDependencies([]string{depName})
3187 }
3188 return
3189 }
Colin Cross6e511a92020-07-27 21:26:48 -07003190 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003191 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003192 if !ctx.Config().AllowMissingDependencies() {
3193 ctx.ModuleErrorf("module %q is not a shared library", depName)
3194 } else {
3195 ctx.AddMissingDependencies([]string{depName})
3196 }
3197 return
3198 }
Jiyong Parke3867542020-12-03 17:28:25 +09003199
Jiyong Park7d55b612021-06-11 17:22:09 +09003200 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3201 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003202
Jiyong Park1ad8e162020-12-01 23:40:09 +09003203 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3204 // linkFile, depFile, and ptr.
3205 if c.IsStubs() {
3206 break
3207 }
3208
Colin Cross0de8a1e2020-09-18 14:15:30 -07003209 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3210 depFile = sharedLibraryInfo.TableOfContents
3211
Colin Cross6e511a92020-07-27 21:26:48 -07003212 ptr = &depPaths.SharedLibs
3213 switch libDepTag.Order {
3214 case earlyLibraryDependency:
3215 ptr = &depPaths.EarlySharedLibs
3216 depPtr = &depPaths.EarlySharedLibsDeps
3217 case normalLibraryDependency:
3218 ptr = &depPaths.SharedLibs
3219 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003220 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003221 case lateLibraryDependency:
3222 ptr = &depPaths.LateSharedLibs
3223 depPtr = &depPaths.LateSharedLibsDeps
3224 default:
3225 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003226 }
Colin Cross6e511a92020-07-27 21:26:48 -07003227 case libDepTag.static():
Colin Cross313aa542023-12-13 13:47:44 -08003228 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3229 if !isStaticLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003230 if !ctx.Config().AllowMissingDependencies() {
3231 ctx.ModuleErrorf("module %q is not a static library", depName)
3232 } else {
3233 ctx.AddMissingDependencies([]string{depName})
3234 }
3235 return
3236 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003237
3238 // Stubs lib doesn't link to the static lib dependencies. Don't set
3239 // linkFile, depFile, and ptr.
3240 if c.IsStubs() {
3241 break
3242 }
3243
Colin Cross0de8a1e2020-09-18 14:15:30 -07003244 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003245 if libDepTag.wholeStatic {
3246 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003247 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3248 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003249 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003250 // This case normally catches prebuilt static
3251 // libraries, but it can also occur when
3252 // AllowMissingDependencies is on and the
3253 // dependencies has no sources of its own
3254 // but has a whole_static_libs dependency
3255 // on a missing library. We want to depend
3256 // on the .a file so that there is something
3257 // in the dependency tree that contains the
3258 // error rule for the missing transitive
3259 // dependency.
3260 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003261 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003262 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3263 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003264 } else {
3265 switch libDepTag.Order {
3266 case earlyLibraryDependency:
3267 panic(fmt.Errorf("early static libs not suppported"))
3268 case normalLibraryDependency:
3269 // static dependencies will be handled separately so they can be ordered
3270 // using transitive dependencies.
3271 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003272 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003273 case lateLibraryDependency:
3274 ptr = &depPaths.LateStaticLibs
3275 default:
3276 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003277 }
3278 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003279 if libDepTag.unexportedSymbols {
3280 depPaths.LdFlags = append(depPaths.LdFlags,
3281 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3282 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003283 }
3284
Colin Cross6e511a92020-07-27 21:26:48 -07003285 if libDepTag.static() && !libDepTag.wholeStatic {
3286 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3287 ctx.ModuleErrorf("module %q not a static library", depName)
3288 return
3289 }
Logan Chien43d34c32017-12-20 01:17:32 +08003290
Colin Cross6e511a92020-07-27 21:26:48 -07003291 // When combining coverage files for shared libraries and executables, coverage files
3292 // in static libraries act as if they were whole static libraries. The same goes for
3293 // source based Abi dump files.
3294 if c, ok := ccDep.(*Module); ok {
3295 staticLib := c.linker.(libraryInterface)
3296 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3297 staticLib.objs().coverageFiles...)
3298 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3299 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003300 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003301 // Handle non-CC modules here
3302 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003303 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003304 }
3305 }
3306
Colin Cross6e511a92020-07-27 21:26:48 -07003307 if ptr != nil {
3308 if !linkFile.Valid() {
3309 if !ctx.Config().AllowMissingDependencies() {
3310 ctx.ModuleErrorf("module %q missing output file", depName)
3311 } else {
3312 ctx.AddMissingDependencies([]string{depName})
3313 }
3314 return
3315 }
3316 *ptr = append(*ptr, linkFile.Path())
3317 }
3318
3319 if depPtr != nil {
3320 dep := depFile
3321 if !dep.Valid() {
3322 dep = linkFile
3323 }
3324 *depPtr = append(*depPtr, dep.Path())
3325 }
3326
Colin Cross0de8a1e2020-09-18 14:15:30 -07003327 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3328 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3329 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3330 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3331
3332 if libDepTag.reexportFlags {
3333 reexportExporter(depExporterInfo)
3334 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3335 // Re-exported shared library headers must be included as well since they can help us with type information
3336 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003337 c.sabi.Properties.ReexportedIncludes = append(
3338 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003339 c.sabi.Properties.ReexportedSystemIncludes = append(
3340 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003341 }
3342
Spandan Das3faa7922024-02-26 19:42:32 +00003343 makeLibName := MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName()) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003344 switch {
3345 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003346 c.Properties.AndroidMkHeaderLibs = append(
3347 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003348 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003349 if lib := moduleLibraryInterface(dep); lib != nil {
3350 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003351 // Add the dependency to the APEX(es) providing the library so that
3352 // m <module> can trigger building the APEXes as well.
Colin Cross313aa542023-12-13 13:47:44 -08003353 depApexInfo, _ := android.OtherModuleProvider(ctx, dep, android.ApexInfoProvider)
Jiyong Parkab50b072021-05-12 17:13:56 +09003354 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003355 c.Properties.ApexesProvidingSharedLibs = append(
3356 c.Properties.ApexesProvidingSharedLibs, an)
3357 }
3358 }
3359 }
3360
3361 // Note: the order of libs in this list is not important because
3362 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003363 c.Properties.AndroidMkSharedLibs = append(
3364 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003365 case libDepTag.static():
3366 if libDepTag.wholeStatic {
3367 c.Properties.AndroidMkWholeStaticLibs = append(
3368 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3369 } else {
3370 c.Properties.AndroidMkStaticLibs = append(
3371 c.Properties.AndroidMkStaticLibs, makeLibName)
3372 }
3373 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003374 } else if !c.IsStubs() {
3375 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3376
Colin Cross6e511a92020-07-27 21:26:48 -07003377 switch depTag {
3378 case runtimeDepTag:
3379 c.Properties.AndroidMkRuntimeLibs = append(
Spandan Das3faa7922024-02-26 19:42:32 +00003380 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName())+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003381 case objDepTag:
3382 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3383 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003384 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003385 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003386 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003387 case dynamicLinkerDepTag:
3388 depPaths.DynamicLinker = linkFile
3389 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003390 }
Colin Crossca860ac2016-01-04 14:34:37 -08003391 })
3392
Jeff Gaston294356f2017-09-27 17:05:30 -07003393 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003394 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3395 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3396 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003397
Colin Crossdd84e052017-05-17 13:44:16 -07003398 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003399 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003400 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3401 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003402 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003403 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3404 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003405 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003406 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003407 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003408
3409 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003410 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003411 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003412 }
Colin Crossdd84e052017-05-17 13:44:16 -07003413
Colin Crossca860ac2016-01-04 14:34:37 -08003414 return depPaths
3415}
3416
Spandan Das604f3762023-03-16 22:51:40 +00003417func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003418 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003419 thisModule, ok := ctx.Module().(android.ApexModule)
3420 if !ok {
3421 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3422 }
3423
Kiyoung Kimaa394802024-01-08 12:55:45 +09003424 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003425 bootstrap := false
3426 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3427 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3428 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003429 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003430 bootstrap = linkable.Bootstrap()
3431 }
3432
Colin Crossff694a82023-12-13 15:54:49 -08003433 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003434
3435 useStubs := false
3436
Kiyoung Kimaa394802024-01-08 12:55:45 +09003437 if lib := moduleLibraryInterface(dep); lib.buildStubs() && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003438 if !apexInfo.IsForPlatform() {
3439 // For platform libraries, use current version of LLNDK
3440 // If this is for use_vendor apex we will apply the same rules
3441 // of apex sdk enforcement below to choose right version.
3442 useStubs = true
3443 }
3444 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3445 // If not building for APEX or the containing APEX allows the use of
3446 // platform APIs, use stubs only when it is from an APEX (and not from
3447 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3448 // bootstrap modules, always link to non-stub variant
3449 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3450
3451 isApexImportedApiLibrary := false
3452
3453 if cc, ok := dep.(*Module); ok {
3454 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3455 if apiLibrary.hasApexStubs() {
3456 isApexImportedApiLibrary = true
3457 }
3458 }
3459 }
3460
3461 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3462
3463 if useStubs {
3464 // Another exception: if this module is a test for an APEX, then
3465 // it is linked with the non-stub variant of a module in the APEX
3466 // as if this is part of the APEX.
Colin Crossff694a82023-12-13 15:54:49 -08003467 testFor, _ := android.ModuleProvider(ctx, android.ApexTestForInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003468 for _, apexContents := range testFor.ApexContents {
3469 if apexContents.DirectlyInApex(depName) {
3470 useStubs = false
3471 break
3472 }
3473 }
3474 }
3475 if useStubs {
3476 // Yet another exception: If this module and the dependency are
3477 // available to the same APEXes then skip stubs between their
3478 // platform variants. This complements the test_for case above,
3479 // which avoids the stubs on a direct APEX library dependency, by
3480 // avoiding stubs for indirect test dependencies as well.
3481 //
3482 // TODO(b/183882457): This doesn't work if the two libraries have
3483 // only partially overlapping apex_available. For that test_for
3484 // modules would need to be split into APEX variants and resolved
3485 // separately for each APEX they have access to.
3486 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3487 useStubs = false
3488 }
3489 }
3490 } else {
3491 // If building for APEX, use stubs when the parent is in any APEX that
3492 // the child is not in.
3493 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3494 }
3495
3496 return useStubs
3497}
3498
3499// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3500// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3501// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3502// has different level of updatability. For example, if a library foo in an APEX depends on a
3503// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3504// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3505// same APEX as foo, the non-stub variant of bar is used.
3506func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3507 depTag := ctx.OtherModuleDependencyTag(dep)
3508 libDepTag, ok := depTag.(libraryDependencyTag)
3509 if !ok || !libDepTag.shared() {
3510 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3511 }
3512
Colin Cross313aa542023-12-13 13:47:44 -08003513 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3514 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3515 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003516
3517 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003518 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003519 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003520 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3521 toUse := stubs[len(stubs)-1]
3522 sharedLibraryInfo = toUse.SharedLibraryInfo
3523 depExporterInfo = toUse.FlagExporterInfo
3524 }
3525 }
3526 return sharedLibraryInfo, depExporterInfo
3527}
3528
Colin Cross0de8a1e2020-09-18 14:15:30 -07003529// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3530// to match the topological order of the dependency tree, including any static analogues of
3531// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3532// of the transitive dependencies.
Colin Crossc85750b2022-04-21 12:50:51 -07003533func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet[android.Path]) {
3534 transitiveStaticLibsBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003535 var staticPaths android.Paths
3536 for _, staticDep := range staticDeps {
3537 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3538 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3539 }
3540 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003541 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3542 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003543 }
3544 }
3545 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3546
3547 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3548
3549 // reorder the dependencies based on transitive dependencies
3550 staticPaths = android.FirstUniquePaths(staticPaths)
3551 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3552
3553 if len(orderedStaticPaths) != len(staticPaths) {
3554 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3555 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3556 }
3557
3558 return orderedStaticPaths, transitiveStaticLibs
3559}
3560
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003561// BaseLibName trims known prefixes and suffixes
3562func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003563 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3564 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003565 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003566 return libName
3567}
3568
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003569func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003570 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003571 ccDepModule, _ := ccDep.(*Module)
3572 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003573 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003574
Justin Yuncbca3732021-02-03 19:24:13 +09003575 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003576 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003577 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003578 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003579
Ivan Lozanod1dec542021-05-26 15:33:11 -04003580 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003581 }
3582 }
3583
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003584 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3585 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003586 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3587 // core module instead.
3588 return libName
Kiyoung Kimaa394802024-01-08 12:55:45 +09003589 } else if ccDep.InVendorOrProduct() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003590 // The vendor and product modules in Make will have been renamed to not conflict with the
3591 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003592 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003593 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003594 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003595 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003596 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003597 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003598 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003599 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003600 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003601 } else {
3602 return libName
3603 }
3604}
3605
Colin Crossca860ac2016-01-04 14:34:37 -08003606func (c *Module) InstallInData() bool {
3607 if c.installer == nil {
3608 return false
3609 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003610 return c.installer.inData()
3611}
3612
3613func (c *Module) InstallInSanitizerDir() bool {
3614 if c.installer == nil {
3615 return false
3616 }
3617 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003618 return true
3619 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003620 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003621}
3622
Yifan Hong1b3348d2020-01-21 15:53:22 -08003623func (c *Module) InstallInRamdisk() bool {
3624 return c.InRamdisk()
3625}
3626
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003627func (c *Module) InstallInVendorRamdisk() bool {
3628 return c.InVendorRamdisk()
3629}
3630
Jiyong Parkf9332f12018-02-01 00:54:12 +09003631func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003632 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003633}
3634
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003635func (c *Module) MakeUninstallable() {
3636 if c.installer == nil {
3637 c.ModuleBase.MakeUninstallable()
3638 return
3639 }
3640 c.installer.makeUninstallable(c)
3641}
3642
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003643func (c *Module) HostToolPath() android.OptionalPath {
3644 if c.installer == nil {
3645 return android.OptionalPath{}
3646 }
3647 return c.installer.hostToolPath()
3648}
3649
Nan Zhangd4e641b2017-07-12 12:55:28 -07003650func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3651 return c.outputFile
3652}
3653
Colin Cross41955e82019-05-29 14:40:35 -07003654func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3655 switch tag {
3656 case "":
3657 if c.outputFile.Valid() {
3658 return android.Paths{c.outputFile.Path()}, nil
3659 }
3660 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003661 case "unstripped":
3662 if c.linker != nil {
3663 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3664 }
3665 return nil, nil
Wei Li5f5d2712023-12-11 15:40:29 -08003666 case "stripped_all":
3667 if c.linker != nil {
3668 return android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), nil
3669 }
3670 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003671 default:
3672 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003673 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003674}
3675
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003676func (c *Module) static() bool {
3677 if static, ok := c.linker.(interface {
3678 static() bool
3679 }); ok {
3680 return static.static()
3681 }
3682 return false
3683}
3684
Jiyong Park379de2f2018-12-19 02:47:14 +09003685func (c *Module) staticBinary() bool {
3686 if static, ok := c.linker.(interface {
3687 staticBinary() bool
3688 }); ok {
3689 return static.staticBinary()
3690 }
3691 return false
3692}
3693
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003694func (c *Module) testBinary() bool {
3695 if test, ok := c.linker.(interface {
3696 testBinary() bool
3697 }); ok {
3698 return test.testBinary()
3699 }
3700 return false
3701}
3702
Jingwen Chen537242c2022-08-24 11:53:27 +00003703func (c *Module) testLibrary() bool {
3704 if test, ok := c.linker.(interface {
3705 testLibrary() bool
3706 }); ok {
3707 return test.testLibrary()
3708 }
3709 return false
3710}
3711
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003712func (c *Module) benchmarkBinary() bool {
3713 if b, ok := c.linker.(interface {
3714 benchmarkBinary() bool
3715 }); ok {
3716 return b.benchmarkBinary()
3717 }
3718 return false
3719}
3720
3721func (c *Module) fuzzBinary() bool {
3722 if f, ok := c.linker.(interface {
3723 fuzzBinary() bool
3724 }); ok {
3725 return f.fuzzBinary()
3726 }
3727 return false
3728}
3729
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003730// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3731func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003732 if h, ok := c.linker.(interface {
3733 header() bool
3734 }); ok {
3735 return h.header()
3736 }
3737 return false
3738}
3739
Ivan Lozanod7586b62021-04-01 09:49:36 -04003740func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003741 if b, ok := c.linker.(interface {
3742 binary() bool
3743 }); ok {
3744 return b.binary()
3745 }
3746 return false
3747}
3748
Justin Yun5e035862021-06-29 20:50:37 +09003749func (c *Module) StaticExecutable() bool {
3750 if b, ok := c.linker.(*binaryDecorator); ok {
3751 return b.static()
3752 }
3753 return false
3754}
3755
Ivan Lozanod7586b62021-04-01 09:49:36 -04003756func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003757 if o, ok := c.linker.(interface {
3758 object() bool
3759 }); ok {
3760 return o.object()
3761 }
3762 return false
3763}
3764
Kiyoung Kim37693d02024-04-04 09:56:15 +09003765func (m *Module) Dylib() bool {
3766 return false
3767}
3768
3769func (m *Module) Rlib() bool {
3770 return false
3771}
3772
Ivan Lozanof9e21722020-12-02 09:00:51 -05003773func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003774 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003775 if c.IsLlndk() {
3776 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003777 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003778 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003779 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003780 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003781 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003782 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003783 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003784 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003785 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003786 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003787 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003788 return "native:product"
3789 }
Jooyung Han38002912019-05-16 04:01:54 +09003790 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003791 } else if c.InRamdisk() {
3792 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003793 } else if c.InVendorRamdisk() {
3794 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003795 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003796 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003797 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003798 return "native:ndk:none:none"
3799 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3800 //family, link := getNdkStlFamilyAndLinkType(c)
3801 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003802 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003803 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003804 } else {
3805 return "native:platform"
3806 }
3807}
3808
Jiyong Park9d452992018-10-03 00:38:19 +09003809// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003810// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003811func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003812 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003813 // Stub libs and prebuilt libs in a versioned SDK are not
3814 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003815 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003816 } else if _, ok := c.linker.(testPerSrc); ok {
3817 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003818 }
3819 return false
3820}
3821
Jiyong Parka90ca002019-10-07 15:47:24 +09003822func (c *Module) AvailableFor(what string) bool {
3823 if linker, ok := c.linker.(interface {
3824 availableFor(string) bool
3825 }); ok {
3826 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3827 } else {
3828 return c.ApexModuleBase.AvailableFor(what)
3829 }
3830}
3831
Jiyong Park62304bb2020-04-13 16:19:48 +09003832func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003833 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003834}
3835
Paul Duffin0cb37b92020-03-04 14:52:46 +00003836func (c *Module) EverInstallable() bool {
3837 return c.installer != nil &&
3838 // Check to see whether the module is actually ever installable.
3839 c.installer.everInstallable()
3840}
3841
Ivan Lozanod7586b62021-04-01 09:49:36 -04003842func (c *Module) PreventInstall() bool {
3843 return c.Properties.PreventInstall
3844}
3845
3846func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003847 if c.library != nil {
3848 if i := c.library.installable(); i != nil {
3849 return i
3850 }
3851 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003852 return c.Properties.Installable
3853}
3854
3855func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003856 ret := c.EverInstallable() &&
3857 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003858 proptools.BoolDefault(c.Installable(), true) &&
3859 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003860
3861 // The platform variant doesn't need further condition. Apex variants however might not
3862 // be installable because it will likely to be included in the APEX and won't appear
3863 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003864 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003865 return ret
3866 }
3867
3868 // Special case for modules that are configured to be installed to /data, which includes
3869 // test modules. For these modules, both APEX and non-APEX variants are considered as
3870 // installable. This is because even the APEX variants won't be included in the APEX, but
3871 // will anyway be installed to /data/*.
3872 // See b/146995717
3873 if c.InstallInData() {
3874 return ret
3875 }
3876
3877 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003878}
3879
Logan Chien41eabe62019-04-10 13:33:58 +08003880func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3881 if c.linker != nil {
3882 if library, ok := c.linker.(*libraryDecorator); ok {
3883 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3884 }
3885 }
3886}
3887
Jiyong Park45bf82e2020-12-15 22:29:02 +09003888var _ android.ApexModule = (*Module)(nil)
3889
3890// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003891func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003892 depTag := ctx.OtherModuleDependencyTag(dep)
3893 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3894
3895 if cc, ok := dep.(*Module); ok {
3896 if cc.HasStubsVariants() {
3897 if isLibDepTag && libDepTag.shared() {
3898 // dynamic dep to a stubs lib crosses APEX boundary
3899 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003900 }
Colin Cross6e511a92020-07-27 21:26:48 -07003901 if IsRuntimeDepTag(depTag) {
3902 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003903 return false
3904 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003905 }
Zhijun Heec285872021-04-24 10:47:08 -07003906 if cc.IsLlndk() {
3907 return false
3908 }
Colin Crossaac32222020-07-29 12:51:56 -07003909 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003910 // shared_lib dependency from a static lib is considered as crossing
3911 // the APEX boundary because the dependency doesn't actually is
3912 // linked; the dependency is used only during the compilation phase.
3913 return false
3914 }
Jiyong Parke3867542020-12-03 17:28:25 +09003915
3916 if isLibDepTag && libDepTag.excludeInApex {
3917 return false
3918 }
Colin Cross6e511a92020-07-27 21:26:48 -07003919 }
Colin Crossc1b36442021-05-06 13:42:48 -07003920 if depTag == stubImplDepTag {
3921 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003922 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003923 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003924 if depTag == staticVariantTag {
3925 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3926 // actually mean that the static lib (and its dependencies) are copied into the
3927 // APEX.
3928 return false
3929 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003930 return true
3931}
3932
Jiyong Park45bf82e2020-12-15 22:29:02 +09003933// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003934func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3935 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003936 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3937 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3938 return nil
3939 }
Jooyung Han749dc692020-04-15 11:03:39 +09003940 // We don't check for prebuilt modules
3941 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3942 return nil
3943 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003944
Jooyung Han749dc692020-04-15 11:03:39 +09003945 minSdkVersion := c.MinSdkVersion()
3946 if minSdkVersion == "apex_inherit" {
3947 return nil
3948 }
3949 if minSdkVersion == "" {
3950 // JNI libs within APK-in-APEX fall into here
3951 // Those are okay to set sdk_version instead
3952 // We don't have to check if this is a SDK variant because
3953 // non-SDK variant resets sdk_version, which works too.
3954 minSdkVersion = c.SdkVersion()
3955 }
Dan Albertc8060532020-07-22 22:32:17 -07003956 if minSdkVersion == "" {
3957 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3958 }
3959 // Not using nativeApiLevelFromUser because the context here is not
3960 // necessarily a native context.
3961 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003962 if err != nil {
3963 return err
3964 }
Dan Albertc8060532020-07-22 22:32:17 -07003965
Colin Cross8ca61c12022-10-06 21:00:14 -07003966 // A dependency only needs to support a min_sdk_version at least
3967 // as high as the api level that the architecture was introduced in.
3968 // This allows introducing new architectures in the platform that
3969 // need to be included in apexes that normally require an older
3970 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08003971 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07003972 if sdkVersion.LessThan(minApiForArch) {
3973 sdkVersion = minApiForArch
3974 }
3975
Dan Albertc8060532020-07-22 22:32:17 -07003976 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003977 return fmt.Errorf("newer SDK(%v)", ver)
3978 }
3979 return nil
3980}
3981
Paul Duffinb5769c12021-05-12 16:16:51 +01003982// Implements android.ApexModule
3983func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3984 // stub libraries and native bridge libraries are always available to platform
3985 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3986}
3987
Jooyung Han91f92032022-02-04 12:36:33 +09003988// Overrides android.ApexModuleBase.UniqueApexVariations
3989func (c *Module) UniqueApexVariations() bool {
3990 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
3991 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
3992 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09003993 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09003994 return c.UseVndk() && c.IsVndk()
3995}
3996
Inseob Kima1888ce2022-10-04 14:42:02 +09003997func (c *Module) overriddenModules() []string {
3998 if o, ok := c.linker.(overridable); ok {
3999 return o.overriddenModules()
4000 }
4001 return nil
4002}
4003
Liz Kammer35ca77e2021-12-22 15:31:40 -05004004type moduleType int
4005
4006const (
4007 unknownType moduleType = iota
4008 binary
4009 object
4010 fullLibrary
4011 staticLibrary
4012 sharedLibrary
4013 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004014 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004015 ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004016 ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004017)
4018
4019func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004020 if c.testBinary() {
4021 // testBinary is also a binary, so this comes before the c.Binary()
4022 // conditional. A testBinary has additional implicit dependencies and
4023 // other test-only semantics.
4024 return testBin
4025 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004026 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004027 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004028 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004029 } else if c.testLibrary() {
4030 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4031 // will let them add implicit compile deps on gtest, for example.
4032 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004033 // For now, treat them as regular libraries.
4034 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004035 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004036 static := false
4037 shared := false
4038 if library, ok := c.linker.(*libraryDecorator); ok {
4039 static = library.MutatedProperties.BuildStatic
4040 shared = library.MutatedProperties.BuildShared
4041 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4042 static = library.MutatedProperties.BuildStatic
4043 shared = library.MutatedProperties.BuildShared
4044 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004045 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004046 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004047 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004048 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004049 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004050 return staticLibrary
4051 }
4052 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004053 } else if c.isNDKStubLibrary() {
4054 return ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004055 } else if c.IsNdkPrebuiltStl() {
4056 return ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004057 }
4058 return unknownType
4059}
4060
Colin Crosscfad1192015-11-02 16:43:11 -08004061// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004062type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004063 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004064 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004065 android.ApexModuleBase
LaMont Jonesafe7baf2024-01-09 22:47:39 +00004066
4067 // Aconfig files for all transitive deps. Also exposed via TransitiveDeclarationsInfo
4068 mergedAconfigFiles map[string]android.Paths
Colin Crosscfad1192015-11-02 16:43:11 -08004069}
4070
Patrice Arrudac249c712019-03-19 17:00:29 -07004071// cc_defaults provides a set of properties that can be inherited by other cc
4072// modules. A module can use the properties from a cc_defaults using
4073// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4074// merged (when possible) by prepending the default module's values to the
4075// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004076func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004077 return DefaultsFactory()
4078}
4079
Colin Cross36242852017-06-23 15:06:31 -07004080func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004081 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004082
Colin Cross36242852017-06-23 15:06:31 -07004083 module.AddProperties(props...)
4084 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004085 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004086 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004087 &BaseCompilerProperties{},
4088 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004089 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004090 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004091 &StaticProperties{},
4092 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004093 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004094 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004095 &TestLinkerProperties{},
4096 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004097 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004098 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004099 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004100 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004101 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004102 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004103 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004104 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004105 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004106 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004107 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004108 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004109 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004110 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004111 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004112 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4113 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004114 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004115 )
Colin Crosscfad1192015-11-02 16:43:11 -08004116
Jooyung Hancc372c52019-09-25 15:18:44 +09004117 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004118
4119 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004120}
4121
Jiyong Park2286afd2020-06-16 21:58:53 +09004122func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004123 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004124}
4125
Kiyoung Kim51279d32022-08-24 14:10:46 +09004126func (c *Module) isImportedApiLibrary() bool {
4127 _, ok := c.linker.(*apiLibraryDecorator)
4128 return ok
4129}
4130
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004131func kytheExtractAllFactory() android.Singleton {
4132 return &kytheExtractAllSingleton{}
4133}
4134
4135type kytheExtractAllSingleton struct {
4136}
4137
4138func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4139 var xrefTargets android.Paths
4140 ctx.VisitAllModules(func(module android.Module) {
4141 if ccModule, ok := module.(xref); ok {
4142 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4143 }
4144 })
4145 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4146 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004147 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004148 }
4149}
4150
Jihoon Kangf78a8902022-09-01 22:47:07 +00004151func (c *Module) Partition() string {
4152 if p, ok := c.installer.(interface {
4153 getPartition() string
4154 }); ok {
4155 return p.getPartition()
4156 }
4157 return ""
4158}
4159
Spandan Das2b6dfb52024-01-19 00:22:22 +00004160type sourceModuleName interface {
4161 sourceModuleName() string
4162}
4163
4164func (c *Module) BaseModuleName() string {
4165 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4166 // if the prebuilt module sets a source_module_name in Android.bp, use that
4167 return smn.sourceModuleName()
4168 }
4169 return c.ModuleBase.BaseModuleName()
4170}
4171
Colin Cross06a931b2015-10-28 17:23:31 -07004172var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004173var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004174var BoolPtr = proptools.BoolPtr
4175var String = proptools.String
4176var StringPtr = proptools.StringPtr