blob: a64775d5fcfbb3e1b364e8d5e93935a7a74d27ca [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
Ivan Lozano0a468a42024-05-13 21:03:34 -0400103 Rlibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700104
Colin Cross3e5e7782022-06-17 22:17:05 +0000105 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
106 // prevent automatically exporting symbols.
107 UnexportedStaticLibs []string
108
Chris Parsons79d66a52020-06-05 17:26:16 -0400109 // Used for data dependencies adjacent to tests
110 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700111 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400112
Yo Chiang219968c2020-09-22 18:45:04 +0800113 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
114 SystemSharedLibs []string
115
Vinh Tran367d89d2023-04-28 11:21:25 -0400116 // Used by DepMutator to pass aidl_library modules to aidl compiler
117 AidlLibs []string
118
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500119 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800120 StaticUnwinderIfLegacy bool
121
Colin Cross5950f382016-12-13 12:50:57 -0800122 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700123
Colin Cross81413472016-04-11 14:37:39 -0700124 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700125
Dan Willemsenb40aab62016-04-20 14:21:14 -0700126 GeneratedSources []string
127 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900128 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700129
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700130 ReexportGeneratedHeaders []string
131
Colin Crossc465efd2021-06-11 18:00:04 -0700132 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700133
134 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700135 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900136
137 // List of libs that need to be excluded for APEX variant
138 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900139 // List of libs that need to be excluded for non-APEX variant
140 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800141
142 // LLNDK headers for the ABI checker to check LLNDK implementation library.
143 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
144 // The core variant cannot depend on the vendor variant because of the order of CreateVariations.
145 // Instead, the LLNDK implementation depends on the LLNDK header libs.
146 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700147}
148
Ivan Lozano0a468a42024-05-13 21:03:34 -0400149// A struct which to collect flags for rlib dependencies
150type RustRlibDep struct {
151 LibPath android.Path // path to the rlib
152 LinkDirs []string // flags required for dependency (e.g. -L flags)
153 CrateName string // crateNames associated with rlibDeps
154}
155
156func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
157 return a.LibPath == b.LibPath
158}
159
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500160// PathDeps is a struct containing file paths to dependencies of a module.
161// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
162// It's used to construct flags for various build statements (such as for compiling and linking).
163// It is then passed to module decorator functions responsible for registering build statements
164// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800165type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700166 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900167 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700168 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900169 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700170 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700171 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400172 // Paths and crateNames for RustStaticLib dependencies
173 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700174
Colin Cross0de8a1e2020-09-18 14:15:30 -0700175 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossc85750b2022-04-21 12:50:51 -0700176 TranstiveStaticLibrariesForOrdering *android.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700177
Colin Cross26c34ed2016-09-30 17:10:16 -0700178 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100179 Objs Objects
180 // Paths to .o files in dependencies that provide them. Note that these lists
181 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800182 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700183 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700184
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100185 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
186 // the libs from all whole_static_lib dependencies.
187 WholeStaticLibsFromPrebuilts android.Paths
188
Colin Cross26c34ed2016-09-30 17:10:16 -0700189 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700190 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900191 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700192
Inseob Kimd110f872019-12-06 13:15:38 +0900193 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000194 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900195 IncludeDirs android.Paths
196 SystemIncludeDirs android.Paths
197 ReexportedDirs android.Paths
198 ReexportedSystemDirs android.Paths
199 ReexportedFlags []string
200 ReexportedGeneratedHeaders android.Paths
201 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400202 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700203
Colin Cross26c34ed2016-09-30 17:10:16 -0700204 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700205 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700206
Dan Willemsena0790e32018-10-12 00:24:23 -0700207 // Path to the dynamic linker binary
208 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700209
210 // For Darwin builds, the path to the second architecture's output that should
211 // be combined with this architectures's output into a FAT MachO file.
212 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400213
214 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
215 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800216
217 // LLNDK headers for the ABI checker to check LLNDK implementation library.
218 LlndkIncludeDirs android.Paths
219 LlndkSystemIncludeDirs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700220}
221
Colin Cross4af21ed2019-11-04 09:37:55 -0800222// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
223// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
224// command line so they can be overridden by the local module flags).
225type LocalOrGlobalFlags struct {
226 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700227 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800228 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700229 CFlags []string // Flags that apply to C and C++ source files
230 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
231 ConlyFlags []string // Flags that apply to C source files
232 CppFlags []string // Flags that apply to C++ source files
233 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700234 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800235}
236
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500237// Flags contains various types of command line flags (and settings) for use in building build
238// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800239type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500240 // Local flags (which individual modules are responsible for). These may override global flags.
241 Local LocalOrGlobalFlags
242 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700243 Global LocalOrGlobalFlags
244 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800245
246 aidlFlags []string // Flags that apply to aidl source files
247 rsFlags []string // Flags that apply to renderscript source files
248 libFlags []string // Flags to add libraries early to the link order
249 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
250 TidyFlags []string // Flags that apply to clang-tidy
251 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700252
Colin Crossc3199482017-03-30 15:03:04 -0700253 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800254 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700255 SystemIncludeFlags []string
256
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800257 Toolchain config.Toolchain
258 Tidy bool // True if ninja .tidy rules should be generated.
259 NeedTidyFiles bool // True if module link should depend on .tidy files
260 GcovCoverage bool // True if coverage files should be generated.
261 SAbiDump bool // True if header abi dumps should be generated.
262 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800263 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800264
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500265 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800266 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500267 // The target-device system path to the dynamic linker.
268 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800269
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700270 CFlagsDeps android.Paths // Files depended on by compiler flags
271 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800272
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500273 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700274 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800275
Colin Cross19878da2019-03-28 14:45:07 -0700276 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700277 protoC bool // Whether to use C instead of C++
278 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700279
280 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200281 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700282}
283
Colin Crossca860ac2016-01-04 14:34:37 -0800284// Properties used to compile all C or C++ modules
285type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700286 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800287 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700288
Jiyong Parkb35a8192020-08-10 15:59:36 +0900289 // The API level that this module is built against. The APIs of this API level will be
290 // visible at build time, but use of any APIs newer than min_sdk_version will render the
291 // module unloadable on older devices. In the future it will be possible to weakly-link new
292 // APIs, making the behavior match Java: such modules will load on older devices, but
293 // calling new APIs on devices that do not support them will result in a crash.
294 //
295 // This property has the same behavior as sdk_version does for Java modules. For those
296 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
297 // does for Java code.
298 //
299 // In addition, setting this property causes two variants to be built, one for the platform
300 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800301 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700302
Jiyong Parkb35a8192020-08-10 15:59:36 +0900303 // Minimum OS API level supported by this C or C++ module. This property becomes the value
304 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
305 // this property is also used to ensure that the min_sdk_version of the containing module is
306 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
307 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
308 // min_sdk_version of the containing APEX. When the module
309 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900310 Min_sdk_version *string
311
Colin Crossc511bc52020-04-07 16:50:32 +0000312 // If true, always create an sdk variant and don't create a platform variant.
313 Sdk_variant_only *bool
314
Jiyong Parkde866cb2018-12-07 23:08:36 +0900315 AndroidMkSharedLibs []string `blueprint:"mutated"`
316 AndroidMkStaticLibs []string `blueprint:"mutated"`
Ivan Lozano0a468a42024-05-13 21:03:34 -0400317 AndroidMkRlibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900318 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
319 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700320 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900321 HideFromMake bool `blueprint:"mutated"`
322 PreventInstall bool `blueprint:"mutated"`
323 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700324
Yo Chiang219968c2020-09-22 18:45:04 +0800325 // Set by DepsMutator.
326 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
327
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900328 // The name of the image this module is built for
329 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200330
331 // The VNDK version this module is built against. If empty, the module is not
332 // build against the VNDK.
333 VndkVersion string `blueprint:"mutated"`
334
335 // Suffix for the name of Android.mk entries generated by this module
336 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800337
338 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
339 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900340 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900341
Yifan Hong39143a92020-10-26 12:43:12 -0700342 // Make this module available when building for ramdisk.
343 // On device without a dedicated recovery partition, the module is only
344 // available after switching root into
345 // /first_stage_ramdisk. To expose the module before switching root, install
346 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800347 Ramdisk_available *bool
348
Yifan Hong39143a92020-10-26 12:43:12 -0700349 // Make this module available when building for vendor ramdisk.
350 // On device without a dedicated recovery partition, the module is only
351 // available after switching root into
352 // /first_stage_ramdisk. To expose the module before switching root, install
353 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700354 Vendor_ramdisk_available *bool
355
Jiyong Parkf9332f12018-02-01 00:54:12 +0900356 // Make this module available when building for recovery
357 Recovery_available *bool
358
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200359 // Used by imageMutator, set by ImageMutatorBegin()
360 CoreVariantNeeded bool `blueprint:"mutated"`
361 RamdiskVariantNeeded bool `blueprint:"mutated"`
362 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
363 RecoveryVariantNeeded bool `blueprint:"mutated"`
364
365 // A list of variations for the "image" mutator of the form
366 //<image name> '.' <version char>, for example, 'vendor.S'
367 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900368
369 // Allows this module to use non-APEX version of libraries. Useful
370 // for building binaries that are started before APEXes are activated.
371 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900372
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000373 // Allows this module to be included in CMake release snapshots to be built outside of Android
374 // build system and source tree.
375 Cmake_snapshot_supported *bool
376
Jooyung Han097087b2019-10-22 19:32:18 +0900377 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
378 // see soong/cc/config/vndk.go
379 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900380
Colin Cross1bc94122021-10-28 13:25:54 -0700381 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000382
383 // Set by factories of module types that can only be referenced from variants compiled against
384 // the SDK.
385 AlwaysSdk bool `blueprint:"mutated"`
386
387 // Variant is an SDK variant created by sdkMutator
388 IsSdkVariant bool `blueprint:"mutated"`
389 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
390 // variant to have a ".sdk" suffix.
391 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700392
Jiyong Park46a512f2020-12-04 18:02:13 +0900393 // List of APEXes that this module has private access to for testing purpose. The module
394 // can depend on libraries that are not exported by the APEXes and use private symbols
395 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000396 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800397
398 Target struct {
399 Platform struct {
400 // List of modules required by the core variant.
401 Required []string `android:"arch_variant"`
402
403 // List of modules not required by the core variant.
404 Exclude_required []string `android:"arch_variant"`
405 } `android:"arch_variant"`
406
407 Recovery struct {
408 // List of modules required by the recovery variant.
409 Required []string `android:"arch_variant"`
410
411 // List of modules not required by the recovery variant.
412 Exclude_required []string `android:"arch_variant"`
413 } `android:"arch_variant"`
414 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700415}
416
417type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900418 // whether this module should be allowed to be directly depended by other
419 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900420 // If set to true, two variants will be built separately, one like
421 // normal, and the other limited to the set of libraries and headers
422 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700423 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900424 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700425 // so it shouldn't have any unversioned runtime dependencies, or
426 // make assumptions about the system that may not be true in the
427 // future.
428 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900429 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900430 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900431 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900432 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900433 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700434 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
435 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900436
Justin Yunebcf0c52021-01-08 18:00:19 +0900437 // This is the same as the "vendor_available" except that the install path
438 // of the vendor variant is /odm or /vendor/odm.
439 // By replacing "vendor_available: true" with "odm_available: true", the
440 // module will install its vendor variant to the /odm partition or /vendor/odm.
441 // As the modules with "odm_available: true" still create the vendor variants,
442 // they can link to the other vendor modules as the vendor_available modules do.
443 // Also, the vendor modules can link to odm_available modules.
444 //
445 // It may not be used for VNDK modules.
446 Odm_available *bool
447
Justin Yun63e9ec72020-10-29 16:49:43 +0900448 // whether this module should be allowed to be directly depended by other
449 // modules with `product_specific: true` or `product_available: true`.
450 // If set to true, an additional product variant will be built separately
451 // that is limited to the set of libraries and headers that are exposed to
452 // /product modules.
453 //
454 // The product variant may be used with a different (newer) /system,
455 // so it shouldn't have any unversioned runtime dependencies, or
456 // make assumptions about the system that may not be true in the
457 // future.
458 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900459 // If set to false, this module becomes inaccessible from /product modules.
460 //
461 // Different from the 'vendor_available' property, the modules with
462 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
463 // library without 'product_available' may not be depended on by any other
464 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900465 //
466 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
467 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
468 Product_available *bool
469
Jiyong Park5fb8c102018-04-09 12:03:06 +0900470 // whether this module is capable of being loaded with other instance
471 // (possibly an older version) of the same module in the same process.
472 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
473 // can be double loaded in a vendor process if the library is also a
474 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
475 // explicitly marked as `double_loadable: true` by the owner, or the dependency
476 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
477 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800478
479 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
480 IsLLNDK bool `blueprint:"mutated"`
481
Colin Cross78212242021-01-06 14:51:30 -0800482 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
483 // set and the module is not listed in VndkMustUseVendorVariantList.
484 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
485
486 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
487 IsVNDKCore bool `blueprint:"mutated"`
488
489 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
490 IsVNDKSP bool `blueprint:"mutated"`
491
492 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
493 // module sets the llndk.private property.
494 IsVNDKPrivate bool `blueprint:"mutated"`
495
496 // IsVNDKProduct is set if a VNDK module sets the product_available property.
497 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700498
499 // IsVendorPublicLibrary is set for the core and product variants of a library that has
500 // vendor_public_library stubs.
501 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800502}
503
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500504// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
505// to understanding details about the type of the current module.
506// For example, one might call these functions to determine whether the current module is a static
507// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800508type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800509 static() bool
510 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700511 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800512 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900513 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900514 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900515 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700516 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900517 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700518 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800519 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900520 minSdkVersion() string
521 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700522 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700523 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800524 IsLlndk() bool
525 IsLlndkPublic() bool
526 isImplementationForLLNDKPublic() bool
527 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900528 isVndk() bool
529 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500530 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700531 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900532 inProduct() bool
533 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800534 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700535 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900536 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900537 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700538 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700539 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800540 getVndkExtendsModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800541 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000542 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800543 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900544 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800545 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800546 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800547 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700548 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700549 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900550 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800551 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700552 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700553 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800554 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800555 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800556 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800557 notInPlatform() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800558}
559
560type SharedFlags struct {
561 numSharedFlags int
562 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800563}
564
565type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700566 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800567 ModuleContextIntf
568}
569
570type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700571 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800572 ModuleContextIntf
573}
574
Colin Cross37047f12016-12-13 17:06:13 -0800575type DepsContext interface {
576 android.BottomUpMutatorContext
577 ModuleContextIntf
578}
579
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500580// feature represents additional (optional) steps to building cc-related modules, such as invocation
581// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800582type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800583 flags(ctx ModuleContext, flags Flags) Flags
584 props() []interface{}
585}
586
Joe Onorato37f900c2023-07-18 16:58:16 -0700587// Information returned from Generator about the source code it's generating
588type GeneratedSource struct {
589 IncludeDirs android.Paths
590 Sources android.Paths
591 Headers android.Paths
592 ReexportedDirs android.Paths
593}
594
595// generator allows injection of generated code
596type Generator interface {
597 GeneratorProps() []interface{}
598 GeneratorInit(ctx BaseModuleContext)
599 GeneratorDeps(ctx DepsContext, deps Deps) Deps
600 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
601 GeneratorSources(ctx ModuleContext) GeneratedSource
602 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
603}
604
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500605// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500606// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800607type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700608 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800609 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800610 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700611 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000612 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700613
Colin Cross76fada02016-07-27 10:31:13 -0700614 appendCflags([]string)
615 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700616 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800617}
618
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500619// linker is the interface for a linker decorator object. Individual module types can provide
620// their own implementation for this decorator, and thus specify custom logic regarding build
621// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800622type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700623 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800624 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700625 linkerFlags(ctx ModuleContext, flags Flags) Flags
626 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000627 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800628 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700629
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700630 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700631 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900632 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800633 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700634
635 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900636 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000637
638 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000639 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800640
641 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000642}
643
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500644// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000645type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500646 sharedLibs []string
647 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
648 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700649 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800650}
651
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500652// installer is the interface for an installer helper object. This helper is responsible for
653// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800654type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700655 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700656 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000657 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800658 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700659 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700660 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900661 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000662 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900663 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800664}
665
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800666type xref interface {
667 XrefCcFiles() android.Paths
668}
669
Inseob Kima1888ce2022-10-04 14:42:02 +0900670type overridable interface {
671 overriddenModules() []string
672}
673
Colin Cross6e511a92020-07-27 21:26:48 -0700674type libraryDependencyKind int
675
676const (
677 headerLibraryDependency = iota
678 sharedLibraryDependency
679 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400680 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700681)
682
683func (k libraryDependencyKind) String() string {
684 switch k {
685 case headerLibraryDependency:
686 return "headerLibraryDependency"
687 case sharedLibraryDependency:
688 return "sharedLibraryDependency"
689 case staticLibraryDependency:
690 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400691 case rlibLibraryDependency:
692 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700693 default:
694 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
695 }
696}
697
698type libraryDependencyOrder int
699
700const (
701 earlyLibraryDependency = -1
702 normalLibraryDependency = 0
703 lateLibraryDependency = 1
704)
705
706func (o libraryDependencyOrder) String() string {
707 switch o {
708 case earlyLibraryDependency:
709 return "earlyLibraryDependency"
710 case normalLibraryDependency:
711 return "normalLibraryDependency"
712 case lateLibraryDependency:
713 return "lateLibraryDependency"
714 default:
715 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
716 }
717}
718
719// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
720// tags that have a set of predefined tag objects that are reused for each dependency, a
721// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
722// That means that comparing a libraryDependencyTag for equality will only be equal if all
723// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
724// then check individual metadata fields instead.
725type libraryDependencyTag struct {
726 blueprint.BaseDependencyTag
727
728 // These are exported so that fmt.Printf("%#v") can call their String methods.
729 Kind libraryDependencyKind
730 Order libraryDependencyOrder
731
732 wholeStatic bool
733
734 reexportFlags bool
735 explicitlyVersioned bool
736 dataLib bool
737 ndk bool
738
739 staticUnwinder bool
740
741 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900742
Cindy Zhou18417cb2020-12-10 07:12:38 -0800743 // Whether or not this dependency should skip the apex dependency check
744 skipApexAllowedDependenciesCheck bool
745
Jiyong Parke3867542020-12-03 17:28:25 +0900746 // Whether or not this dependency has to be followed for the apex variants
747 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900748 // Whether or not this dependency has to be followed for the non-apex variants
749 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000750
751 // If true, don't automatically export symbols from the static library into a shared library.
752 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700753}
754
755// header returns true if the libraryDependencyTag is tagging a header lib dependency.
756func (d libraryDependencyTag) header() bool {
757 return d.Kind == headerLibraryDependency
758}
759
760// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
761func (d libraryDependencyTag) shared() bool {
762 return d.Kind == sharedLibraryDependency
763}
764
765// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
766func (d libraryDependencyTag) static() bool {
767 return d.Kind == staticLibraryDependency
768}
769
Ivan Lozano0a468a42024-05-13 21:03:34 -0400770// rlib returns true if the libraryDependencyTag is tagging an rlib dependency.
771func (d libraryDependencyTag) rlib() bool {
772 return d.Kind == rlibLibraryDependency
773}
774
Colin Cross65cb3142021-12-10 23:05:02 +0000775func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
776 if d.shared() {
777 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
778 }
779 return nil
780}
781
782var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
783
Colin Crosse9fe2942020-11-10 18:12:15 -0800784// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
785// binaries or other shared libraries are installed as dependencies.
786func (d libraryDependencyTag) InstallDepNeeded() bool {
787 return d.shared()
788}
789
790var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
791
Yu Liu67a28422024-03-05 00:36:31 +0000792func (d libraryDependencyTag) PropagateAconfigValidation() bool {
793 return d.static()
794}
795
796var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
797
Colin Crosse9fe2942020-11-10 18:12:15 -0800798// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700799// libraryDependencyTag. Each tag object is created globally and reused for multiple
800// dependencies (although since the object contains no references, assigning a tag to a
801// variable and modifying it will not modify the original). Users can compare the tag
802// returned by ctx.OtherModuleDependencyTag against the global original
803type dependencyTag struct {
804 blueprint.BaseDependencyTag
805 name string
806}
807
Colin Crosse9fe2942020-11-10 18:12:15 -0800808// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
809// libraryDependencyTag, but where the dependency needs to be installed when the parent is
810// installed.
811type installDependencyTag struct {
812 blueprint.BaseDependencyTag
813 android.InstallAlwaysNeededDependencyTag
814 name string
815}
816
Colin Crossc99deeb2016-04-11 15:06:20 -0700817var (
Colin Cross6e511a92020-07-27 21:26:48 -0700818 genSourceDepTag = dependencyTag{name: "gen source"}
819 genHeaderDepTag = dependencyTag{name: "gen header"}
820 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
821 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900822 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700823 reuseObjTag = dependencyTag{name: "reuse objects"}
824 staticVariantTag = dependencyTag{name: "static variant"}
825 vndkExtDepTag = dependencyTag{name: "vndk extends"}
826 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700827 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800828 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700829 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700830 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000831 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500832 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400833 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800834 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700835)
836
Roland Levillainf89cd092019-07-29 16:22:59 +0100837func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700838 ccLibDepTag, ok := depTag.(libraryDependencyTag)
839 return ok && ccLibDepTag.shared()
840}
841
842func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
843 ccLibDepTag, ok := depTag.(libraryDependencyTag)
844 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100845}
846
Zach Johnson3df4e632020-11-06 11:56:27 -0800847func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
848 ccLibDepTag, ok := depTag.(libraryDependencyTag)
849 return ok && ccLibDepTag.header()
850}
851
Roland Levillainf89cd092019-07-29 16:22:59 +0100852func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800853 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100854}
855
856func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700857 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100858 return ok && ccDepTag == testPerSrcDepTag
859}
860
Colin Crossca860ac2016-01-04 14:34:37 -0800861// Module contains the properties and members used by all C/C++ module types, and implements
862// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500863// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
864// interface.
865//
866// To define a C/C++ related module, construct a new Module object and point its delegates to
867// type-specific structs. These delegates will be invoked to register module-specific build
868// statements which may be unique to the module type. For example, module.compiler.compile() should
869// be defined so as to register build statements which are responsible for compiling the module.
870//
871// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
872// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
873// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
874// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800875type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700876 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700877
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700878 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700879 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700880 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700881
Colin Crossca860ac2016-01-04 14:34:37 -0800882 // initialize before calling Init
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000883 hod android.HostOrDeviceSupported
884 multilib android.Multilib
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000885 testModule bool
Colin Crossc472d572015-03-17 15:06:21 -0700886
Paul Duffina0843f62019-12-13 19:50:38 +0000887 // Allowable SdkMemberTypes of this module type.
888 sdkMemberTypes []android.SdkMemberType
889
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500890 // decorator delegates, initialize before calling Init
891 // these may contain module-specific implementations, and effectively allow for custom
892 // type-specific logic. These members may reference different objects or the same object.
893 // Functions of these decorators will be invoked to initialize and register type-specific
894 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800895 generators []Generator
896 compiler compiler
897 linker linker
898 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500899
Spandan Dase12d2522023-09-12 21:42:31 +0000900 features []feature
901 stl *stl
902 sanitize *sanitize
903 coverage *coverage
904 fuzzer *fuzzer
905 sabi *sabi
906 vndkdep *vndkdep
907 lto *lto
908 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000909 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800910
Colin Cross31076b32020-10-23 17:22:06 -0700911 library libraryInterface
912
Colin Cross635c3b02016-05-18 15:37:25 -0700913 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800914
Colin Crossb98c8b02016-07-29 13:44:28 -0700915 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700916
917 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800918
919 // Flags used to compile this module
920 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700921
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800922 // Shared flags among build rules of this module
923 sharedFlags SharedFlags
924
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800925 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700926 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900927
928 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800929 // Kythe (source file indexer) paths for this compilation module
930 kytheFiles android.Paths
Chih-Hung Hsieh80783772021-10-11 16:46:56 -0700931 // Object .o file output paths for this compilation module
932 objFiles android.Paths
933 // Tidy .tidy file output paths for this compilation module
934 tidyFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900935
936 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700937 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700938
939 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -0800940
Inseob Kim37e0bb02024-04-29 15:54:44 +0900941 logtagsPaths android.Paths
Colin Crossc472d572015-03-17 15:06:21 -0700942}
943
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200944func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400945 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
946 if b, ok := c.compiler.(*baseCompiler); ok {
947 hasAidl = b.hasSrcExt(".aidl")
948 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
949 hasProto = b.hasSrcExt(".proto")
950 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
951 hasSysprop = b.hasSrcExt(".sysprop")
952 hasWinMsg = b.hasSrcExt(".mc")
953 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
954 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200955 c.AndroidModuleBase().AddJSONData(d)
956 (*d)["Cc"] = map[string]interface{}{
957 "SdkVersion": c.SdkVersion(),
958 "MinSdkVersion": c.MinSdkVersion(),
959 "VndkVersion": c.VndkVersion(),
960 "ProductSpecific": c.ProductSpecific(),
961 "SocSpecific": c.SocSpecific(),
962 "DeviceSpecific": c.DeviceSpecific(),
963 "InProduct": c.InProduct(),
964 "InVendor": c.InVendor(),
965 "InRamdisk": c.InRamdisk(),
966 "InVendorRamdisk": c.InVendorRamdisk(),
967 "InRecovery": c.InRecovery(),
968 "VendorAvailable": c.VendorAvailable(),
969 "ProductAvailable": c.ProductAvailable(),
970 "RamdiskAvailable": c.RamdiskAvailable(),
971 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
972 "RecoveryAvailable": c.RecoveryAvailable(),
973 "OdmAvailable": c.OdmAvailable(),
974 "InstallInData": c.InstallInData(),
975 "InstallInRamdisk": c.InstallInRamdisk(),
976 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
977 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
978 "InstallInRecovery": c.InstallInRecovery(),
979 "InstallInRoot": c.InstallInRoot(),
980 "IsVndk": c.IsVndk(),
981 "IsVndkExt": c.IsVndkExt(),
982 "IsVndkPrivate": c.IsVndkPrivate(),
983 "IsVndkSp": c.IsVndkSp(),
984 "IsLlndk": c.IsLlndk(),
985 "IsLlndkPublic": c.IsLlndkPublic(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200986 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
987 "ApexSdkVersion": c.apexSdkVersion,
988 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400989 "AidlSrcs": hasAidl,
990 "LexSrcs": hasLex,
991 "ProtoSrcs": hasProto,
992 "RenderscriptSrcs": hasRenderscript,
993 "SyspropSrcs": hasSysprop,
994 "WinMsgSrcs": hasWinMsg,
995 "YaccSrsc": hasYacc,
996 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200997 }
998}
999
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001000func (c *Module) SetPreventInstall() {
1001 c.Properties.PreventInstall = true
1002}
1003
1004func (c *Module) SetHideFromMake() {
1005 c.Properties.HideFromMake = true
1006}
1007
Ivan Lozanod7586b62021-04-01 09:49:36 -04001008func (c *Module) HiddenFromMake() bool {
1009 return c.Properties.HideFromMake
1010}
1011
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001012func (c *Module) RequiredModuleNames() []string {
1013 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
1014 if c.ImageVariation().Variation == android.CoreVariation {
1015 required = append(required, c.Properties.Target.Platform.Required...)
1016 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1017 } else if c.InRecovery() {
1018 required = append(required, c.Properties.Target.Recovery.Required...)
1019 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1020 }
1021 return android.FirstUniqueStrings(required)
1022}
1023
Ivan Lozano52767be2019-10-18 14:49:46 -07001024func (c *Module) Toc() android.OptionalPath {
1025 if c.linker != nil {
1026 if library, ok := c.linker.(libraryInterface); ok {
1027 return library.toc()
1028 }
1029 }
1030 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1031}
1032
1033func (c *Module) ApiLevel() string {
1034 if c.linker != nil {
1035 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001036 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001037 }
1038 }
1039 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1040}
1041
1042func (c *Module) Static() bool {
1043 if c.linker != nil {
1044 if library, ok := c.linker.(libraryInterface); ok {
1045 return library.static()
1046 }
1047 }
1048 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1049}
1050
1051func (c *Module) Shared() bool {
1052 if c.linker != nil {
1053 if library, ok := c.linker.(libraryInterface); ok {
1054 return library.shared()
1055 }
1056 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001057
Ivan Lozano52767be2019-10-18 14:49:46 -07001058 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1059}
1060
1061func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001062 if c.stl != nil {
1063 return c.stl.Properties.SelectedStl
1064 }
1065 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001066}
1067
Ivan Lozano52767be2019-10-18 14:49:46 -07001068func (c *Module) NdkPrebuiltStl() bool {
1069 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1070 return true
1071 }
1072 return false
1073}
1074
1075func (c *Module) StubDecorator() bool {
1076 if _, ok := c.linker.(*stubDecorator); ok {
1077 return true
1078 }
1079 return false
1080}
1081
1082func (c *Module) SdkVersion() string {
1083 return String(c.Properties.Sdk_version)
1084}
1085
Artur Satayev480e25b2020-04-27 18:53:18 +01001086func (c *Module) MinSdkVersion() string {
1087 return String(c.Properties.Min_sdk_version)
1088}
1089
Jiyong Park5df7bd32021-08-25 16:18:46 +09001090func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001091 if linker, ok := c.linker.(*objectLinker); ok {
1092 return linker.isCrt()
1093 }
1094 return false
1095}
1096
Jiyong Park5df7bd32021-08-25 16:18:46 +09001097func (c *Module) SplitPerApiLevel() bool {
1098 return c.canUseSdk() && c.isCrt()
1099}
1100
Colin Crossc511bc52020-04-07 16:50:32 +00001101func (c *Module) AlwaysSdk() bool {
1102 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1103}
1104
Ivan Lozano183a3212019-10-18 14:18:45 -07001105func (c *Module) CcLibrary() bool {
1106 if c.linker != nil {
1107 if _, ok := c.linker.(*libraryDecorator); ok {
1108 return true
1109 }
Colin Crossd48fe732020-09-23 20:37:24 -07001110 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1111 return true
1112 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001113 }
1114 return false
1115}
1116
1117func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001118 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001119 return true
1120 }
1121 return false
1122}
1123
Spandan Dase12d2522023-09-12 21:42:31 +00001124func (c *Module) IsNdkPrebuiltStl() bool {
1125 if c.linker == nil {
1126 return false
1127 }
1128 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1129 return true
1130 }
1131 return false
1132}
1133
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001134func (c *Module) RlibStd() bool {
1135 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1136}
1137
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001138func (c *Module) RustLibraryInterface() bool {
1139 return false
1140}
1141
Ivan Lozano0a468a42024-05-13 21:03:34 -04001142func (c *Module) CrateName() string {
1143 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1144}
1145
1146func (c *Module) ExportedCrateLinkDirs() []string {
1147 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1148}
1149
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001150func (c *Module) IsFuzzModule() bool {
1151 if _, ok := c.compiler.(*fuzzBinary); ok {
1152 return true
1153 }
1154 return false
1155}
1156
1157func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1158 return c.FuzzModule
1159}
1160
1161func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1162 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1163 return fuzzer.fuzzPackagedModule
1164 }
1165 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1166}
1167
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001168func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001169 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1170 return fuzzer.sharedLibraries
1171 }
1172 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1173}
1174
Ivan Lozano2b262972019-11-21 12:30:50 -08001175func (c *Module) NonCcVariants() bool {
1176 return false
1177}
1178
Ivan Lozano183a3212019-10-18 14:18:45 -07001179func (c *Module) SetStatic() {
1180 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001181 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001182 library.setStatic()
1183 return
1184 }
1185 }
1186 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1187}
1188
1189func (c *Module) SetShared() {
1190 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001191 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001192 library.setShared()
1193 return
1194 }
1195 }
1196 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1197}
1198
1199func (c *Module) BuildStaticVariant() bool {
1200 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001201 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001202 return library.buildStatic()
1203 }
1204 }
1205 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1206}
1207
1208func (c *Module) BuildSharedVariant() bool {
1209 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001210 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001211 return library.buildShared()
1212 }
1213 }
1214 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1215}
1216
1217func (c *Module) Module() android.Module {
1218 return c
1219}
1220
Jiyong Parkc20eee32018-09-05 22:36:17 +09001221func (c *Module) OutputFile() android.OptionalPath {
1222 return c.outputFile
1223}
1224
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001225func (c *Module) CoverageFiles() android.Paths {
1226 if c.linker != nil {
1227 if library, ok := c.linker.(libraryInterface); ok {
1228 return library.objs().coverageFiles
1229 }
1230 }
1231 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1232}
1233
Ivan Lozano183a3212019-10-18 14:18:45 -07001234var _ LinkableInterface = (*Module)(nil)
1235
Jiyong Park719b4462019-01-13 00:39:51 +09001236func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001237 if c.linker != nil {
1238 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001239 }
1240 return nil
1241}
1242
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001243func (c *Module) CoverageOutputFile() android.OptionalPath {
1244 if c.linker != nil {
1245 return c.linker.coverageOutputFilePath()
1246 }
1247 return android.OptionalPath{}
1248}
1249
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001250func (c *Module) RelativeInstallPath() string {
1251 if c.installer != nil {
1252 return c.installer.relativeInstallPath()
1253 }
1254 return ""
1255}
1256
Jooyung Han344d5432019-08-23 11:17:39 +09001257func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001258 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001259}
1260
Colin Cross36242852017-06-23 15:06:31 -07001261func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001262 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001263 for _, generator := range c.generators {
1264 c.AddProperties(generator.GeneratorProps()...)
1265 }
Colin Crossca860ac2016-01-04 14:34:37 -08001266 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001267 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001268 }
1269 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001270 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001271 }
1272 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001273 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001274 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001275 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001276 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001277 }
Colin Cross16b23492016-01-06 14:41:07 -08001278 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001279 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001280 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001281 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001282 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001283 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001284 if c.fuzzer != nil {
1285 c.AddProperties(c.fuzzer.props()...)
1286 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001287 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001288 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001289 }
Justin Yun8effde42017-06-23 19:24:43 +09001290 if c.vndkdep != nil {
1291 c.AddProperties(c.vndkdep.props()...)
1292 }
Stephen Craneba090d12017-05-09 15:44:35 -07001293 if c.lto != nil {
1294 c.AddProperties(c.lto.props()...)
1295 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001296 if c.afdo != nil {
1297 c.AddProperties(c.afdo.props()...)
1298 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001299 if c.orderfile != nil {
1300 c.AddProperties(c.orderfile.props()...)
1301 }
Colin Crossca860ac2016-01-04 14:34:37 -08001302 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001303 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001304 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001305 // Allow test-only on libraries that are not cc_test_library
1306 if c.library != nil && !c.testLibrary() {
1307 c.AddProperties(&c.sourceProperties)
1308 }
Colin Crossc472d572015-03-17 15:06:21 -07001309
Colin Cross36242852017-06-23 15:06:31 -07001310 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001311 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001312 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001313
Colin Cross36242852017-06-23 15:06:31 -07001314 return c
Colin Crossc472d572015-03-17 15:06:21 -07001315}
1316
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001317// UseVndk() returns true if this module is built against VNDK.
1318// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001319func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001320 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001321}
1322
Colin Crossc511bc52020-04-07 16:50:32 +00001323func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001324 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001325 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001326}
1327
1328func (c *Module) UseSdk() bool {
1329 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001330 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001331 }
1332 return false
1333}
1334
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001335func (c *Module) isCoverageVariant() bool {
1336 return c.coverage.Properties.IsCoverageVariant
1337}
1338
Colin Cross95f1ca02020-10-29 20:47:22 -07001339func (c *Module) IsNdk(config android.Config) bool {
1340 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001341}
1342
Colin Cross127bb8b2020-12-16 16:46:01 -08001343func (c *Module) IsLlndk() bool {
1344 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001345}
1346
Colin Cross127bb8b2020-12-16 16:46:01 -08001347func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001348 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001349}
1350
Colin Cross1f3f1302021-04-26 18:37:44 -07001351func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001352 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001353 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001354}
1355
Colin Cross5271fea2021-04-27 13:06:04 -07001356func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1357 lib := moduleLibraryInterface(m)
1358 return lib != nil && (lib.hasVendorPublicLibrary())
1359}
1360
1361// IsVendorPublicLibrary returns true for vendor public libraries.
1362func (c *Module) IsVendorPublicLibrary() bool {
1363 return c.VendorProperties.IsVendorPublicLibrary
1364}
1365
Ivan Lozanof1868af2022-04-12 13:08:36 -04001366func (c *Module) IsVndkPrebuiltLibrary() bool {
1367 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1368 return true
1369 }
1370 return false
1371}
1372
1373func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1374 return c.Properties.SdkAndPlatformVariantVisibleToMake
1375}
1376
Ivan Lozanod7586b62021-04-01 09:49:36 -04001377func (c *Module) HasLlndkStubs() bool {
1378 lib := moduleLibraryInterface(c)
1379 return lib != nil && lib.hasLLNDKStubs()
1380}
1381
1382func (c *Module) StubsVersion() string {
1383 if lib, ok := c.linker.(versionedInterface); ok {
1384 return lib.stubsVersion()
1385 }
1386 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1387}
1388
Colin Cross127bb8b2020-12-16 16:46:01 -08001389// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1390// and does not set llndk.vendor_available: false.
1391func (c *Module) isImplementationForLLNDKPublic() bool {
1392 library, _ := c.library.(*libraryDecorator)
1393 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001394 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001395}
1396
Justin Yunfd9e8042020-12-23 18:23:14 +09001397// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001398func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001399 // Check if VNDK-core-private or VNDK-SP-private
1400 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001401 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001402 }
1403
1404 // Check if LLNDK-private
1405 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001406 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001407 }
1408
1409 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001410}
1411
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001412// IsVndk() returns true if this module has a vndk variant.
1413// Note that IsVndk() returns true for all variants of vndk-enabled libraries. Not only vendor variant,
1414// but also platform and product variants of vndk-enabled libraries return true for IsVndk().
Ivan Lozano52767be2019-10-18 14:49:46 -07001415func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001416 if vndkdep := c.vndkdep; vndkdep != nil {
1417 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001418 }
1419 return false
1420}
1421
Colin Cross3513fb12024-01-24 14:44:47 -08001422func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001423 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001424 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001425 }
1426 return false
1427}
1428
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001429func (c *Module) isOrderfileCompile() bool {
1430 if orderfile := c.orderfile; orderfile != nil {
1431 return orderfile.Properties.OrderfileLoad
1432 }
1433 return false
1434}
1435
Yi Kongc702ebd2022-08-19 16:02:45 +08001436func (c *Module) isCfi() bool {
1437 if sanitize := c.sanitize; sanitize != nil {
Yi Kongddffe722023-07-18 16:40:36 +09001438 return Bool(sanitize.Properties.SanitizeMutated.Cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001439 }
1440 return false
1441}
1442
Yi Konged79fa32023-06-04 17:15:42 +09001443func (c *Module) isFuzzer() bool {
1444 if sanitize := c.sanitize; sanitize != nil {
1445 return Bool(sanitize.Properties.SanitizeMutated.Fuzzer)
1446 }
1447 return false
1448}
1449
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001450func (c *Module) isNDKStubLibrary() bool {
1451 if _, ok := c.compiler.(*stubDecorator); ok {
1452 return true
1453 }
1454 return false
1455}
1456
Ivan Lozanod7586b62021-04-01 09:49:36 -04001457func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001458 if vndkdep := c.vndkdep; vndkdep != nil {
1459 return vndkdep.isVndkSp()
1460 }
1461 return false
1462}
1463
Ivan Lozanof9e21722020-12-02 09:00:51 -05001464func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001465 if vndkdep := c.vndkdep; vndkdep != nil {
1466 return vndkdep.isVndkExt()
1467 }
1468 return false
1469}
1470
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001471func (c *Module) SubName() string {
1472 return c.Properties.SubName
1473}
1474
Ivan Lozano52767be2019-10-18 14:49:46 -07001475func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001476 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001477}
1478
Logan Chienf3511742017-10-31 18:04:35 +08001479func (c *Module) getVndkExtendsModuleName() string {
1480 if vndkdep := c.vndkdep; vndkdep != nil {
1481 return vndkdep.getVndkExtendsModuleName()
1482 }
1483 return ""
1484}
1485
Jiyong Park25fc6a92018-11-18 18:02:45 +09001486func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001487 if lib := c.library; lib != nil {
1488 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001489 }
1490 return false
1491}
1492
1493func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001494 if lib := c.library; lib != nil {
1495 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001496 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001497 return false
1498}
1499
Alan Stokes73feba32022-11-14 12:21:24 +00001500func (c *Module) IsStubsImplementationRequired() bool {
1501 if lib := c.library; lib != nil {
1502 return lib.isStubsImplementationRequired()
1503 }
1504 return false
1505}
1506
Colin Cross0477b422020-10-13 18:43:54 -07001507// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1508// the implementation. If it is an implementation library it returns its own name.
1509func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1510 name := ctx.OtherModuleName(c)
1511 if versioned, ok := c.linker.(versionedInterface); ok {
1512 name = versioned.implementationModuleName(name)
1513 }
1514 return name
1515}
1516
Martin Stjernholm2856c662020-12-02 15:03:42 +00001517// Similar to ImplementationModuleName, but uses the Make variant of the module
1518// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1519// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1520// under the premise that the prebuilt module overrides its source counterpart
1521// if it is exposed to Make).
1522func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1523 name := c.BaseModuleName()
1524 if versioned, ok := c.linker.(versionedInterface); ok {
1525 name = versioned.implementationModuleName(name)
1526 }
1527 return name
1528}
1529
Jiyong Park7d55b612021-06-11 17:22:09 +09001530func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001531 return Bool(c.Properties.Bootstrap)
1532}
1533
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001534func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001535 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1536 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1537 return false
1538 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001539 return c.linker != nil && c.linker.nativeCoverage()
1540}
1541
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001542func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001543 if p, ok := c.linker.(SnapshotInterface); ok {
1544 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001545 }
1546 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001547}
1548
Jiyong Parkf1194352019-02-25 11:05:47 +09001549func isBionic(name string) bool {
1550 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001551 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001552 return true
1553 }
1554 return false
1555}
1556
Martin Stjernholm279de572019-09-10 23:18:20 +01001557func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001558 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001560 }
1561 return isBionic(name)
1562}
1563
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001564func (c *Module) XrefCcFiles() android.Paths {
1565 return c.kytheFiles
1566}
1567
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001568func (c *Module) isCfiAssemblySupportEnabled() bool {
1569 return c.sanitize != nil &&
1570 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1571}
1572
Inseob Kim800d1142021-06-14 12:03:51 +09001573func (c *Module) InstallInRoot() bool {
1574 return c.installer != nil && c.installer.installInRoot()
1575}
1576
Colin Crossca860ac2016-01-04 14:34:37 -08001577type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001578 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001579 moduleContextImpl
1580}
1581
Colin Cross37047f12016-12-13 17:06:13 -08001582type depsContext struct {
1583 android.BottomUpMutatorContext
1584 moduleContextImpl
1585}
1586
Colin Crossca860ac2016-01-04 14:34:37 -08001587type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001588 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001589 moduleContextImpl
1590}
1591
1592type moduleContextImpl struct {
1593 mod *Module
1594 ctx BaseModuleContext
1595}
1596
Colin Crossb98c8b02016-07-29 13:44:28 -07001597func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001598 return ctx.mod.toolchain(ctx.ctx)
1599}
1600
1601func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001602 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001603}
1604
1605func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001606 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001607}
1608
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001609func (ctx *moduleContextImpl) testBinary() bool {
1610 return ctx.mod.testBinary()
1611}
1612
Yi Kong56fc1b62022-09-06 16:24:00 +08001613func (ctx *moduleContextImpl) testLibrary() bool {
1614 return ctx.mod.testLibrary()
1615}
1616
Jiyong Park1d1119f2019-07-29 21:27:18 +09001617func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001618 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001619}
1620
Inseob Kim7f283f42020-06-01 21:53:49 +09001621func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001622 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001623}
1624
Inseob Kim1042d292020-06-01 23:23:05 +09001625func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001626 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001627}
1628
Jooyung Hanccce2f22020-03-07 03:45:53 +09001629func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001630 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001631}
1632
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001633func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001634 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001635}
1636
1637func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001638 if ctx.ctx.Device() {
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001639 config := ctx.ctx.Config()
1640 if !config.IsVndkDeprecated() && ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001641 vndkVer := ctx.mod.VndkVersion()
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001642 if inList(vndkVer, config.PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001643 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001644 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001645 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001646 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001647 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001648 }
1649 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001650}
1651
Jiyong Parkb35a8192020-08-10 15:59:36 +09001652func (ctx *moduleContextImpl) minSdkVersion() string {
1653 ver := ctx.mod.MinSdkVersion()
1654 if ver == "apex_inherit" && !ctx.isForPlatform() {
1655 ver = ctx.apexSdkVersion().String()
1656 }
1657 if ver == "apex_inherit" || ver == "" {
1658 ver = ctx.sdkVersion()
1659 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001660
1661 if ctx.ctx.Device() {
1662 config := ctx.ctx.Config()
1663 if config.IsVndkDeprecated() && ctx.inVendor() {
1664 // If building for vendor with final API, then use the latest _stable_ API as "current".
1665 if config.VendorApiLevelFrozen() && (ver == "" || ver == "current") {
1666 ver = config.PlatformSdkVersion().String()
1667 }
1668 }
1669 }
1670
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001671 // For crt objects, the meaning of min_sdk_version is very different from other types of
1672 // module. For them, min_sdk_version defines the oldest version that the build system will
1673 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1674 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1675 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001676 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1677 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1678 // support such an old version. The version is set to the later version in case when the
1679 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1680 // it's for an APEX.
1681 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1682 if ctx.isForPlatform() {
1683 ver = strconv.Itoa(android.FutureApiLevelInt)
1684 } else { // for apex
1685 ver = ctx.apexSdkVersion().String()
1686 if ver == "" { // in case when min_sdk_version was not set by the APEX
1687 ver = ctx.sdkVersion()
1688 }
1689 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001690 }
1691
Jiyong Parkb35a8192020-08-10 15:59:36 +09001692 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1693 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1694 minSdkVersionInt, err2 := strconv.Atoi(ver)
1695 if err == nil && err2 == nil {
1696 if sdkVersionInt < minSdkVersionInt {
1697 return strconv.Itoa(sdkVersionInt)
1698 }
1699 }
1700 return ver
1701}
1702
1703func (ctx *moduleContextImpl) isSdkVariant() bool {
1704 return ctx.mod.IsSdkVariant()
1705}
1706
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001707func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001708 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001709}
Justin Yun8effde42017-06-23 19:24:43 +09001710
Kiyoung Kimaa394802024-01-08 12:55:45 +09001711func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1712 return ctx.mod.InVendorOrProduct()
1713}
1714
Colin Cross95f1ca02020-10-29 20:47:22 -07001715func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1716 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001717}
1718
Colin Cross127bb8b2020-12-16 16:46:01 -08001719func (ctx *moduleContextImpl) IsLlndk() bool {
1720 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001721}
1722
Colin Cross127bb8b2020-12-16 16:46:01 -08001723func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1724 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001725}
1726
Colin Cross127bb8b2020-12-16 16:46:01 -08001727func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1728 return ctx.mod.isImplementationForLLNDKPublic()
1729}
1730
1731func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1732 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001733}
1734
Logan Chienf3511742017-10-31 18:04:35 +08001735func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001736 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001737}
1738
Colin Cross3513fb12024-01-24 14:44:47 -08001739func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1740 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001741}
1742
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001743func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1744 return ctx.mod.isOrderfileCompile()
1745}
1746
Yi Kongc702ebd2022-08-19 16:02:45 +08001747func (ctx *moduleContextImpl) isCfi() bool {
1748 return ctx.mod.isCfi()
1749}
1750
Yi Konged79fa32023-06-04 17:15:42 +09001751func (ctx *moduleContextImpl) isFuzzer() bool {
1752 return ctx.mod.isFuzzer()
1753}
1754
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001755func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1756 return ctx.mod.isNDKStubLibrary()
1757}
1758
Justin Yun8effde42017-06-23 19:24:43 +09001759func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001760 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001761}
1762
Ivan Lozanof9e21722020-12-02 09:00:51 -05001763func (ctx *moduleContextImpl) IsVndkExt() bool {
1764 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001765}
1766
Colin Cross5271fea2021-04-27 13:06:04 -07001767func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1768 return ctx.mod.IsVendorPublicLibrary()
1769}
1770
Vic Yangefd249e2018-11-12 20:19:56 -08001771func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001772 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001773}
1774
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001775func (ctx *moduleContextImpl) selectedStl() string {
1776 if stl := ctx.mod.stl; stl != nil {
1777 return stl.Properties.SelectedStl
1778 }
1779 return ""
1780}
1781
Ivan Lozanobd721262018-11-27 14:33:03 -08001782func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1783 return ctx.mod.linker.useClangLld(actx)
1784}
1785
Colin Crossce75d2c2016-10-06 16:12:58 -07001786func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001787 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001788}
1789
Logan Chienf3511742017-10-31 18:04:35 +08001790func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1791 return ctx.mod.getVndkExtendsModuleName()
1792}
1793
Logan Chiene274fc92019-12-03 11:18:32 -08001794func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Crossff694a82023-12-13 15:54:49 -08001795 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1796 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001797}
1798
Colin Crosse07f2312020-08-13 11:24:56 -07001799func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001800 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1801 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001802}
1803
Dan Albertc8060532020-07-22 22:32:17 -07001804func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001805 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001806}
1807
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001808func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001809 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001810}
1811
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001812func (ctx *moduleContextImpl) nativeCoverage() bool {
1813 return ctx.mod.nativeCoverage()
1814}
1815
Colin Cross56a83212020-09-15 18:30:11 -07001816func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1817 return ctx.mod.DirectlyInAnyApex()
1818}
1819
Colin Cross95b07f22020-12-16 11:06:50 -08001820func (ctx *moduleContextImpl) isPreventInstall() bool {
1821 return ctx.mod.Properties.PreventInstall
1822}
1823
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001824func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1825 shared := &ctx.mod.sharedFlags
1826 if shared.flagsMap == nil {
1827 shared.numSharedFlags = 0
1828 shared.flagsMap = make(map[string]string)
1829 }
1830 return shared
1831}
1832
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001833func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1834 return ctx.mod.isCfiAssemblySupportEnabled()
1835}
1836
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001837func (ctx *moduleContextImpl) notInPlatform() bool {
1838 return ctx.mod.NotInPlatform()
1839}
1840
Colin Cross635c3b02016-05-18 15:37:25 -07001841func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001842 return &Module{
1843 hod: hod,
1844 multilib: multilib,
1845 }
1846}
1847
Colin Cross635c3b02016-05-18 15:37:25 -07001848func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001849 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001850 module.features = []feature{
1851 &tidyFeature{},
1852 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001853 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001854 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001855 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001856 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001857 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001858 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001859 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001860 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001861 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001862 return module
1863}
1864
Colin Crossce75d2c2016-10-06 16:12:58 -07001865func (c *Module) Prebuilt() *android.Prebuilt {
1866 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1867 return p.prebuilt()
1868 }
1869 return nil
1870}
1871
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001872func (c *Module) IsPrebuilt() bool {
1873 return c.Prebuilt() != nil
1874}
1875
Colin Crossce75d2c2016-10-06 16:12:58 -07001876func (c *Module) Name() string {
1877 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001878 if p, ok := c.linker.(interface {
1879 Name(string) string
1880 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001881 name = p.Name(name)
1882 }
1883 return name
1884}
1885
Alex Light3d673592019-01-18 14:37:31 -08001886func (c *Module) Symlinks() []string {
1887 if p, ok := c.installer.(interface {
1888 symlinkList() []string
1889 }); ok {
1890 return p.symlinkList()
1891 }
1892 return nil
1893}
1894
Roland Levillainf89cd092019-07-29 16:22:59 +01001895func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1896 test, ok := c.linker.(testPerSrc)
1897 return ok && test.isAllTestsVariation()
1898}
1899
Chris Parsons216e10a2020-07-09 17:12:52 -04001900func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001901 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001902 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001903 }); ok {
1904 return p.dataPaths()
1905 }
1906 return nil
1907}
1908
Ivan Lozanof1868af2022-04-12 13:08:36 -04001909func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001910 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1911 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001912 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001913 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001914 if c.ProductSpecific() {
1915 // If the module is product specific with 'product_specific: true',
1916 // do not add a name suffix because it is a base module.
1917 return ""
1918 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001919 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001920 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001921 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001922 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001923 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001924 // add version suffix only if the module is using different vndk version than the
1925 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001926 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001927 }
1928 return nameSuffix
1929}
1930
Ivan Lozanof1868af2022-04-12 13:08:36 -04001931func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1932 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001933
1934 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001935 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001936 }
1937
Colin Cross127bb8b2020-12-16 16:46:01 -08001938 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001939 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001940 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1941 // added for product variant only when we have vendor and product variants with core
1942 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001943 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001944 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001945 subName += vendorPublicLibrarySuffix
1946 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001947 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1948 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001949 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001950 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001951 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001952 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001953 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001954 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001955 subName += RecoverySuffix
1956 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1957 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001958 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001959 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001960 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001961 } else if c.IsStubs() && c.IsSdkVariant() {
1962 // Public API surface (NDK)
1963 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1964 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001965 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001966
1967 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001968}
1969
Sam Delmerico75dbca22023-04-20 13:13:25 +00001970func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1971 ctx := &moduleContext{
1972 ModuleContext: actx,
1973 moduleContextImpl: moduleContextImpl{
1974 mod: c,
1975 },
1976 }
1977 ctx.ctx = ctx
1978 return ctx
1979}
1980
Spandan Das20fce2d2023-04-12 17:21:39 +00001981// TODO (b/277651159): Remove this allowlist
1982var (
1983 skipStubLibraryMultipleApexViolation = map[string]bool{
1984 "libclang_rt.asan": true,
1985 "libclang_rt.hwasan": true,
1986 // runtime apex
1987 "libc": true,
1988 "libc_hwasan": true,
1989 "libdl_android": true,
1990 "libm": true,
1991 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00001992 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00001993 // art apex
1994 "libandroidio": true,
1995 "libdexfile": true,
1996 "libnativebridge": true,
1997 "libnativehelper": true,
1998 "libnativeloader": true,
1999 "libsigchain": true,
2000 }
2001)
2002
2003// Returns true if a stub library could be installed in multiple apexes
2004func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2005 // If this is not an apex variant, no check necessary
2006 if !c.InAnyApex() {
2007 return false
2008 }
2009 // If this is not a stub library, no check necessary
2010 if !c.HasStubsVariants() {
2011 return false
2012 }
2013 // Skip the allowlist
2014 // Use BaseModuleName so that this matches prebuilts.
2015 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2016 return false
2017 }
2018
2019 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
2020 // Stub libraries should not have more than one apex_available
2021 if len(aaWithoutTestApexes) > 1 {
2022 return true
2023 }
2024 // Stub libraries should not use the wildcard
2025 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
2026 return true
2027 }
2028 // Default: no violation
2029 return false
2030}
2031
Chris Parsons8d6e4332021-02-22 16:13:50 -05002032func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002033 ctx := moduleContextFromAndroidModuleContext(actx, c)
2034
Inseob Kim37e0bb02024-04-29 15:54:44 +09002035 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2036 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2037 Logtags: c.logtagsPaths,
2038 })
2039
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002040 // If Test_only is set on a module in bp file, respect the setting, otherwise
2041 // see if is a known test module type.
2042 testOnly := c.testModule || c.testLibrary()
2043 if c.sourceProperties.Test_only != nil {
2044 testOnly = Bool(c.sourceProperties.Test_only)
2045 }
2046 // Keep before any early returns.
2047 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2048 TestOnly: testOnly,
2049 TopLevelTarget: c.testModule,
2050 })
2051
Chris Parsons8d6e4332021-02-22 16:13:50 -05002052 // Handle the case of a test module split by `test_per_src` mutator.
2053 //
2054 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
2055 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
2056 // module and return early, as this module does not produce an output file per se.
2057 if c.IsTestPerSrcAllTestsVariation() {
2058 c.outputFile = android.OptionalPath{}
2059 return
2060 }
2061
Ivan Lozanof1868af2022-04-12 13:08:36 -04002062 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002063 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002064 if !apexInfo.IsForPlatform() {
2065 c.hideApexVariantFromMake = true
2066 }
2067
Chris Parsonseefc9e62021-04-02 17:36:47 -04002068 c.makeLinkType = GetMakeLinkType(actx, c)
2069
Colin Crossf18e1102017-11-16 14:33:08 -08002070 deps := c.depsToPaths(ctx)
2071 if ctx.Failed() {
2072 return
2073 }
2074
Joe Onorato37f900c2023-07-18 16:58:16 -07002075 for _, generator := range c.generators {
2076 gen := generator.GeneratorSources(ctx)
2077 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2078 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2079 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2080 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2081 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2082 if len(deps.Objs.objFiles) == 0 {
2083 // If we are reusuing object files (which happens when we're a shared library and we're
2084 // reusing our static variant's object files), then skip adding the actual source files,
2085 // because we already have the object for it.
2086 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2087 }
2088 }
2089
2090 if ctx.Failed() {
2091 return
2092 }
2093
Spandan Das20fce2d2023-04-12 17:21:39 +00002094 if c.stubLibraryMultipleApexViolation(actx) {
2095 actx.PropertyErrorf("apex_available",
2096 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2097 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002098 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2099 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002100 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2101 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002102 }
2103
Colin Crossca860ac2016-01-04 14:34:37 -08002104 flags := Flags{
2105 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002106 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002107 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002108 for _, generator := range c.generators {
2109 flags = generator.GeneratorFlags(ctx, flags, deps)
2110 }
Colin Crossca860ac2016-01-04 14:34:37 -08002111 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002112 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002113 }
2114 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002115 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002116 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002117 if c.stl != nil {
2118 flags = c.stl.flags(ctx, flags)
2119 }
Colin Cross16b23492016-01-06 14:41:07 -08002120 if c.sanitize != nil {
2121 flags = c.sanitize.flags(ctx, flags)
2122 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002123 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002124 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002125 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002126 if c.fuzzer != nil {
2127 flags = c.fuzzer.flags(ctx, flags)
2128 }
Stephen Craneba090d12017-05-09 15:44:35 -07002129 if c.lto != nil {
2130 flags = c.lto.flags(ctx, flags)
2131 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002132 if c.afdo != nil {
2133 flags = c.afdo.flags(ctx, flags)
2134 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002135 if c.orderfile != nil {
2136 flags = c.orderfile.flags(ctx, flags)
2137 }
Colin Crossca860ac2016-01-04 14:34:37 -08002138 for _, feature := range c.features {
2139 flags = feature.flags(ctx, flags)
2140 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002141 if ctx.Failed() {
2142 return
2143 }
2144
Colin Cross4af21ed2019-11-04 09:37:55 -08002145 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2146 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2147 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002148
Colin Cross4af21ed2019-11-04 09:37:55 -08002149 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002150
2151 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002152 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002153 }
2154 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002155 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002156 }
2157
Colin Cross3e5e7782022-06-17 22:17:05 +00002158 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2159
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002160 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002161 // We need access to all the flags seen by a source file.
2162 if c.sabi != nil {
2163 flags = c.sabi.flags(ctx, flags)
2164 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002165
Colin Cross4af21ed2019-11-04 09:37:55 -08002166 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002167
Joe Onorato37f900c2023-07-18 16:58:16 -07002168 for _, generator := range c.generators {
2169 generator.GeneratorBuildActions(ctx, flags, deps)
2170 }
2171
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002172 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002173 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002174 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002175 if ctx.Failed() {
2176 return
2177 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002178 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07002179 c.objFiles = objs.objFiles
2180 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08002181 }
2182
Colin Crossca860ac2016-01-04 14:34:37 -08002183 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002184 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002185 if ctx.Failed() {
2186 return
2187 }
Colin Cross635c3b02016-05-18 15:37:25 -07002188 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002189
Chris Parsons94a0bba2021-06-04 15:03:47 -04002190 c.maybeUnhideFromMake()
Colin Crossce75d2c2016-10-06 16:12:58 -07002191 }
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002192 if c.testModule {
Colin Cross40213022023-12-13 15:19:49 -08002193 android.SetProvider(ctx, testing.TestModuleProviderKey, testing.TestModuleProviderData{})
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002194 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002195
Colin Cross40213022023-12-13 15:19:49 -08002196 android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
Colin Cross5049f022015-03-18 13:28:46 -07002197
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002198 if Bool(c.Properties.Cmake_snapshot_supported) {
2199 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2200 }
2201
Chris Parsons94a0bba2021-06-04 15:03:47 -04002202 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002203
2204 if c.linker != nil {
2205 moduleInfoJSON := ctx.ModuleInfoJSON()
2206 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2207 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2208 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2209 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2210 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2211
2212 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2213 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2214 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2215 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2216
2217 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2218 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2219 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2220 moduleInfoJSON.SubName += ".cfi"
2221 }
2222 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2223 moduleInfoJSON.SubName += ".hwasan"
2224 }
2225 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2226 moduleInfoJSON.SubName += ".scs"
2227 }
2228 }
2229 moduleInfoJSON.SubName += c.Properties.SubName
2230
2231 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2232 moduleInfoJSON.Uninstallable = true
2233 }
2234
2235 }
Chris Parsons94a0bba2021-06-04 15:03:47 -04002236}
2237
2238func (c *Module) maybeUnhideFromMake() {
2239 // If a lib is directly included in any of the APEXes or is not available to the
2240 // platform (which is often the case when the stub is provided as a prebuilt),
2241 // unhide the stubs variant having the latest version gets visible to make. In
2242 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2243 // force anything in the make world to link against the stubs library. (unless it
2244 // is explicitly referenced via .bootstrap suffix or the module is marked with
2245 // 'bootstrap: true').
2246 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002247 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002248 c.IsStubs() && !c.InVendorRamdisk() {
2249 c.Properties.HideFromMake = false // unhide
2250 // Note: this is still non-installable
2251 }
2252}
2253
Colin Cross8ff10582023-12-07 13:10:56 -08002254// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2255// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002256func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002257 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002258 // If the module has been specifically configure to not be installed then
2259 // hide from make as otherwise it will break when running inside make
2260 // as the output path to install will not be specified. Not all uninstallable
2261 // modules can be hidden from make as some are needed for resolving make side
2262 // dependencies.
2263 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002264 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002265 c.SkipInstall()
2266 }
2267
2268 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2269 // to allow using the outputs in a genrule.
2270 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002271 c.installer.install(ctx, c.outputFile.Path())
2272 if ctx.Failed() {
2273 return
Colin Crossca860ac2016-01-04 14:34:37 -08002274 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002275 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002276}
2277
Colin Cross0ea8ba82019-06-06 14:33:29 -07002278func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002279 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002280 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002281 }
Colin Crossca860ac2016-01-04 14:34:37 -08002282 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002283}
2284
Colin Crossca860ac2016-01-04 14:34:37 -08002285func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002286 for _, generator := range c.generators {
2287 generator.GeneratorInit(ctx)
2288 }
Colin Crossca860ac2016-01-04 14:34:37 -08002289 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002290 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002291 }
Colin Crossca860ac2016-01-04 14:34:37 -08002292 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002293 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002294 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002295 if c.stl != nil {
2296 c.stl.begin(ctx)
2297 }
Colin Cross16b23492016-01-06 14:41:07 -08002298 if c.sanitize != nil {
2299 c.sanitize.begin(ctx)
2300 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002301 if c.coverage != nil {
2302 c.coverage.begin(ctx)
2303 }
Yi Kong9723e332023-12-04 14:52:53 +09002304 if c.afdo != nil {
2305 c.afdo.begin(ctx)
2306 }
Stephen Craneba090d12017-05-09 15:44:35 -07002307 if c.lto != nil {
2308 c.lto.begin(ctx)
2309 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002310 if c.orderfile != nil {
2311 c.orderfile.begin(ctx)
2312 }
Dan Albert92fe7402020-07-15 13:33:30 -07002313 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002314 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002315 if err != nil {
2316 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002317 c.Properties.Sdk_version = nil
2318 } else {
2319 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002320 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002321 }
Colin Crossca860ac2016-01-04 14:34:37 -08002322}
2323
Colin Cross37047f12016-12-13 17:06:13 -08002324func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002325 deps := Deps{}
2326
Joe Onorato37f900c2023-07-18 16:58:16 -07002327 for _, generator := range c.generators {
2328 deps = generator.GeneratorDeps(ctx, deps)
2329 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002330 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002331 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002332 }
2333 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002334 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002335 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002336 if c.stl != nil {
2337 deps = c.stl.deps(ctx, deps)
2338 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002339 if c.coverage != nil {
2340 deps = c.coverage.deps(ctx, deps)
2341 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002342
Colin Crossb6715442017-10-24 11:13:31 -07002343 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2344 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
Ivan Lozano0a468a42024-05-13 21:03:34 -04002345 deps.Rlibs = android.LastUniqueStrings(deps.Rlibs)
Colin Crossb6715442017-10-24 11:13:31 -07002346 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2347 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2348 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2349 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002350 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002351 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002352
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002353 for _, lib := range deps.ReexportSharedLibHeaders {
2354 if !inList(lib, deps.SharedLibs) {
2355 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2356 }
2357 }
2358
2359 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002360 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2361 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 -07002362 }
2363 }
2364
Colin Cross5950f382016-12-13 12:50:57 -08002365 for _, lib := range deps.ReexportHeaderLibHeaders {
2366 if !inList(lib, deps.HeaderLibs) {
2367 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2368 }
2369 }
2370
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002371 for _, gen := range deps.ReexportGeneratedHeaders {
2372 if !inList(gen, deps.GeneratedHeaders) {
2373 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2374 }
2375 }
2376
Colin Crossc99deeb2016-04-11 15:06:20 -07002377 return deps
2378}
2379
Dan Albert7e9d2952016-08-04 13:02:36 -07002380func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002381 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002382 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002383 moduleContextImpl: moduleContextImpl{
2384 mod: c,
2385 },
2386 }
2387 ctx.ctx = ctx
2388
Colin Crossca860ac2016-01-04 14:34:37 -08002389 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002390}
2391
Jiyong Park7ed9de32018-10-15 22:25:07 +09002392// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002393func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002394 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2395 version := name[sharp+1:]
2396 libname := name[:sharp]
2397 return libname, version
2398 }
2399 return name, ""
2400}
2401
Dan Albert92fe7402020-07-15 13:33:30 -07002402func GetCrtVariations(ctx android.BottomUpMutatorContext,
2403 m LinkableInterface) []blueprint.Variation {
2404 if ctx.Os() != android.Android {
2405 return nil
2406 }
2407 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002408 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2409 minSdkVersion := m.MinSdkVersion()
2410 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2411 minSdkVersion = m.SdkVersion()
2412 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002413 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2414 if err != nil {
2415 ctx.PropertyErrorf("min_sdk_version", err.Error())
2416 }
Colin Cross363ec762023-01-13 13:45:14 -08002417
2418 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002419 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002420 if apiLevel.LessThan(minApiForArch) {
2421 apiLevel = minApiForArch
2422 }
2423
Dan Albert92fe7402020-07-15 13:33:30 -07002424 return []blueprint.Variation{
2425 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002426 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002427 }
2428 }
2429 return []blueprint.Variation{
2430 {Mutator: "sdk", Variation: ""},
2431 }
2432}
2433
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002434func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2435 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002436
2437 variations = append([]blueprint.Variation(nil), variations...)
2438
Liz Kammer23942242022-04-08 15:41:00 -04002439 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002440 // Version is explicitly specified. i.e. libFoo#30
2441 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002442 if tag, ok := depTag.(libraryDependencyTag); ok {
2443 tag.explicitlyVersioned = true
2444 } else {
2445 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2446 }
Colin Crosse7257d22020-09-24 09:56:18 -07002447 }
Colin Crosse7257d22020-09-24 09:56:18 -07002448
Colin Cross0de8a1e2020-09-18 14:15:30 -07002449 if far {
2450 ctx.AddFarVariationDependencies(variations, depTag, name)
2451 } else {
2452 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002453 }
2454}
2455
Kiyoung Kim487689e2022-07-26 09:48:22 +09002456func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2457 apiImportInfo := multitree.ApiImportInfo{}
2458
2459 if c.Device() {
2460 var apiImportModule []blueprint.Module
2461 if actx.OtherModuleExists("api_imports") {
2462 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2463 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
Colin Cross313aa542023-12-13 13:47:44 -08002464 apiInfo, _ := android.OtherModuleProvider(actx, apiImportModule[0], multitree.ApiImportsProvider)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002465 apiImportInfo = apiInfo
Colin Cross40213022023-12-13 15:19:49 -08002466 android.SetProvider(actx, multitree.ApiImportsProvider, apiInfo)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002467 }
2468 }
2469 }
2470
2471 return apiImportInfo
2472}
2473
Kiyoung Kim487689e2022-07-26 09:48:22 +09002474func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2475 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002476 return snapshot
2477 }
2478
2479 return lib
2480}
2481
Kiyoung Kim37693d02024-04-04 09:56:15 +09002482// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002483// of names:
2484//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002485// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002486//
2487// For each of these, it adds the name of the ndk_library module to the list of
2488// variant libs.
2489//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002490// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002491//
2492// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002493//
2494// The caller can then know to add the variantLibs dependencies differently from the
2495// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002496func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002497 variantLibs = []string{}
2498
2499 nonvariantLibs = []string{}
2500 for _, entry := range list {
2501 // strip #version suffix out
2502 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002503 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002504 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002505 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002506 nonvariantLibs = append(nonvariantLibs, entry)
2507 }
2508 }
2509 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002510
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002511}
2512
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002513func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2514 nonVariantLibs := []string{}
2515 variantLibs := []string{}
2516
2517 for _, lib := range libs {
2518 replaceLibName := GetReplaceModuleName(lib, replaceList)
2519 if replaceLibName == lib {
2520 // Do not handle any libs which are not in API imports
2521 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2522 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2523 variantLibs = append(variantLibs, replaceLibName)
2524 } else {
2525 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2526 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002527 }
2528
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002529 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002530}
2531
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002532func (c *Module) shouldUseApiSurface() bool {
2533 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2534 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2535 // LLNDK Variant
2536 return true
2537 }
2538
2539 if c.Properties.IsSdkVariant {
2540 // NDK Variant
2541 return true
2542 }
2543
2544 if c.isImportedApiLibrary() {
2545 // API Library should depend on API headers
2546 return true
2547 }
2548 }
2549
2550 return false
2551}
2552
Colin Cross1e676be2016-10-12 14:38:15 -07002553func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002554 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002555 return
2556 }
2557
Colin Cross37047f12016-12-13 17:06:13 -08002558 ctx := &depsContext{
2559 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002560 moduleContextImpl: moduleContextImpl{
2561 mod: c,
2562 },
2563 }
2564 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002565
Colin Crossc99deeb2016-04-11 15:06:20 -07002566 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002567 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002568
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002569 apiNdkLibs := []string{}
2570 apiLateNdkLibs := []string{}
2571
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002572 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002573 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2574 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2575 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2576 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2577 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002578 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002579
Yo Chiang219968c2020-09-22 18:45:04 +08002580 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2581
Dan Albert914449f2016-06-17 16:45:24 -07002582 variantNdkLibs := []string{}
2583 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002584 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002585 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2586 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2587 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002588 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002589
Colin Cross32ec36c2016-12-15 07:39:51 -08002590 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002591 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002592 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002593 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002594 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002595
Kiyoung Kim51279d32022-08-24 14:10:46 +09002596 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002597 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002598 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2599 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002600
Spandan Das73bcafc2022-08-18 23:26:00 +00002601 if c.isNDKStubLibrary() {
2602 // ndk_headers do not have any variations
2603 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002604 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002605 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002606 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002607 } else {
2608 actx.AddVariationDependencies(nil, depTag, lib)
2609 }
2610 }
2611
Dan Albertf1d14c72020-07-30 14:32:55 -07002612 if c.isNDKStubLibrary() {
2613 // NDK stubs depend on their implementation because the ABI dumps are
2614 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002615
Spandan Das8b08aea2023-03-14 19:29:34 +00002616 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2617 c.ImageVariation(),
2618 blueprint.Variation{Mutator: "link", Variation: "shared"},
2619 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002620 }
2621
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002622 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2623 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2624 c.Target().NativeBridge == android.NativeBridgeDisabled {
2625 actx.AddVariationDependencies(
2626 []blueprint.Variation{{Mutator: "image", Variation: VendorVariation}},
2627 llndkHeaderLibTag,
2628 deps.LlndkHeaderLibs...)
2629 }
2630
Jiyong Park5d1598f2019-02-25 22:14:17 +09002631 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002632 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002633
Jiyong Park5d1598f2019-02-25 22:14:17 +09002634 actx.AddVariationDependencies([]blueprint.Variation{
2635 {Mutator: "link", Variation: "static"},
2636 }, depTag, lib)
2637 }
2638
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002639 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002640 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002641 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002642 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002643 }
Jiyong Parke3867542020-12-03 17:28:25 +09002644 if inList(lib, deps.ExcludeLibsForApex) {
2645 depTag.excludeInApex = true
2646 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002647
Dan Willemsen59339a22018-07-22 21:18:45 -07002648 actx.AddVariationDependencies([]blueprint.Variation{
2649 {Mutator: "link", Variation: "static"},
2650 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002651 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002652
Ivan Lozano0a468a42024-05-13 21:03:34 -04002653 for _, lib := range deps.Rlibs {
2654 depTag := libraryDependencyTag{Kind: rlibLibraryDependency}
2655 actx.AddVariationDependencies([]blueprint.Variation{
2656 {Mutator: "link", Variation: ""},
2657 {Mutator: "rust_libraries", Variation: "rlib"},
2658 {Mutator: "rust_stdlinkage", Variation: "rlib-std"},
2659 }, depTag, lib)
2660 }
2661
Jooyung Han75568392020-03-20 04:29:24 +09002662 // staticUnwinderDep is treated as staticDep for Q apexes
2663 // so that native libraries/binaries are linked with static unwinder
2664 // because Q libc doesn't have unwinder APIs
2665 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002666 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002667 actx.AddVariationDependencies([]blueprint.Variation{
2668 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002669 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002670 }
2671
Jiyong Park7ed9de32018-10-15 22:25:07 +09002672 // shared lib names without the #version suffix
2673 var sharedLibNames []string
2674
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002675 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002676 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002677 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002678 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002679 }
Jiyong Parke3867542020-12-03 17:28:25 +09002680 if inList(lib, deps.ExcludeLibsForApex) {
2681 depTag.excludeInApex = true
2682 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002683 if inList(lib, deps.ExcludeLibsForNonApex) {
2684 depTag.excludeInNonApex = true
2685 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002686
Jiyong Park73c54ee2019-10-22 20:31:18 +09002687 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002688 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2689 name = apiLibraryName
2690 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002691 sharedLibNames = append(sharedLibNames, name)
2692
Colin Crosse7257d22020-09-24 09:56:18 -07002693 variations := []blueprint.Variation{
2694 {Mutator: "link", Variation: "shared"},
2695 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002696
2697 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2698 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2699 }
2700
2701 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2702 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2703 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002704 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002705
Colin Crossfe9acfe2021-06-14 16:13:03 -07002706 for _, lib := range deps.LateStaticLibs {
2707 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2708 actx.AddVariationDependencies([]blueprint.Variation{
2709 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002710 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002711 }
2712
Colin Cross3e5e7782022-06-17 22:17:05 +00002713 for _, lib := range deps.UnexportedStaticLibs {
2714 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2715 actx.AddVariationDependencies([]blueprint.Variation{
2716 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002717 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002718 }
2719
Jiyong Park7ed9de32018-10-15 22:25:07 +09002720 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002721 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002722 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2723 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2724 // linking against both the stubs lib and the non-stubs lib at the same time.
2725 continue
2726 }
Colin Cross6e511a92020-07-27 21:26:48 -07002727 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002728 variations := []blueprint.Variation{
2729 {Mutator: "link", Variation: "shared"},
2730 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002731 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002732 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002733
Dan Willemsen59339a22018-07-22 21:18:45 -07002734 actx.AddVariationDependencies([]blueprint.Variation{
2735 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002736 }, dataLibDepTag, deps.DataLibs...)
2737
Colin Crossc8caa062021-09-24 16:50:14 -07002738 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2739
Chris Parsons79d66a52020-06-05 17:26:16 -04002740 actx.AddVariationDependencies([]blueprint.Variation{
2741 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002742 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002743
Colin Cross68861832016-07-08 10:41:41 -07002744 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002745
2746 for _, gen := range deps.GeneratedHeaders {
2747 depTag := genHeaderDepTag
2748 if inList(gen, deps.ReexportGeneratedHeaders) {
2749 depTag = genHeaderExportDepTag
2750 }
2751 actx.AddDependency(c, depTag, gen)
2752 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002753
Dan Albert92fe7402020-07-15 13:33:30 -07002754 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002755 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002756 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002757 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002758 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002759 }
Colin Crossc465efd2021-06-11 18:00:04 -07002760 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002761 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002762 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002763 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002764 if deps.DynamicLinker != "" {
2765 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002766 }
Dan Albert914449f2016-06-17 16:45:24 -07002767
2768 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002769
2770 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002771 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002772 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002773 {Mutator: "link", Variation: "shared"},
2774 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002775 actx.AddVariationDependencies([]blueprint.Variation{
2776 {Mutator: "version", Variation: version},
2777 {Mutator: "link", Variation: "shared"},
2778 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002779
2780 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002781 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002782 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002783 {Mutator: "link", Variation: "shared"},
2784 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002785 actx.AddVariationDependencies([]blueprint.Variation{
2786 {Mutator: "version", Variation: version},
2787 {Mutator: "link", Variation: "shared"},
2788 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002789
2790 if vndkdep := c.vndkdep; vndkdep != nil {
2791 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002792 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002793 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002794 {Mutator: "link", Variation: "shared"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002795 }, vndkExtDepTag, vndkdep.getVndkExtendsModuleName())
Logan Chienf3511742017-10-31 18:04:35 +08002796 }
2797 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002798
Vinh Tran367d89d2023-04-28 11:21:25 -04002799 if len(deps.AidlLibs) > 0 {
2800 actx.AddDependency(
2801 c,
2802 aidlLibraryTag,
2803 deps.AidlLibs...,
2804 )
2805 }
2806
Kiyoung Kimee58c932022-10-25 22:59:41 +09002807 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002808}
Colin Cross21b9a242015-03-24 14:15:58 -07002809
Colin Crosse40b4ea2018-10-02 22:25:58 -07002810func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002811 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002812 c.beginMutator(ctx)
2813 }
2814}
2815
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002816// Whether a module can link to another module, taking into
2817// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002818func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002819 tag blueprint.DependencyTag) {
2820
2821 switch t := tag.(type) {
2822 case dependencyTag:
2823 if t != vndkExtDepTag {
2824 return
2825 }
2826 case libraryDependencyTag:
2827 default:
2828 return
2829 }
2830
Ivan Lozanof9e21722020-12-02 09:00:51 -05002831 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002832 // Host code is not restricted
2833 return
2834 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002835
2836 // VNDK is cc.Module supported only for now.
2837 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002838 // Though allowed dependency is limited by the image mutator,
2839 // each vendor and product module needs to check link-type
2840 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002841 if ccTo, ok := to.(*Module); ok {
2842 if ccFrom.vndkdep != nil {
2843 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2844 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002845 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002846 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002847 }
2848 return
2849 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002850 // TODO(b/244244438) : Remove this once all variants are implemented
2851 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2852 return
2853 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002854 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002855 // Platform code can link to anything
2856 return
2857 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002858 if from.InRamdisk() {
2859 // Ramdisk code is not NDK
2860 return
2861 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002862 if from.InVendorRamdisk() {
2863 // Vendor ramdisk code is not NDK
2864 return
2865 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002866 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002867 // Recovery code is not NDK
2868 return
2869 }
Colin Cross31076b32020-10-23 17:22:06 -07002870 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002871 if c.NdkPrebuiltStl() {
2872 // These are allowed, but they don't set sdk_version
2873 return
2874 }
2875 if c.StubDecorator() {
2876 // These aren't real libraries, but are the stub shared libraries that are included in
2877 // the NDK.
2878 return
2879 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002880 if c.isImportedApiLibrary() {
2881 // Imported library from the API surface is a stub library built against interface definition.
2882 return
2883 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002884 }
Logan Chien834b9a62019-01-14 15:39:03 +08002885
Ivan Lozano52767be2019-10-18 14:49:46 -07002886 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002887 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2888 // to link to libc++ (non-NDK and without sdk_version).
2889 return
2890 }
2891
Ivan Lozano52767be2019-10-18 14:49:46 -07002892 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002893 // NDK code linking to platform code is never okay.
2894 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002895 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002896 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002897 }
2898
2899 // At this point we know we have two NDK libraries, but we need to
2900 // check that we're not linking against anything built against a higher
2901 // API level, as it is only valid to link against older or equivalent
2902 // APIs.
2903
Inseob Kim01a28722018-04-11 09:48:45 +09002904 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002905 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002906 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002907 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002908 // Current can't be linked against by anything else.
2909 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002910 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002911 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002912 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002913 if err != nil {
2914 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002915 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002916 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002917 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002918 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002919 if err != nil {
2920 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002921 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002922 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002923 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002924
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002925 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09002926 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002927 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002928 }
2929 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002930 }
Dan Albert202fe492017-12-15 13:56:59 -08002931
2932 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002933 fromStl := from.SelectedStl()
2934 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002935 if fromStl == "" || toStl == "" {
2936 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002937 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002938 // We can be permissive with the system "STL" since it is only the C++
2939 // ABI layer, but in the future we should make sure that everyone is
2940 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002941 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002942 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002943 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2944 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002945 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002946}
2947
Jooyung Han479ca172020-10-19 18:51:07 +09002948func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2949 if c, ok := ctx.Module().(*Module); ok {
2950 ctx.VisitDirectDeps(func(dep android.Module) {
2951 depTag := ctx.OtherModuleDependencyTag(dep)
2952 ccDep, ok := dep.(LinkableInterface)
2953 if ok {
2954 checkLinkType(ctx, c, ccDep, depTag)
2955 }
2956 })
2957 }
2958}
2959
Jiyong Park5fb8c102018-04-09 12:03:06 +09002960// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002961// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2962// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002963// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09002964func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
2965 check := func(child, parent android.Module) bool {
2966 to, ok := child.(*Module)
2967 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002968 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002969 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002970
Jooyung Hana70f0672019-01-18 15:20:43 +09002971 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2972 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002973 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002974
Jiyong Park0474e1f2021-01-14 14:26:06 +09002975 // These dependencies are not excercised at runtime. Tracking these will give us
2976 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002977 depTag := ctx.OtherModuleDependencyTag(child)
2978 if IsHeaderDepTag(depTag) {
2979 return false
2980 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002981 if depTag == staticVariantTag {
2982 return false
2983 }
2984 if depTag == stubImplDepTag {
2985 return false
2986 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09002987 if depTag == android.RequiredDepTag {
2988 return false
2989 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002990
Justin Yun63e9ec72020-10-29 16:49:43 +09002991 // Even if target lib has no vendor variant, keep checking dependency
2992 // graph in case it depends on vendor_available or product_available
2993 // but not double_loadable transtively.
2994 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002995 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002996 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002997
Jiyong Park0474e1f2021-01-14 14:26:06 +09002998 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2999 // one.
3000 if Bool(to.VendorProperties.Double_loadable) {
3001 return true
3002 }
3003
Ivan Lozanod7586b62021-04-01 09:49:36 -04003004 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003005 return false
3006 }
3007
Jooyung Hana70f0672019-01-18 15:20:43 +09003008 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3009 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003010 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003011 return false
3012 }
3013 if module, ok := ctx.Module().(*Module); ok {
3014 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003015 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003016 ctx.WalkDeps(check)
3017 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003018 }
3019 }
3020}
3021
Yu Liue4312402023-01-18 09:15:31 -08003022func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3023 // For the dependency from platform to apex, use the latest stubs
3024 apexSdkVersion := android.FutureApiLevel
3025 if !apexInfo.IsForPlatform() {
3026 apexSdkVersion = apexInfo.MinSdkVersion
3027 }
3028
3029 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3030 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3031 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3032 // (b/144430859)
3033 apexSdkVersion = android.FutureApiLevel
3034 }
3035
3036 return apexSdkVersion
3037}
3038
Colin Crossc99deeb2016-04-11 15:06:20 -07003039// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003040func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003041 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003042
Colin Cross0de8a1e2020-09-18 14:15:30 -07003043 var directStaticDeps []StaticLibraryInfo
3044 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003045
Colin Cross0de8a1e2020-09-18 14:15:30 -07003046 reexportExporter := func(exporter FlagExporterInfo) {
3047 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3048 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3049 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3050 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3051 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003052 }
3053
Colin Crossff694a82023-12-13 15:54:49 -08003054 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003055 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003056
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003057 skipModuleList := map[string]bool{}
3058
3059 var apiImportInfo multitree.ApiImportInfo
3060 hasApiImportInfo := false
3061
3062 ctx.VisitDirectDeps(func(dep android.Module) {
3063 if dep.Name() == "api_imports" {
Colin Cross313aa542023-12-13 13:47:44 -08003064 apiImportInfo, _ = android.OtherModuleProvider(ctx, dep, multitree.ApiImportsProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003065 hasApiImportInfo = true
3066 }
3067 })
3068
3069 if hasApiImportInfo {
3070 targetStubModuleList := map[string]string{}
3071 targetOrigModuleList := map[string]string{}
3072
3073 // Search for dependency which both original module and API imported library with APEX stub exists
3074 ctx.VisitDirectDeps(func(dep android.Module) {
3075 depName := ctx.OtherModuleName(dep)
3076 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
3077 targetStubModuleList[apiLibrary] = depName
3078 }
3079 })
3080 ctx.VisitDirectDeps(func(dep android.Module) {
3081 depName := ctx.OtherModuleName(dep)
3082 if origLibrary, ok := targetStubModuleList[depName]; ok {
3083 targetOrigModuleList[origLibrary] = depName
3084 }
3085 })
3086
3087 // Decide which library should be used between original and API imported library
3088 ctx.VisitDirectDeps(func(dep android.Module) {
3089 depName := ctx.OtherModuleName(dep)
3090 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003091 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003092 skipModuleList[depName] = true
3093 } else {
3094 skipModuleList[apiLibrary] = true
3095 }
3096 }
3097 })
3098 }
3099
Colin Crossd11fcda2017-10-23 17:59:01 -07003100 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003101 depName := ctx.OtherModuleName(dep)
3102 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003103
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003104 if _, ok := skipModuleList[depName]; ok {
3105 // skip this module because original module or API imported module matching with this should be used instead.
3106 return
3107 }
3108
Dan Willemsen47450072021-10-19 20:24:49 -07003109 if depTag == android.DarwinUniversalVariantTag {
3110 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3111 return
3112 }
3113
Vinh Tran367d89d2023-04-28 11:21:25 -04003114 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003115 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003116 depPaths.AidlLibraryInfos = append(
3117 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003118 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003119 )
3120 }
3121 }
3122
Ivan Lozano52767be2019-10-18 14:49:46 -07003123 ccDep, ok := dep.(LinkableInterface)
3124 if !ok {
3125
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003126 // handling for a few module types that aren't cc Module but that are also supported
3127 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003128 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003129 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003130 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3131 genRule.GeneratedSourceFiles()...)
3132 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003133 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003134 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003135 // Support exported headers from a generated_sources dependency
3136 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003137 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003138 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003139 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003140 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003141 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003142 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003143 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003144 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003145 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3146 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003147 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003148 // 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 +09003149 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003150
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003151 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003152 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003153 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003154 }
Colin Crosscef792e2021-06-11 18:01:26 -07003155 case CrtBeginDepTag:
3156 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3157 case CrtEndDepTag:
3158 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003159 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003160 return
3161 }
3162
Colin Crossfe17f6f2019-03-28 19:30:56 -07003163 if depTag == android.ProtoPluginDepTag {
3164 return
3165 }
3166
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003167 if depTag == android.RequiredDepTag {
3168 return
3169 }
3170
Colin Crossd11fcda2017-10-23 17:59:01 -07003171 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003172 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3173 return
3174 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003175 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003176 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3177 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003178 return
3179 }
3180
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003181 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003182 // Skip reused objects for stub libraries, they use their own stub object file instead.
3183 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3184 // version mutator, so the stubs variant is created from the shared variant that
3185 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003186 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003187 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003188 objs := staticAnalogue.ReuseObjects
3189 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003190 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003191 reexportExporter(depExporterInfo)
3192 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003193 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003194 }
3195
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003196 if depTag == llndkHeaderLibTag {
3197 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3198 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3199 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3200 }
3201
Colin Cross6e511a92020-07-27 21:26:48 -07003202 linkFile := ccDep.OutputFile()
3203
3204 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3205 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003206 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003207 return
3208 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003209
Jiyong Parke3867542020-12-03 17:28:25 +09003210 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3211 return
3212 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003213 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3214 return
3215 }
Jiyong Parke3867542020-12-03 17:28:25 +09003216
Colin Cross313aa542023-12-13 13:47:44 -08003217 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003218
Colin Cross6e511a92020-07-27 21:26:48 -07003219 var ptr *android.Paths
3220 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003221
Colin Cross6e511a92020-07-27 21:26:48 -07003222 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003223
Colin Cross6e511a92020-07-27 21:26:48 -07003224 switch {
3225 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003226 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003227 if !ctx.Config().AllowMissingDependencies() {
3228 ctx.ModuleErrorf("module %q is not a header library", depName)
3229 } else {
3230 ctx.AddMissingDependencies([]string{depName})
3231 }
3232 return
3233 }
Colin Cross6e511a92020-07-27 21:26:48 -07003234 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003235 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003236 if !ctx.Config().AllowMissingDependencies() {
3237 ctx.ModuleErrorf("module %q is not a shared library", depName)
3238 } else {
3239 ctx.AddMissingDependencies([]string{depName})
3240 }
3241 return
3242 }
Jiyong Parke3867542020-12-03 17:28:25 +09003243
Jiyong Park7d55b612021-06-11 17:22:09 +09003244 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3245 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003246
Jiyong Park1ad8e162020-12-01 23:40:09 +09003247 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3248 // linkFile, depFile, and ptr.
3249 if c.IsStubs() {
3250 break
3251 }
3252
Colin Cross0de8a1e2020-09-18 14:15:30 -07003253 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3254 depFile = sharedLibraryInfo.TableOfContents
3255
Colin Cross6e511a92020-07-27 21:26:48 -07003256 ptr = &depPaths.SharedLibs
3257 switch libDepTag.Order {
3258 case earlyLibraryDependency:
3259 ptr = &depPaths.EarlySharedLibs
3260 depPtr = &depPaths.EarlySharedLibsDeps
3261 case normalLibraryDependency:
3262 ptr = &depPaths.SharedLibs
3263 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003264 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003265 case lateLibraryDependency:
3266 ptr = &depPaths.LateSharedLibs
3267 depPtr = &depPaths.LateSharedLibsDeps
3268 default:
3269 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003270 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003271
3272 case libDepTag.rlib():
3273 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: ccDep.CrateName(), LinkDirs: ccDep.ExportedCrateLinkDirs()}
3274 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
3275 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3276 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3277 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3278
Colin Cross6e511a92020-07-27 21:26:48 -07003279 case libDepTag.static():
Colin Cross313aa542023-12-13 13:47:44 -08003280 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3281 if !isStaticLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003282 if !ctx.Config().AllowMissingDependencies() {
3283 ctx.ModuleErrorf("module %q is not a static library", depName)
3284 } else {
3285 ctx.AddMissingDependencies([]string{depName})
3286 }
3287 return
3288 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003289
3290 // Stubs lib doesn't link to the static lib dependencies. Don't set
3291 // linkFile, depFile, and ptr.
3292 if c.IsStubs() {
3293 break
3294 }
3295
Colin Cross0de8a1e2020-09-18 14:15:30 -07003296 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003297 if libDepTag.wholeStatic {
3298 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003299 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3300 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003301 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003302 // This case normally catches prebuilt static
3303 // libraries, but it can also occur when
3304 // AllowMissingDependencies is on and the
3305 // dependencies has no sources of its own
3306 // but has a whole_static_libs dependency
3307 // on a missing library. We want to depend
3308 // on the .a file so that there is something
3309 // in the dependency tree that contains the
3310 // error rule for the missing transitive
3311 // dependency.
3312 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003313 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003314 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3315 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003316 } else {
3317 switch libDepTag.Order {
3318 case earlyLibraryDependency:
3319 panic(fmt.Errorf("early static libs not suppported"))
3320 case normalLibraryDependency:
3321 // static dependencies will be handled separately so they can be ordered
3322 // using transitive dependencies.
3323 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003324 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003325 case lateLibraryDependency:
3326 ptr = &depPaths.LateStaticLibs
3327 default:
3328 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003329 }
3330 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003331
3332 // We re-export the Rust static_rlibs so rlib dependencies don't need to be redeclared by cc_library_static dependents.
3333 // E.g. libfoo (cc_library_static) depends on libfoo.ffi (a rust_ffi rlib), libbar depending on libfoo shouldn't have to also add libfoo.ffi to static_rlibs.
3334 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3335 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3336
Colin Cross3e5e7782022-06-17 22:17:05 +00003337 if libDepTag.unexportedSymbols {
3338 depPaths.LdFlags = append(depPaths.LdFlags,
3339 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3340 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003341 }
3342
Colin Cross6e511a92020-07-27 21:26:48 -07003343 if libDepTag.static() && !libDepTag.wholeStatic {
3344 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3345 ctx.ModuleErrorf("module %q not a static library", depName)
3346 return
3347 }
Logan Chien43d34c32017-12-20 01:17:32 +08003348
Colin Cross6e511a92020-07-27 21:26:48 -07003349 // When combining coverage files for shared libraries and executables, coverage files
3350 // in static libraries act as if they were whole static libraries. The same goes for
3351 // source based Abi dump files.
3352 if c, ok := ccDep.(*Module); ok {
3353 staticLib := c.linker.(libraryInterface)
3354 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3355 staticLib.objs().coverageFiles...)
3356 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3357 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003358 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003359 // Handle non-CC modules here
3360 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003361 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003362 }
3363 }
3364
Colin Cross6e511a92020-07-27 21:26:48 -07003365 if ptr != nil {
3366 if !linkFile.Valid() {
3367 if !ctx.Config().AllowMissingDependencies() {
3368 ctx.ModuleErrorf("module %q missing output file", depName)
3369 } else {
3370 ctx.AddMissingDependencies([]string{depName})
3371 }
3372 return
3373 }
3374 *ptr = append(*ptr, linkFile.Path())
3375 }
3376
3377 if depPtr != nil {
3378 dep := depFile
3379 if !dep.Valid() {
3380 dep = linkFile
3381 }
3382 *depPtr = append(*depPtr, dep.Path())
3383 }
3384
Colin Cross0de8a1e2020-09-18 14:15:30 -07003385 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3386 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3387 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3388 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003389 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3390
3391 // Only re-export RustRlibDeps for cc static libs
3392 if c.static() {
3393 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3394 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003395
3396 if libDepTag.reexportFlags {
3397 reexportExporter(depExporterInfo)
3398 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3399 // Re-exported shared library headers must be included as well since they can help us with type information
3400 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003401 c.sabi.Properties.ReexportedIncludes = append(
3402 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003403 c.sabi.Properties.ReexportedSystemIncludes = append(
3404 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003405 }
3406
Spandan Das3faa7922024-02-26 19:42:32 +00003407 makeLibName := MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName()) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003408 switch {
3409 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003410 c.Properties.AndroidMkHeaderLibs = append(
3411 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003412 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003413 if lib := moduleLibraryInterface(dep); lib != nil {
3414 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003415 // Add the dependency to the APEX(es) providing the library so that
3416 // m <module> can trigger building the APEXes as well.
Colin Cross313aa542023-12-13 13:47:44 -08003417 depApexInfo, _ := android.OtherModuleProvider(ctx, dep, android.ApexInfoProvider)
Jiyong Parkab50b072021-05-12 17:13:56 +09003418 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003419 c.Properties.ApexesProvidingSharedLibs = append(
3420 c.Properties.ApexesProvidingSharedLibs, an)
3421 }
3422 }
3423 }
3424
3425 // Note: the order of libs in this list is not important because
3426 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003427 c.Properties.AndroidMkSharedLibs = append(
3428 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003429 case libDepTag.static():
3430 if libDepTag.wholeStatic {
3431 c.Properties.AndroidMkWholeStaticLibs = append(
3432 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3433 } else {
3434 c.Properties.AndroidMkStaticLibs = append(
3435 c.Properties.AndroidMkStaticLibs, makeLibName)
3436 }
3437 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003438 } else if !c.IsStubs() {
3439 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3440
Colin Cross6e511a92020-07-27 21:26:48 -07003441 switch depTag {
3442 case runtimeDepTag:
3443 c.Properties.AndroidMkRuntimeLibs = append(
Spandan Das3faa7922024-02-26 19:42:32 +00003444 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName())+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003445 case objDepTag:
3446 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3447 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003448 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003449 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003450 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003451 case dynamicLinkerDepTag:
3452 depPaths.DynamicLinker = linkFile
3453 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003454 }
Colin Crossca860ac2016-01-04 14:34:37 -08003455 })
3456
Jeff Gaston294356f2017-09-27 17:05:30 -07003457 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003458 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3459 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3460 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003461
Colin Crossdd84e052017-05-17 13:44:16 -07003462 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003463 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003464 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3465 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003466 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003467 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3468
Jiyong Park74955042019-10-22 20:19:51 +09003469 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3470 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003471 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003472 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003473 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003474 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003475
3476 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003477 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003478 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003479 }
Colin Crossdd84e052017-05-17 13:44:16 -07003480
Colin Crossca860ac2016-01-04 14:34:37 -08003481 return depPaths
3482}
3483
Spandan Das604f3762023-03-16 22:51:40 +00003484func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003485 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003486 thisModule, ok := ctx.Module().(android.ApexModule)
3487 if !ok {
3488 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3489 }
3490
Kiyoung Kimaa394802024-01-08 12:55:45 +09003491 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003492 bootstrap := false
3493 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3494 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3495 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003496 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003497 bootstrap = linkable.Bootstrap()
3498 }
3499
Colin Crossff694a82023-12-13 15:54:49 -08003500 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003501
3502 useStubs := false
3503
Kiyoung Kimaa394802024-01-08 12:55:45 +09003504 if lib := moduleLibraryInterface(dep); lib.buildStubs() && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003505 if !apexInfo.IsForPlatform() {
3506 // For platform libraries, use current version of LLNDK
3507 // If this is for use_vendor apex we will apply the same rules
3508 // of apex sdk enforcement below to choose right version.
3509 useStubs = true
3510 }
3511 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3512 // If not building for APEX or the containing APEX allows the use of
3513 // platform APIs, use stubs only when it is from an APEX (and not from
3514 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3515 // bootstrap modules, always link to non-stub variant
3516 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3517
3518 isApexImportedApiLibrary := false
3519
3520 if cc, ok := dep.(*Module); ok {
3521 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3522 if apiLibrary.hasApexStubs() {
3523 isApexImportedApiLibrary = true
3524 }
3525 }
3526 }
3527
3528 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3529
3530 if useStubs {
3531 // Another exception: if this module is a test for an APEX, then
3532 // it is linked with the non-stub variant of a module in the APEX
3533 // as if this is part of the APEX.
Colin Crossff694a82023-12-13 15:54:49 -08003534 testFor, _ := android.ModuleProvider(ctx, android.ApexTestForInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003535 for _, apexContents := range testFor.ApexContents {
3536 if apexContents.DirectlyInApex(depName) {
3537 useStubs = false
3538 break
3539 }
3540 }
3541 }
3542 if useStubs {
3543 // Yet another exception: If this module and the dependency are
3544 // available to the same APEXes then skip stubs between their
3545 // platform variants. This complements the test_for case above,
3546 // which avoids the stubs on a direct APEX library dependency, by
3547 // avoiding stubs for indirect test dependencies as well.
3548 //
3549 // TODO(b/183882457): This doesn't work if the two libraries have
3550 // only partially overlapping apex_available. For that test_for
3551 // modules would need to be split into APEX variants and resolved
3552 // separately for each APEX they have access to.
3553 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3554 useStubs = false
3555 }
3556 }
3557 } else {
3558 // If building for APEX, use stubs when the parent is in any APEX that
3559 // the child is not in.
3560 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3561 }
3562
3563 return useStubs
3564}
3565
3566// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3567// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3568// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3569// has different level of updatability. For example, if a library foo in an APEX depends on a
3570// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3571// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3572// same APEX as foo, the non-stub variant of bar is used.
3573func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3574 depTag := ctx.OtherModuleDependencyTag(dep)
3575 libDepTag, ok := depTag.(libraryDependencyTag)
3576 if !ok || !libDepTag.shared() {
3577 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3578 }
3579
Colin Cross313aa542023-12-13 13:47:44 -08003580 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3581 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3582 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003583
3584 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003585 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003586 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003587 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3588 toUse := stubs[len(stubs)-1]
3589 sharedLibraryInfo = toUse.SharedLibraryInfo
3590 depExporterInfo = toUse.FlagExporterInfo
3591 }
3592 }
3593 return sharedLibraryInfo, depExporterInfo
3594}
3595
Colin Cross0de8a1e2020-09-18 14:15:30 -07003596// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3597// to match the topological order of the dependency tree, including any static analogues of
3598// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3599// of the transitive dependencies.
Colin Crossc85750b2022-04-21 12:50:51 -07003600func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet[android.Path]) {
3601 transitiveStaticLibsBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003602 var staticPaths android.Paths
3603 for _, staticDep := range staticDeps {
3604 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3605 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3606 }
3607 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003608 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3609 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003610 }
3611 }
3612 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3613
3614 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3615
3616 // reorder the dependencies based on transitive dependencies
3617 staticPaths = android.FirstUniquePaths(staticPaths)
3618 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3619
3620 if len(orderedStaticPaths) != len(staticPaths) {
3621 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3622 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3623 }
3624
3625 return orderedStaticPaths, transitiveStaticLibs
3626}
3627
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003628// BaseLibName trims known prefixes and suffixes
3629func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003630 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3631 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003632 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003633 return libName
3634}
3635
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003636func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003637 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003638 ccDepModule, _ := ccDep.(*Module)
3639 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003640 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003641
Justin Yuncbca3732021-02-03 19:24:13 +09003642 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003643 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003644 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003645 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003646
Ivan Lozanod1dec542021-05-26 15:33:11 -04003647 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003648 }
3649 }
3650
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003651 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3652 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003653 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3654 // core module instead.
3655 return libName
Kiyoung Kimaa394802024-01-08 12:55:45 +09003656 } else if ccDep.InVendorOrProduct() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003657 // The vendor and product modules in Make will have been renamed to not conflict with the
3658 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003659 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003660 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003661 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003662 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003663 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003664 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003665 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003666 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003667 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003668 } else {
3669 return libName
3670 }
3671}
3672
Colin Crossca860ac2016-01-04 14:34:37 -08003673func (c *Module) InstallInData() bool {
3674 if c.installer == nil {
3675 return false
3676 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003677 return c.installer.inData()
3678}
3679
3680func (c *Module) InstallInSanitizerDir() bool {
3681 if c.installer == nil {
3682 return false
3683 }
3684 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003685 return true
3686 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003687 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003688}
3689
Yifan Hong1b3348d2020-01-21 15:53:22 -08003690func (c *Module) InstallInRamdisk() bool {
3691 return c.InRamdisk()
3692}
3693
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003694func (c *Module) InstallInVendorRamdisk() bool {
3695 return c.InVendorRamdisk()
3696}
3697
Jiyong Parkf9332f12018-02-01 00:54:12 +09003698func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003699 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003700}
3701
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003702func (c *Module) MakeUninstallable() {
3703 if c.installer == nil {
3704 c.ModuleBase.MakeUninstallable()
3705 return
3706 }
3707 c.installer.makeUninstallable(c)
3708}
3709
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003710func (c *Module) HostToolPath() android.OptionalPath {
3711 if c.installer == nil {
3712 return android.OptionalPath{}
3713 }
3714 return c.installer.hostToolPath()
3715}
3716
Nan Zhangd4e641b2017-07-12 12:55:28 -07003717func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3718 return c.outputFile
3719}
3720
Colin Cross41955e82019-05-29 14:40:35 -07003721func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3722 switch tag {
3723 case "":
3724 if c.outputFile.Valid() {
3725 return android.Paths{c.outputFile.Path()}, nil
3726 }
3727 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003728 case "unstripped":
3729 if c.linker != nil {
3730 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3731 }
3732 return nil, nil
Wei Li5f5d2712023-12-11 15:40:29 -08003733 case "stripped_all":
3734 if c.linker != nil {
3735 return android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), nil
3736 }
3737 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003738 default:
3739 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003740 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003741}
3742
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003743func (c *Module) static() bool {
3744 if static, ok := c.linker.(interface {
3745 static() bool
3746 }); ok {
3747 return static.static()
3748 }
3749 return false
3750}
3751
Jiyong Park379de2f2018-12-19 02:47:14 +09003752func (c *Module) staticBinary() bool {
3753 if static, ok := c.linker.(interface {
3754 staticBinary() bool
3755 }); ok {
3756 return static.staticBinary()
3757 }
3758 return false
3759}
3760
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003761func (c *Module) testBinary() bool {
3762 if test, ok := c.linker.(interface {
3763 testBinary() bool
3764 }); ok {
3765 return test.testBinary()
3766 }
3767 return false
3768}
3769
Jingwen Chen537242c2022-08-24 11:53:27 +00003770func (c *Module) testLibrary() bool {
3771 if test, ok := c.linker.(interface {
3772 testLibrary() bool
3773 }); ok {
3774 return test.testLibrary()
3775 }
3776 return false
3777}
3778
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003779func (c *Module) benchmarkBinary() bool {
3780 if b, ok := c.linker.(interface {
3781 benchmarkBinary() bool
3782 }); ok {
3783 return b.benchmarkBinary()
3784 }
3785 return false
3786}
3787
3788func (c *Module) fuzzBinary() bool {
3789 if f, ok := c.linker.(interface {
3790 fuzzBinary() bool
3791 }); ok {
3792 return f.fuzzBinary()
3793 }
3794 return false
3795}
3796
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003797// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3798func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003799 if h, ok := c.linker.(interface {
3800 header() bool
3801 }); ok {
3802 return h.header()
3803 }
3804 return false
3805}
3806
Ivan Lozanod7586b62021-04-01 09:49:36 -04003807func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003808 if b, ok := c.linker.(interface {
3809 binary() bool
3810 }); ok {
3811 return b.binary()
3812 }
3813 return false
3814}
3815
Justin Yun5e035862021-06-29 20:50:37 +09003816func (c *Module) StaticExecutable() bool {
3817 if b, ok := c.linker.(*binaryDecorator); ok {
3818 return b.static()
3819 }
3820 return false
3821}
3822
Ivan Lozanod7586b62021-04-01 09:49:36 -04003823func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003824 if o, ok := c.linker.(interface {
3825 object() bool
3826 }); ok {
3827 return o.object()
3828 }
3829 return false
3830}
3831
Kiyoung Kim37693d02024-04-04 09:56:15 +09003832func (m *Module) Dylib() bool {
3833 return false
3834}
3835
3836func (m *Module) Rlib() bool {
3837 return false
3838}
3839
Ivan Lozanof9e21722020-12-02 09:00:51 -05003840func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003841 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003842 if c.IsLlndk() {
3843 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003844 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003845 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003846 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003847 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003848 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003849 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003850 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003851 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003852 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003853 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003854 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003855 return "native:product"
3856 }
Jooyung Han38002912019-05-16 04:01:54 +09003857 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003858 } else if c.InRamdisk() {
3859 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003860 } else if c.InVendorRamdisk() {
3861 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003862 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003863 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003864 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003865 return "native:ndk:none:none"
3866 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3867 //family, link := getNdkStlFamilyAndLinkType(c)
3868 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003869 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003870 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003871 } else {
3872 return "native:platform"
3873 }
3874}
3875
Jiyong Park9d452992018-10-03 00:38:19 +09003876// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003877// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003878func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003879 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003880 // Stub libs and prebuilt libs in a versioned SDK are not
3881 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003882 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003883 } else if _, ok := c.linker.(testPerSrc); ok {
3884 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003885 }
3886 return false
3887}
3888
Jiyong Parka90ca002019-10-07 15:47:24 +09003889func (c *Module) AvailableFor(what string) bool {
3890 if linker, ok := c.linker.(interface {
3891 availableFor(string) bool
3892 }); ok {
3893 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3894 } else {
3895 return c.ApexModuleBase.AvailableFor(what)
3896 }
3897}
3898
Jiyong Park62304bb2020-04-13 16:19:48 +09003899func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003900 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003901}
3902
Paul Duffin0cb37b92020-03-04 14:52:46 +00003903func (c *Module) EverInstallable() bool {
3904 return c.installer != nil &&
3905 // Check to see whether the module is actually ever installable.
3906 c.installer.everInstallable()
3907}
3908
Ivan Lozanod7586b62021-04-01 09:49:36 -04003909func (c *Module) PreventInstall() bool {
3910 return c.Properties.PreventInstall
3911}
3912
3913func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003914 if c.library != nil {
3915 if i := c.library.installable(); i != nil {
3916 return i
3917 }
3918 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003919 return c.Properties.Installable
3920}
3921
3922func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003923 ret := c.EverInstallable() &&
3924 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003925 proptools.BoolDefault(c.Installable(), true) &&
3926 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003927
3928 // The platform variant doesn't need further condition. Apex variants however might not
3929 // be installable because it will likely to be included in the APEX and won't appear
3930 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003931 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003932 return ret
3933 }
3934
3935 // Special case for modules that are configured to be installed to /data, which includes
3936 // test modules. For these modules, both APEX and non-APEX variants are considered as
3937 // installable. This is because even the APEX variants won't be included in the APEX, but
3938 // will anyway be installed to /data/*.
3939 // See b/146995717
3940 if c.InstallInData() {
3941 return ret
3942 }
3943
3944 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003945}
3946
Logan Chien41eabe62019-04-10 13:33:58 +08003947func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3948 if c.linker != nil {
3949 if library, ok := c.linker.(*libraryDecorator); ok {
3950 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3951 }
3952 }
3953}
3954
Jiyong Park45bf82e2020-12-15 22:29:02 +09003955var _ android.ApexModule = (*Module)(nil)
3956
3957// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003958func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07003959 depTag := ctx.OtherModuleDependencyTag(dep)
3960 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3961
3962 if cc, ok := dep.(*Module); ok {
3963 if cc.HasStubsVariants() {
3964 if isLibDepTag && libDepTag.shared() {
3965 // dynamic dep to a stubs lib crosses APEX boundary
3966 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003967 }
Colin Cross6e511a92020-07-27 21:26:48 -07003968 if IsRuntimeDepTag(depTag) {
3969 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09003970 return false
3971 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003972 }
Zhijun Heec285872021-04-24 10:47:08 -07003973 if cc.IsLlndk() {
3974 return false
3975 }
Colin Crossaac32222020-07-29 12:51:56 -07003976 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07003977 // shared_lib dependency from a static lib is considered as crossing
3978 // the APEX boundary because the dependency doesn't actually is
3979 // linked; the dependency is used only during the compilation phase.
3980 return false
3981 }
Jiyong Parke3867542020-12-03 17:28:25 +09003982
3983 if isLibDepTag && libDepTag.excludeInApex {
3984 return false
3985 }
Colin Cross6e511a92020-07-27 21:26:48 -07003986 }
Colin Crossc1b36442021-05-06 13:42:48 -07003987 if depTag == stubImplDepTag {
3988 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003989 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003990 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003991 if depTag == staticVariantTag {
3992 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3993 // actually mean that the static lib (and its dependencies) are copied into the
3994 // APEX.
3995 return false
3996 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003997 return true
3998}
3999
Jiyong Park45bf82e2020-12-15 22:29:02 +09004000// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07004001func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
4002 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09004003 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4004 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
4005 return nil
4006 }
Jooyung Han749dc692020-04-15 11:03:39 +09004007 // We don't check for prebuilt modules
4008 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4009 return nil
4010 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004011
Jooyung Han749dc692020-04-15 11:03:39 +09004012 minSdkVersion := c.MinSdkVersion()
4013 if minSdkVersion == "apex_inherit" {
4014 return nil
4015 }
4016 if minSdkVersion == "" {
4017 // JNI libs within APK-in-APEX fall into here
4018 // Those are okay to set sdk_version instead
4019 // We don't have to check if this is a SDK variant because
4020 // non-SDK variant resets sdk_version, which works too.
4021 minSdkVersion = c.SdkVersion()
4022 }
Dan Albertc8060532020-07-22 22:32:17 -07004023 if minSdkVersion == "" {
4024 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4025 }
4026 // Not using nativeApiLevelFromUser because the context here is not
4027 // necessarily a native context.
4028 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004029 if err != nil {
4030 return err
4031 }
Dan Albertc8060532020-07-22 22:32:17 -07004032
Colin Cross8ca61c12022-10-06 21:00:14 -07004033 // A dependency only needs to support a min_sdk_version at least
4034 // as high as the api level that the architecture was introduced in.
4035 // This allows introducing new architectures in the platform that
4036 // need to be included in apexes that normally require an older
4037 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004038 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004039 if sdkVersion.LessThan(minApiForArch) {
4040 sdkVersion = minApiForArch
4041 }
4042
Dan Albertc8060532020-07-22 22:32:17 -07004043 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004044 return fmt.Errorf("newer SDK(%v)", ver)
4045 }
4046 return nil
4047}
4048
Paul Duffinb5769c12021-05-12 16:16:51 +01004049// Implements android.ApexModule
4050func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4051 // stub libraries and native bridge libraries are always available to platform
4052 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4053}
4054
Jooyung Han91f92032022-02-04 12:36:33 +09004055// Overrides android.ApexModuleBase.UniqueApexVariations
4056func (c *Module) UniqueApexVariations() bool {
4057 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
4058 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
4059 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09004060 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09004061 return c.UseVndk() && c.IsVndk()
4062}
4063
Inseob Kima1888ce2022-10-04 14:42:02 +09004064func (c *Module) overriddenModules() []string {
4065 if o, ok := c.linker.(overridable); ok {
4066 return o.overriddenModules()
4067 }
4068 return nil
4069}
4070
Liz Kammer35ca77e2021-12-22 15:31:40 -05004071type moduleType int
4072
4073const (
4074 unknownType moduleType = iota
4075 binary
4076 object
4077 fullLibrary
4078 staticLibrary
4079 sharedLibrary
4080 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004081 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004082 ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004083 ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004084)
4085
4086func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004087 if c.testBinary() {
4088 // testBinary is also a binary, so this comes before the c.Binary()
4089 // conditional. A testBinary has additional implicit dependencies and
4090 // other test-only semantics.
4091 return testBin
4092 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004093 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004094 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004095 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004096 } else if c.testLibrary() {
4097 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4098 // will let them add implicit compile deps on gtest, for example.
4099 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004100 // For now, treat them as regular libraries.
4101 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004102 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004103 static := false
4104 shared := false
4105 if library, ok := c.linker.(*libraryDecorator); ok {
4106 static = library.MutatedProperties.BuildStatic
4107 shared = library.MutatedProperties.BuildShared
4108 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4109 static = library.MutatedProperties.BuildStatic
4110 shared = library.MutatedProperties.BuildShared
4111 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004112 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004113 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004114 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004115 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004116 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004117 return staticLibrary
4118 }
4119 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004120 } else if c.isNDKStubLibrary() {
4121 return ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004122 } else if c.IsNdkPrebuiltStl() {
4123 return ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004124 }
4125 return unknownType
4126}
4127
Colin Crosscfad1192015-11-02 16:43:11 -08004128// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004129type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004130 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004131 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004132 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004133}
4134
Patrice Arrudac249c712019-03-19 17:00:29 -07004135// cc_defaults provides a set of properties that can be inherited by other cc
4136// modules. A module can use the properties from a cc_defaults using
4137// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4138// merged (when possible) by prepending the default module's values to the
4139// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004140func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004141 return DefaultsFactory()
4142}
4143
Colin Cross36242852017-06-23 15:06:31 -07004144func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004145 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004146
Colin Cross36242852017-06-23 15:06:31 -07004147 module.AddProperties(props...)
4148 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004149 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004150 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004151 &BaseCompilerProperties{},
4152 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004153 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004154 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004155 &StaticProperties{},
4156 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004157 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004158 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004159 &TestLinkerProperties{},
4160 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004161 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004162 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004163 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004164 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004165 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004166 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004167 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004168 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004169 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004170 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004171 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004172 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004173 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004174 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004175 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004176 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4177 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004178 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004179 )
Colin Crosscfad1192015-11-02 16:43:11 -08004180
Jooyung Hancc372c52019-09-25 15:18:44 +09004181 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004182
4183 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004184}
4185
Jiyong Park2286afd2020-06-16 21:58:53 +09004186func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004187 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004188}
4189
Kiyoung Kim51279d32022-08-24 14:10:46 +09004190func (c *Module) isImportedApiLibrary() bool {
4191 _, ok := c.linker.(*apiLibraryDecorator)
4192 return ok
4193}
4194
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004195func kytheExtractAllFactory() android.Singleton {
4196 return &kytheExtractAllSingleton{}
4197}
4198
4199type kytheExtractAllSingleton struct {
4200}
4201
4202func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4203 var xrefTargets android.Paths
4204 ctx.VisitAllModules(func(module android.Module) {
4205 if ccModule, ok := module.(xref); ok {
4206 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4207 }
4208 })
4209 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4210 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004211 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004212 }
4213}
4214
Jihoon Kangf78a8902022-09-01 22:47:07 +00004215func (c *Module) Partition() string {
4216 if p, ok := c.installer.(interface {
4217 getPartition() string
4218 }); ok {
4219 return p.getPartition()
4220 }
4221 return ""
4222}
4223
Spandan Das2b6dfb52024-01-19 00:22:22 +00004224type sourceModuleName interface {
4225 sourceModuleName() string
4226}
4227
4228func (c *Module) BaseModuleName() string {
4229 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4230 // if the prebuilt module sets a source_module_name in Android.bp, use that
4231 return smn.sourceModuleName()
4232 }
4233 return c.ModuleBase.BaseModuleName()
4234}
4235
Colin Cross06a931b2015-10-28 17:23:31 -07004236var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004237var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004238var BoolPtr = proptools.BoolPtr
4239var String = proptools.String
4240var StringPtr = proptools.StringPtr