blob: f800dc0a04e2afb131786633c537e8c1657e1346 [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"
Chris Parsons39a16972023-06-08 14:28:51 +000028 "android/soong/ui/metrics/bp2build_metrics_proto"
Liz Kammer1cec9d12023-06-22 10:09:47 -040029
Colin Cross97ba0732015-03-23 17:50:24 -070030 "github.com/google/blueprint"
Colin Cross06a931b2015-10-28 17:23:31 -070031 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070032
Yu Liueae7b362023-11-16 17:05:47 -080033 "android/soong/aconfig"
Vinh Tran367d89d2023-04-28 11:21:25 -040034 "android/soong/aidl_library"
Colin Cross635c3b02016-05-18 15:37:25 -070035 "android/soong/android"
Sam Delmerico5fb794a2023-01-27 16:01:37 -050036 "android/soong/bazel/cquery"
Colin Crossb98c8b02016-07-29 13:44:28 -070037 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070038 "android/soong/fuzz"
Colin Cross5049f022015-03-18 13:28:46 -070039 "android/soong/genrule"
Kiyoung Kim487689e2022-07-26 09:48:22 +090040 "android/soong/multitree"
Rob Seymour925aa092021-08-10 20:42:03 +000041 "android/soong/snapshot"
Colin Cross3f40fa42015-01-30 17:27:36 -080042)
43
Colin Cross463a90e2015-06-17 14:20:06 -070044func init() {
Paul Duffin036e7002019-12-19 19:16:28 +000045 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -070046
Inseob Kim3b244062023-07-11 13:31:36 +090047 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +000048 pctx.Import("android/soong/cc/config")
49}
50
51func RegisterCCBuildComponents(ctx android.RegistrationContext) {
52 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
53
54 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossc511bc52020-04-07 16:50:32 +000055 ctx.BottomUp("sdk", sdkMutator).Parallel()
Inseob Kim64c43952019-08-26 16:52:35 +090056 ctx.BottomUp("vndk", VndkMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070057 ctx.BottomUp("link", LinkageMutator).Parallel()
Roland Levillain9b5fde92019-06-28 15:41:19 +010058 ctx.BottomUp("test_per_src", TestPerSrcMutator).Parallel()
Colin Crossd1f898e2020-08-18 18:35:15 -070059 ctx.BottomUp("version", versionMutator).Parallel()
Colin Crosse40b4ea2018-10-02 22:25:58 -070060 ctx.BottomUp("begin", BeginMutator).Parallel()
Vinh Tran44cb78c2023-03-09 22:07:19 -050061 ctx.BottomUp("fdo_profile", fdoProfileMutator)
Colin Cross1e676be2016-10-12 14:38:15 -070062 })
Colin Cross16b23492016-01-06 14:41:07 -080063
Paul Duffin036e7002019-12-19 19:16:28 +000064 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -040065 for _, san := range Sanitizers {
66 san.registerMutators(ctx)
67 }
Dan Willemsen581341d2017-02-09 16:16:31 -080068
Colin Cross0b908332019-06-19 23:00:20 -070069 ctx.TopDown("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel()
Jiyong Park379de2f2018-12-19 02:47:14 +090070 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel()
Ivan Lozano30c5db22018-02-21 15:49:20 -080071
Cory Barkera1da26f2022-06-07 20:12:06 +000072 ctx.TopDown("fuzz_deps", fuzzMutatorDeps)
Cory Barkera1da26f2022-06-07 20:12:06 +000073
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -080074 ctx.BottomUp("coverage", coverageMutator).Parallel()
Stephen Craneba090d12017-05-09 15:44:35 -070075
Yi Kongeb8efc92021-12-09 18:06:29 +080076 ctx.TopDown("afdo_deps", afdoDepsMutator)
77 ctx.BottomUp("afdo", afdoMutator).Parallel()
78
Sharjeel Khanc6a93d82023-07-18 21:01:11 +000079 ctx.TopDown("orderfile_deps", orderfileDepsMutator)
80 ctx.BottomUp("orderfile", orderfileMutator).Parallel()
81
Stephen Craneba090d12017-05-09 15:44:35 -070082 ctx.TopDown("lto_deps", ltoDepsMutator)
83 ctx.BottomUp("lto", ltoMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090084
Jooyung Han479ca172020-10-19 18:51:07 +090085 ctx.BottomUp("check_linktype", checkLinkTypeMutator).Parallel()
Jooyung Hana70f0672019-01-18 15:20:43 +090086 ctx.TopDown("double_loadable", checkDoubleLoadableLibraries).Parallel()
Colin Cross1e676be2016-10-12 14:38:15 -070087 })
Colin Crossb98c8b02016-07-29 13:44:28 -070088
Yo Chiang8aa4e3f2020-11-19 16:30:49 +080089 ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
90 // sabi mutator needs to be run after apex mutator finishes.
91 ctx.TopDown("sabi_deps", sabiDepsMutator)
92 })
93
LaMont Jones0c10e4d2023-05-16 00:58:37 +000094 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070095}
96
Chris Parsonsef6e0cf2020-12-01 18:26:21 -050097// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
98// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
99// edges to these modules.
100// This object is constructed in DepsMutator, by calling to various module delegates to set
101// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
102// dependencies.
103// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
104// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800105type Deps struct {
106 SharedLibs, LateSharedLibs []string
107 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800108 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800109 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700110
Colin Cross3e5e7782022-06-17 22:17:05 +0000111 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
112 // prevent automatically exporting symbols.
113 UnexportedStaticLibs []string
114
Chris Parsons79d66a52020-06-05 17:26:16 -0400115 // Used for data dependencies adjacent to tests
116 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700117 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400118
Yo Chiang219968c2020-09-22 18:45:04 +0800119 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
120 SystemSharedLibs []string
121
Vinh Tran367d89d2023-04-28 11:21:25 -0400122 // Used by DepMutator to pass aidl_library modules to aidl compiler
123 AidlLibs []string
124
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500125 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800126 StaticUnwinderIfLegacy bool
127
Colin Cross5950f382016-12-13 12:50:57 -0800128 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700129
Colin Cross81413472016-04-11 14:37:39 -0700130 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700131
Dan Willemsenb40aab62016-04-20 14:21:14 -0700132 GeneratedSources []string
133 GeneratedHeaders []string
Inseob Kimd110f872019-12-06 13:15:38 +0900134 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700135
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700136 ReexportGeneratedHeaders []string
137
Colin Crossc465efd2021-06-11 18:00:04 -0700138 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700139
140 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700141 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900142
143 // List of libs that need to be excluded for APEX variant
144 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900145 // List of libs that need to be excluded for non-APEX variant
146 ExcludeLibsForNonApex []string
Colin Crossc472d572015-03-17 15:06:21 -0700147}
148
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500149// PathDeps is a struct containing file paths to dependencies of a module.
150// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
151// It's used to construct flags for various build statements (such as for compiling and linking).
152// It is then passed to module decorator functions responsible for registering build statements
153// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800154type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700155 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900156 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700157 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900158 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700159 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700160 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700161
Colin Cross0de8a1e2020-09-18 14:15:30 -0700162 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossc85750b2022-04-21 12:50:51 -0700163 TranstiveStaticLibrariesForOrdering *android.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700164
Colin Cross26c34ed2016-09-30 17:10:16 -0700165 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100166 Objs Objects
167 // Paths to .o files in dependencies that provide them. Note that these lists
168 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800169 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700170 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700171
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100172 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
173 // the libs from all whole_static_lib dependencies.
174 WholeStaticLibsFromPrebuilts android.Paths
175
Colin Cross26c34ed2016-09-30 17:10:16 -0700176 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700177 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900178 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700179
Inseob Kimd110f872019-12-06 13:15:38 +0900180 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000181 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900182 IncludeDirs android.Paths
183 SystemIncludeDirs android.Paths
184 ReexportedDirs android.Paths
185 ReexportedSystemDirs android.Paths
186 ReexportedFlags []string
187 ReexportedGeneratedHeaders android.Paths
188 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700189
Colin Cross26c34ed2016-09-30 17:10:16 -0700190 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700191 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700192
Dan Willemsena0790e32018-10-12 00:24:23 -0700193 // Path to the dynamic linker binary
194 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700195
196 // For Darwin builds, the path to the second architecture's output that should
197 // be combined with this architectures's output into a FAT MachO file.
198 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400199
200 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
201 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700202}
203
Colin Cross4af21ed2019-11-04 09:37:55 -0800204// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
205// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
206// command line so they can be overridden by the local module flags).
207type LocalOrGlobalFlags struct {
208 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700209 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800210 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700211 CFlags []string // Flags that apply to C and C++ source files
212 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
213 ConlyFlags []string // Flags that apply to C source files
214 CppFlags []string // Flags that apply to C++ source files
215 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700216 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800217}
218
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500219// Flags contains various types of command line flags (and settings) for use in building build
220// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800221type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500222 // Local flags (which individual modules are responsible for). These may override global flags.
223 Local LocalOrGlobalFlags
224 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800225 Global LocalOrGlobalFlags
226
227 aidlFlags []string // Flags that apply to aidl source files
228 rsFlags []string // Flags that apply to renderscript source files
229 libFlags []string // Flags to add libraries early to the link order
230 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
231 TidyFlags []string // Flags that apply to clang-tidy
232 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700233
Colin Crossc3199482017-03-30 15:03:04 -0700234 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800235 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700236 SystemIncludeFlags []string
237
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800238 Toolchain config.Toolchain
239 Tidy bool // True if ninja .tidy rules should be generated.
240 NeedTidyFiles bool // True if module link should depend on .tidy files
241 GcovCoverage bool // True if coverage files should be generated.
242 SAbiDump bool // True if header abi dumps should be generated.
243 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800244
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500245 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800246 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500247 // The target-device system path to the dynamic linker.
248 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800249
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700250 CFlagsDeps android.Paths // Files depended on by compiler flags
251 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800252
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500253 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700254 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800255
Colin Cross19878da2019-03-28 14:45:07 -0700256 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700257 protoC bool // Whether to use C instead of C++
258 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700259
260 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200261 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700262}
263
Colin Crossca860ac2016-01-04 14:34:37 -0800264// Properties used to compile all C or C++ modules
265type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700266 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800267 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700268
Jiyong Parkb35a8192020-08-10 15:59:36 +0900269 // The API level that this module is built against. The APIs of this API level will be
270 // visible at build time, but use of any APIs newer than min_sdk_version will render the
271 // module unloadable on older devices. In the future it will be possible to weakly-link new
272 // APIs, making the behavior match Java: such modules will load on older devices, but
273 // calling new APIs on devices that do not support them will result in a crash.
274 //
275 // This property has the same behavior as sdk_version does for Java modules. For those
276 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
277 // does for Java code.
278 //
279 // In addition, setting this property causes two variants to be built, one for the platform
280 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800281 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700282
Jiyong Parkb35a8192020-08-10 15:59:36 +0900283 // Minimum OS API level supported by this C or C++ module. This property becomes the value
284 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
285 // this property is also used to ensure that the min_sdk_version of the containing module is
286 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
287 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
288 // min_sdk_version of the containing APEX. When the module
289 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900290 Min_sdk_version *string
291
Colin Crossc511bc52020-04-07 16:50:32 +0000292 // If true, always create an sdk variant and don't create a platform variant.
293 Sdk_variant_only *bool
294
Jiyong Parkde866cb2018-12-07 23:08:36 +0900295 AndroidMkSharedLibs []string `blueprint:"mutated"`
296 AndroidMkStaticLibs []string `blueprint:"mutated"`
297 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
298 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700299 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900300 HideFromMake bool `blueprint:"mutated"`
301 PreventInstall bool `blueprint:"mutated"`
302 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700303
Yo Chiang219968c2020-09-22 18:45:04 +0800304 // Set by DepsMutator.
305 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
306
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200307 // The name of the image this module is built for, suffixed with a '.'
Justin Yun5f7f7e82019-11-18 19:52:14 +0900308 ImageVariationPrefix string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200309
310 // The VNDK version this module is built against. If empty, the module is not
311 // build against the VNDK.
312 VndkVersion string `blueprint:"mutated"`
313
314 // Suffix for the name of Android.mk entries generated by this module
315 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800316
317 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
318 // file
319 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900320
Yifan Hong39143a92020-10-26 12:43:12 -0700321 // Make this module available when building for ramdisk.
322 // On device without a dedicated recovery partition, the module is only
323 // available after switching root into
324 // /first_stage_ramdisk. To expose the module before switching root, install
325 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800326 Ramdisk_available *bool
327
Yifan Hong39143a92020-10-26 12:43:12 -0700328 // Make this module available when building for vendor ramdisk.
329 // On device without a dedicated recovery partition, the module is only
330 // available after switching root into
331 // /first_stage_ramdisk. To expose the module before switching root, install
332 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700333 Vendor_ramdisk_available *bool
334
Jiyong Parkf9332f12018-02-01 00:54:12 +0900335 // Make this module available when building for recovery
336 Recovery_available *bool
337
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200338 // Used by imageMutator, set by ImageMutatorBegin()
339 CoreVariantNeeded bool `blueprint:"mutated"`
340 RamdiskVariantNeeded bool `blueprint:"mutated"`
341 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
342 RecoveryVariantNeeded bool `blueprint:"mutated"`
343
344 // A list of variations for the "image" mutator of the form
345 //<image name> '.' <version char>, for example, 'vendor.S'
346 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900347
348 // Allows this module to use non-APEX version of libraries. Useful
349 // for building binaries that are started before APEXes are activated.
350 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900351
352 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
353 // see soong/cc/config/vndk.go
354 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900355
356 // Used by vendor snapshot to record dependencies from snapshot modules.
357 SnapshotSharedLibs []string `blueprint:"mutated"`
Justin Yun5e035862021-06-29 20:50:37 +0900358 SnapshotStaticLibs []string `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900359 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000360
Colin Cross1bc94122021-10-28 13:25:54 -0700361 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000362
363 // Set by factories of module types that can only be referenced from variants compiled against
364 // the SDK.
365 AlwaysSdk bool `blueprint:"mutated"`
366
367 // Variant is an SDK variant created by sdkMutator
368 IsSdkVariant bool `blueprint:"mutated"`
369 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
370 // variant to have a ".sdk" suffix.
371 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700372
373 // Normally Soong uses the directory structure to decide which modules
374 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800375 // different snapshots (vendor, recovery, etc.), but this property
376 // allows a partner to exclude a module normally thought of as a
377 // framework module from the vendor snapshot.
378 Exclude_from_vendor_snapshot *bool
379
380 // Normally Soong uses the directory structure to decide which modules
381 // should be included (framework) or excluded (non-framework) from the
382 // different snapshots (vendor, recovery, etc.), but this property
383 // allows a partner to exclude a module normally thought of as a
384 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800385 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900386
387 // List of APEXes that this module has private access to for testing purpose. The module
388 // can depend on libraries that are not exported by the APEXes and use private symbols
389 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000390 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800391
392 Target struct {
393 Platform struct {
394 // List of modules required by the core variant.
395 Required []string `android:"arch_variant"`
396
397 // List of modules not required by the core variant.
398 Exclude_required []string `android:"arch_variant"`
399 } `android:"arch_variant"`
400
401 Recovery struct {
402 // List of modules required by the recovery variant.
403 Required []string `android:"arch_variant"`
404
405 // List of modules not required by the recovery variant.
406 Exclude_required []string `android:"arch_variant"`
407 } `android:"arch_variant"`
408 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700409}
410
411type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900412 // whether this module should be allowed to be directly depended by other
413 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900414 // If set to true, two variants will be built separately, one like
415 // normal, and the other limited to the set of libraries and headers
416 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700417 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900418 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700419 // so it shouldn't have any unversioned runtime dependencies, or
420 // make assumptions about the system that may not be true in the
421 // future.
422 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900423 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900424 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900425 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900426 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900427 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700428 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
429 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900430
Justin Yunebcf0c52021-01-08 18:00:19 +0900431 // This is the same as the "vendor_available" except that the install path
432 // of the vendor variant is /odm or /vendor/odm.
433 // By replacing "vendor_available: true" with "odm_available: true", the
434 // module will install its vendor variant to the /odm partition or /vendor/odm.
435 // As the modules with "odm_available: true" still create the vendor variants,
436 // they can link to the other vendor modules as the vendor_available modules do.
437 // Also, the vendor modules can link to odm_available modules.
438 //
439 // It may not be used for VNDK modules.
440 Odm_available *bool
441
Justin Yun63e9ec72020-10-29 16:49:43 +0900442 // whether this module should be allowed to be directly depended by other
443 // modules with `product_specific: true` or `product_available: true`.
444 // If set to true, an additional product variant will be built separately
445 // that is limited to the set of libraries and headers that are exposed to
446 // /product modules.
447 //
448 // The product variant may be used with a different (newer) /system,
449 // so it shouldn't have any unversioned runtime dependencies, or
450 // make assumptions about the system that may not be true in the
451 // future.
452 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900453 // If set to false, this module becomes inaccessible from /product modules.
454 //
455 // Different from the 'vendor_available' property, the modules with
456 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
457 // library without 'product_available' may not be depended on by any other
458 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900459 //
460 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
461 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
462 Product_available *bool
463
Jiyong Park5fb8c102018-04-09 12:03:06 +0900464 // whether this module is capable of being loaded with other instance
465 // (possibly an older version) of the same module in the same process.
466 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
467 // can be double loaded in a vendor process if the library is also a
468 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
469 // explicitly marked as `double_loadable: true` by the owner, or the dependency
470 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
471 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800472
473 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
474 IsLLNDK bool `blueprint:"mutated"`
475
Colin Cross78212242021-01-06 14:51:30 -0800476 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
477 // set and the module is not listed in VndkMustUseVendorVariantList.
478 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
479
480 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
481 IsVNDKCore bool `blueprint:"mutated"`
482
483 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
484 IsVNDKSP bool `blueprint:"mutated"`
485
486 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
487 // module sets the llndk.private property.
488 IsVNDKPrivate bool `blueprint:"mutated"`
489
490 // IsVNDKProduct is set if a VNDK module sets the product_available property.
491 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700492
493 // IsVendorPublicLibrary is set for the core and product variants of a library that has
494 // vendor_public_library stubs.
495 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800496}
497
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500498// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
499// to understanding details about the type of the current module.
500// For example, one might call these functions to determine whether the current module is a static
501// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800502type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800503 static() bool
504 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700505 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800506 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900507 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900508 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900509 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700510 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900511 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700512 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800513 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900514 minSdkVersion() string
515 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700516 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700517 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800518 IsLlndk() bool
519 IsLlndkPublic() bool
520 isImplementationForLLNDKPublic() bool
521 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900522 isVndk() bool
523 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500524 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700525 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900526 inProduct() bool
527 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800528 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700529 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900530 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700531 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700532 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800533 getVndkExtendsModuleName() string
Yi Kong4ef54592022-02-14 20:00:10 +0800534 isAfdoCompile() bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000535 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800536 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900537 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800538 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800539 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800540 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700541 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700542 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900543 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800544 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700545 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700546 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800547 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800548 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800549 getSharedFlags() *SharedFlags
550}
551
552type SharedFlags struct {
553 numSharedFlags int
554 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800555}
556
557type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700558 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800559 ModuleContextIntf
560}
561
562type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700563 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800564 ModuleContextIntf
565}
566
Colin Cross37047f12016-12-13 17:06:13 -0800567type DepsContext interface {
568 android.BottomUpMutatorContext
569 ModuleContextIntf
570}
571
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500572// feature represents additional (optional) steps to building cc-related modules, such as invocation
573// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800574type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800575 flags(ctx ModuleContext, flags Flags) Flags
576 props() []interface{}
577}
578
Joe Onorato37f900c2023-07-18 16:58:16 -0700579// Information returned from Generator about the source code it's generating
580type GeneratedSource struct {
581 IncludeDirs android.Paths
582 Sources android.Paths
583 Headers android.Paths
584 ReexportedDirs android.Paths
585}
586
587// generator allows injection of generated code
588type Generator interface {
589 GeneratorProps() []interface{}
590 GeneratorInit(ctx BaseModuleContext)
591 GeneratorDeps(ctx DepsContext, deps Deps) Deps
592 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
593 GeneratorSources(ctx ModuleContext) GeneratedSource
594 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
Yu Liuf11b7c32023-10-20 19:15:51 +0000595 GeneratorBp2build(ctx android.Bp2buildMutatorContext, module *Module) bool
Joe Onorato37f900c2023-07-18 16:58:16 -0700596}
597
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500598// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500599// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800600type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700601 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800602 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800603 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700604 compilerProps() []interface{}
605
Colin Cross76fada02016-07-27 10:31:13 -0700606 appendCflags([]string)
607 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700608 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800609}
610
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500611// linker is the interface for a linker decorator object. Individual module types can provide
612// their own implementation for this decorator, and thus specify custom logic regarding build
613// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800614type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700615 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800616 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700617 linkerFlags(ctx ModuleContext, flags Flags) Flags
618 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800619 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700620
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700621 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700622 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900623 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700624
625 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900626 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000627
628 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000629 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
630}
631
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500632// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000633type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500634 sharedLibs []string
635 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
636 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700637 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800638}
639
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500640// installer is the interface for an installer helper object. This helper is responsible for
641// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800642type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700643 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700644 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000645 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800646 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700647 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700648 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900649 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000650 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900651 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800652}
653
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800654type xref interface {
655 XrefCcFiles() android.Paths
656}
657
Inseob Kima1888ce2022-10-04 14:42:02 +0900658type overridable interface {
659 overriddenModules() []string
660}
661
Colin Cross6e511a92020-07-27 21:26:48 -0700662type libraryDependencyKind int
663
664const (
665 headerLibraryDependency = iota
666 sharedLibraryDependency
667 staticLibraryDependency
668)
669
670func (k libraryDependencyKind) String() string {
671 switch k {
672 case headerLibraryDependency:
673 return "headerLibraryDependency"
674 case sharedLibraryDependency:
675 return "sharedLibraryDependency"
676 case staticLibraryDependency:
677 return "staticLibraryDependency"
678 default:
679 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
680 }
681}
682
683type libraryDependencyOrder int
684
685const (
686 earlyLibraryDependency = -1
687 normalLibraryDependency = 0
688 lateLibraryDependency = 1
689)
690
691func (o libraryDependencyOrder) String() string {
692 switch o {
693 case earlyLibraryDependency:
694 return "earlyLibraryDependency"
695 case normalLibraryDependency:
696 return "normalLibraryDependency"
697 case lateLibraryDependency:
698 return "lateLibraryDependency"
699 default:
700 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
701 }
702}
703
704// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
705// tags that have a set of predefined tag objects that are reused for each dependency, a
706// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
707// That means that comparing a libraryDependencyTag for equality will only be equal if all
708// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
709// then check individual metadata fields instead.
710type libraryDependencyTag struct {
711 blueprint.BaseDependencyTag
712
713 // These are exported so that fmt.Printf("%#v") can call their String methods.
714 Kind libraryDependencyKind
715 Order libraryDependencyOrder
716
717 wholeStatic bool
718
719 reexportFlags bool
720 explicitlyVersioned bool
721 dataLib bool
722 ndk bool
723
724 staticUnwinder bool
725
726 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900727
Cindy Zhou18417cb2020-12-10 07:12:38 -0800728 // Whether or not this dependency should skip the apex dependency check
729 skipApexAllowedDependenciesCheck bool
730
Jiyong Parke3867542020-12-03 17:28:25 +0900731 // Whether or not this dependency has to be followed for the apex variants
732 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900733 // Whether or not this dependency has to be followed for the non-apex variants
734 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000735
736 // If true, don't automatically export symbols from the static library into a shared library.
737 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700738}
739
740// header returns true if the libraryDependencyTag is tagging a header lib dependency.
741func (d libraryDependencyTag) header() bool {
742 return d.Kind == headerLibraryDependency
743}
744
745// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
746func (d libraryDependencyTag) shared() bool {
747 return d.Kind == sharedLibraryDependency
748}
749
750// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
751func (d libraryDependencyTag) static() bool {
752 return d.Kind == staticLibraryDependency
753}
754
Colin Cross65cb3142021-12-10 23:05:02 +0000755func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
756 if d.shared() {
757 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
758 }
759 return nil
760}
761
762var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
763
Colin Crosse9fe2942020-11-10 18:12:15 -0800764// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
765// binaries or other shared libraries are installed as dependencies.
766func (d libraryDependencyTag) InstallDepNeeded() bool {
767 return d.shared()
768}
769
770var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
771
772// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700773// libraryDependencyTag. Each tag object is created globally and reused for multiple
774// dependencies (although since the object contains no references, assigning a tag to a
775// variable and modifying it will not modify the original). Users can compare the tag
776// returned by ctx.OtherModuleDependencyTag against the global original
777type dependencyTag struct {
778 blueprint.BaseDependencyTag
779 name string
780}
781
Colin Crosse9fe2942020-11-10 18:12:15 -0800782// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
783// libraryDependencyTag, but where the dependency needs to be installed when the parent is
784// installed.
785type installDependencyTag struct {
786 blueprint.BaseDependencyTag
787 android.InstallAlwaysNeededDependencyTag
788 name string
789}
790
Colin Crossc99deeb2016-04-11 15:06:20 -0700791var (
Colin Cross6e511a92020-07-27 21:26:48 -0700792 genSourceDepTag = dependencyTag{name: "gen source"}
793 genHeaderDepTag = dependencyTag{name: "gen header"}
794 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
795 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900796 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700797 reuseObjTag = dependencyTag{name: "reuse objects"}
798 staticVariantTag = dependencyTag{name: "static variant"}
799 vndkExtDepTag = dependencyTag{name: "vndk extends"}
800 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700801 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800802 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700803 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700804 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000805 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500806 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400807 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700808)
809
Roland Levillainf89cd092019-07-29 16:22:59 +0100810func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700811 ccLibDepTag, ok := depTag.(libraryDependencyTag)
812 return ok && ccLibDepTag.shared()
813}
814
815func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
816 ccLibDepTag, ok := depTag.(libraryDependencyTag)
817 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100818}
819
Zach Johnson3df4e632020-11-06 11:56:27 -0800820func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
821 ccLibDepTag, ok := depTag.(libraryDependencyTag)
822 return ok && ccLibDepTag.header()
823}
824
Roland Levillainf89cd092019-07-29 16:22:59 +0100825func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800826 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100827}
828
829func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700830 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100831 return ok && ccDepTag == testPerSrcDepTag
832}
833
Chris Parsonsf874e462022-05-10 13:50:12 -0400834// bazelHandler is the interface for a helper object related to deferring to Bazel for
835// processing a cc module (during Bazel mixed builds). Individual module types should define
836// their own bazel handler if they support being handled by Bazel.
837type BazelHandler interface {
838 // QueueBazelCall invokes request-queueing functions on the BazelContext
839 //so that these requests are handled when Bazel's cquery is invoked.
840 QueueBazelCall(ctx android.BaseModuleContext, label string)
841
842 // ProcessBazelQueryResponse uses information retrieved from Bazel to set properties
843 // on the current module with given label.
844 ProcessBazelQueryResponse(ctx android.ModuleContext, label string)
845}
846
Colin Crossca860ac2016-01-04 14:34:37 -0800847// Module contains the properties and members used by all C/C++ module types, and implements
848// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500849// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
850// interface.
851//
852// To define a C/C++ related module, construct a new Module object and point its delegates to
853// type-specific structs. These delegates will be invoked to register module-specific build
854// statements which may be unique to the module type. For example, module.compiler.compile() should
855// be defined so as to register build statements which are responsible for compiling the module.
856//
857// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
858// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
859// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
860// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800861type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700862 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700863
Liz Kammerea6666f2021-02-17 10:17:28 -0500864 android.BazelModuleBase
Colin Crossc472d572015-03-17 15:06:21 -0700865
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700866 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700867 Properties BaseProperties
Colin Crossfa138792015-04-24 17:31:52 -0700868
Colin Crossca860ac2016-01-04 14:34:37 -0800869 // initialize before calling Init
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000870 hod android.HostOrDeviceSupported
871 multilib android.Multilib
872 bazelable bool
873 testModule bool
Colin Crossc472d572015-03-17 15:06:21 -0700874
Paul Duffina0843f62019-12-13 19:50:38 +0000875 // Allowable SdkMemberTypes of this module type.
876 sdkMemberTypes []android.SdkMemberType
877
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500878 // decorator delegates, initialize before calling Init
879 // these may contain module-specific implementations, and effectively allow for custom
880 // type-specific logic. These members may reference different objects or the same object.
881 // Functions of these decorators will be invoked to initialize and register type-specific
882 // build statements.
Joe Onorato37f900c2023-07-18 16:58:16 -0700883 generators []Generator
Chris Parsons8d6e4332021-02-22 16:13:50 -0500884 compiler compiler
885 linker linker
886 installer installer
Chris Parsonsf874e462022-05-10 13:50:12 -0400887 bazelHandler BazelHandler
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500888
Spandan Dase12d2522023-09-12 21:42:31 +0000889 features []feature
890 stl *stl
891 sanitize *sanitize
892 coverage *coverage
893 fuzzer *fuzzer
894 sabi *sabi
895 vndkdep *vndkdep
896 lto *lto
897 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000898 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800899
Colin Cross31076b32020-10-23 17:22:06 -0700900 library libraryInterface
901
Colin Cross635c3b02016-05-18 15:37:25 -0700902 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800903
Colin Crossb98c8b02016-07-29 13:44:28 -0700904 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700905
906 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800907
908 // Flags used to compile this module
909 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700910
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800911 // Shared flags among build rules of this module
912 sharedFlags SharedFlags
913
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800914 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700915 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900916
917 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800918 // Kythe (source file indexer) paths for this compilation module
919 kytheFiles android.Paths
Chih-Hung Hsieh80783772021-10-11 16:46:56 -0700920 // Object .o file output paths for this compilation module
921 objFiles android.Paths
922 // Tidy .tidy file output paths for this compilation module
923 tidyFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900924
925 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700926 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700927
928 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -0800929
930 // Aconfig files for all transitive deps. Also exposed via TransitiveDeclarationsInfo
Colin Crossd788b3e2023-11-28 13:14:56 -0800931 mergedAconfigFiles map[string]android.Paths
Colin Crossc472d572015-03-17 15:06:21 -0700932}
933
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200934func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400935 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
936 if b, ok := c.compiler.(*baseCompiler); ok {
937 hasAidl = b.hasSrcExt(".aidl")
938 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
939 hasProto = b.hasSrcExt(".proto")
940 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
941 hasSysprop = b.hasSrcExt(".sysprop")
942 hasWinMsg = b.hasSrcExt(".mc")
943 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
944 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200945 c.AndroidModuleBase().AddJSONData(d)
946 (*d)["Cc"] = map[string]interface{}{
947 "SdkVersion": c.SdkVersion(),
948 "MinSdkVersion": c.MinSdkVersion(),
949 "VndkVersion": c.VndkVersion(),
950 "ProductSpecific": c.ProductSpecific(),
951 "SocSpecific": c.SocSpecific(),
952 "DeviceSpecific": c.DeviceSpecific(),
953 "InProduct": c.InProduct(),
954 "InVendor": c.InVendor(),
955 "InRamdisk": c.InRamdisk(),
956 "InVendorRamdisk": c.InVendorRamdisk(),
957 "InRecovery": c.InRecovery(),
958 "VendorAvailable": c.VendorAvailable(),
959 "ProductAvailable": c.ProductAvailable(),
960 "RamdiskAvailable": c.RamdiskAvailable(),
961 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
962 "RecoveryAvailable": c.RecoveryAvailable(),
963 "OdmAvailable": c.OdmAvailable(),
964 "InstallInData": c.InstallInData(),
965 "InstallInRamdisk": c.InstallInRamdisk(),
966 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
967 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
968 "InstallInRecovery": c.InstallInRecovery(),
969 "InstallInRoot": c.InstallInRoot(),
970 "IsVndk": c.IsVndk(),
971 "IsVndkExt": c.IsVndkExt(),
972 "IsVndkPrivate": c.IsVndkPrivate(),
973 "IsVndkSp": c.IsVndkSp(),
974 "IsLlndk": c.IsLlndk(),
975 "IsLlndkPublic": c.IsLlndkPublic(),
976 "IsSnapshotLibrary": c.IsSnapshotLibrary(),
977 "IsSnapshotPrebuilt": c.IsSnapshotPrebuilt(),
978 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
979 "ApexSdkVersion": c.apexSdkVersion,
980 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400981 "AidlSrcs": hasAidl,
982 "LexSrcs": hasLex,
983 "ProtoSrcs": hasProto,
984 "RenderscriptSrcs": hasRenderscript,
985 "SyspropSrcs": hasSysprop,
986 "WinMsgSrcs": hasWinMsg,
987 "YaccSrsc": hasYacc,
988 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200989 }
990}
991
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500992func (c *Module) SetPreventInstall() {
993 c.Properties.PreventInstall = true
994}
995
996func (c *Module) SetHideFromMake() {
997 c.Properties.HideFromMake = true
998}
999
Ivan Lozanod7586b62021-04-01 09:49:36 -04001000func (c *Module) HiddenFromMake() bool {
1001 return c.Properties.HideFromMake
1002}
1003
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001004func (c *Module) RequiredModuleNames() []string {
1005 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
1006 if c.ImageVariation().Variation == android.CoreVariation {
1007 required = append(required, c.Properties.Target.Platform.Required...)
1008 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1009 } else if c.InRecovery() {
1010 required = append(required, c.Properties.Target.Recovery.Required...)
1011 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1012 }
1013 return android.FirstUniqueStrings(required)
1014}
1015
Ivan Lozano52767be2019-10-18 14:49:46 -07001016func (c *Module) Toc() android.OptionalPath {
1017 if c.linker != nil {
1018 if library, ok := c.linker.(libraryInterface); ok {
1019 return library.toc()
1020 }
1021 }
1022 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1023}
1024
1025func (c *Module) ApiLevel() string {
1026 if c.linker != nil {
1027 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001028 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001029 }
1030 }
1031 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1032}
1033
1034func (c *Module) Static() bool {
1035 if c.linker != nil {
1036 if library, ok := c.linker.(libraryInterface); ok {
1037 return library.static()
1038 }
1039 }
1040 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1041}
1042
1043func (c *Module) Shared() bool {
1044 if c.linker != nil {
1045 if library, ok := c.linker.(libraryInterface); ok {
1046 return library.shared()
1047 }
1048 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001049
Ivan Lozano52767be2019-10-18 14:49:46 -07001050 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1051}
1052
1053func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001054 if c.stl != nil {
1055 return c.stl.Properties.SelectedStl
1056 }
1057 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001058}
1059
Ivan Lozano52767be2019-10-18 14:49:46 -07001060func (c *Module) NdkPrebuiltStl() bool {
1061 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1062 return true
1063 }
1064 return false
1065}
1066
1067func (c *Module) StubDecorator() bool {
1068 if _, ok := c.linker.(*stubDecorator); ok {
1069 return true
1070 }
1071 return false
1072}
1073
1074func (c *Module) SdkVersion() string {
1075 return String(c.Properties.Sdk_version)
1076}
1077
Artur Satayev480e25b2020-04-27 18:53:18 +01001078func (c *Module) MinSdkVersion() string {
1079 return String(c.Properties.Min_sdk_version)
1080}
1081
Jiyong Park5df7bd32021-08-25 16:18:46 +09001082func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001083 if linker, ok := c.linker.(*objectLinker); ok {
1084 return linker.isCrt()
1085 }
1086 return false
1087}
1088
Jiyong Park5df7bd32021-08-25 16:18:46 +09001089func (c *Module) SplitPerApiLevel() bool {
1090 return c.canUseSdk() && c.isCrt()
1091}
1092
Colin Crossc511bc52020-04-07 16:50:32 +00001093func (c *Module) AlwaysSdk() bool {
1094 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1095}
1096
Ivan Lozano183a3212019-10-18 14:18:45 -07001097func (c *Module) CcLibrary() bool {
1098 if c.linker != nil {
1099 if _, ok := c.linker.(*libraryDecorator); ok {
1100 return true
1101 }
Colin Crossd48fe732020-09-23 20:37:24 -07001102 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1103 return true
1104 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001105 }
1106 return false
1107}
1108
1109func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001110 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001111 return true
1112 }
1113 return false
1114}
1115
Spandan Dase12d2522023-09-12 21:42:31 +00001116func (c *Module) IsNdkPrebuiltStl() bool {
1117 if c.linker == nil {
1118 return false
1119 }
1120 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1121 return true
1122 }
1123 return false
1124}
1125
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001126func (c *Module) RlibStd() bool {
1127 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1128}
1129
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001130func (c *Module) RustLibraryInterface() bool {
1131 return false
1132}
1133
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001134func (c *Module) IsFuzzModule() bool {
1135 if _, ok := c.compiler.(*fuzzBinary); ok {
1136 return true
1137 }
1138 return false
1139}
1140
1141func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1142 return c.FuzzModule
1143}
1144
1145func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1146 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1147 return fuzzer.fuzzPackagedModule
1148 }
1149 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1150}
1151
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001152func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001153 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1154 return fuzzer.sharedLibraries
1155 }
1156 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1157}
1158
Ivan Lozano2b262972019-11-21 12:30:50 -08001159func (c *Module) NonCcVariants() bool {
1160 return false
1161}
1162
Ivan Lozano183a3212019-10-18 14:18:45 -07001163func (c *Module) SetStatic() {
1164 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001165 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001166 library.setStatic()
1167 return
1168 }
1169 }
1170 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1171}
1172
1173func (c *Module) SetShared() {
1174 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001175 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001176 library.setShared()
1177 return
1178 }
1179 }
1180 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1181}
1182
1183func (c *Module) BuildStaticVariant() bool {
1184 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001185 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001186 return library.buildStatic()
1187 }
1188 }
1189 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1190}
1191
1192func (c *Module) BuildSharedVariant() bool {
1193 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001194 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001195 return library.buildShared()
1196 }
1197 }
1198 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1199}
1200
1201func (c *Module) Module() android.Module {
1202 return c
1203}
1204
Jiyong Parkc20eee32018-09-05 22:36:17 +09001205func (c *Module) OutputFile() android.OptionalPath {
1206 return c.outputFile
1207}
1208
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001209func (c *Module) CoverageFiles() android.Paths {
1210 if c.linker != nil {
1211 if library, ok := c.linker.(libraryInterface); ok {
1212 return library.objs().coverageFiles
1213 }
1214 }
1215 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1216}
1217
Ivan Lozano183a3212019-10-18 14:18:45 -07001218var _ LinkableInterface = (*Module)(nil)
1219
Jiyong Park719b4462019-01-13 00:39:51 +09001220func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001221 if c.linker != nil {
1222 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001223 }
1224 return nil
1225}
1226
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001227func (c *Module) CoverageOutputFile() android.OptionalPath {
1228 if c.linker != nil {
1229 return c.linker.coverageOutputFilePath()
1230 }
1231 return android.OptionalPath{}
1232}
1233
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001234func (c *Module) RelativeInstallPath() string {
1235 if c.installer != nil {
1236 return c.installer.relativeInstallPath()
1237 }
1238 return ""
1239}
1240
Jooyung Han344d5432019-08-23 11:17:39 +09001241func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001242 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001243}
1244
Colin Cross36242852017-06-23 15:06:31 -07001245func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001246 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001247 for _, generator := range c.generators {
1248 c.AddProperties(generator.GeneratorProps()...)
1249 }
Colin Crossca860ac2016-01-04 14:34:37 -08001250 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001251 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001252 }
1253 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001254 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001255 }
1256 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001257 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001258 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001259 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001260 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001261 }
Colin Cross16b23492016-01-06 14:41:07 -08001262 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001263 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001264 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001265 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001266 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001267 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001268 if c.fuzzer != nil {
1269 c.AddProperties(c.fuzzer.props()...)
1270 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001271 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001272 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001273 }
Justin Yun8effde42017-06-23 19:24:43 +09001274 if c.vndkdep != nil {
1275 c.AddProperties(c.vndkdep.props()...)
1276 }
Stephen Craneba090d12017-05-09 15:44:35 -07001277 if c.lto != nil {
1278 c.AddProperties(c.lto.props()...)
1279 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001280 if c.afdo != nil {
1281 c.AddProperties(c.afdo.props()...)
1282 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001283 if c.orderfile != nil {
1284 c.AddProperties(c.orderfile.props()...)
1285 }
Colin Crossca860ac2016-01-04 14:34:37 -08001286 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001287 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001288 }
Colin Crossc472d572015-03-17 15:06:21 -07001289
Colin Cross36242852017-06-23 15:06:31 -07001290 android.InitAndroidArchModule(c, c.hod, c.multilib)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001291 if c.bazelable {
1292 android.InitBazelModule(c)
1293 }
Jiyong Park7916bfc2019-09-30 19:13:12 +09001294 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001295 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001296
Colin Cross36242852017-06-23 15:06:31 -07001297 return c
Colin Crossc472d572015-03-17 15:06:21 -07001298}
1299
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001300// UseVndk() returns true if this module is built against VNDK.
1301// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001302func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001303 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001304}
1305
Colin Crossc511bc52020-04-07 16:50:32 +00001306func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001307 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1308 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001309}
1310
1311func (c *Module) UseSdk() bool {
1312 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001313 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001314 }
1315 return false
1316}
1317
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001318func (c *Module) isCoverageVariant() bool {
1319 return c.coverage.Properties.IsCoverageVariant
1320}
1321
Colin Cross95f1ca02020-10-29 20:47:22 -07001322func (c *Module) IsNdk(config android.Config) bool {
1323 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001324}
1325
Colin Cross127bb8b2020-12-16 16:46:01 -08001326func (c *Module) IsLlndk() bool {
1327 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001328}
1329
Colin Cross127bb8b2020-12-16 16:46:01 -08001330func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001331 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001332}
1333
Colin Cross1f3f1302021-04-26 18:37:44 -07001334func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001335 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001336 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001337}
1338
Colin Cross5271fea2021-04-27 13:06:04 -07001339func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1340 lib := moduleLibraryInterface(m)
1341 return lib != nil && (lib.hasVendorPublicLibrary())
1342}
1343
1344// IsVendorPublicLibrary returns true for vendor public libraries.
1345func (c *Module) IsVendorPublicLibrary() bool {
1346 return c.VendorProperties.IsVendorPublicLibrary
1347}
1348
Ivan Lozanof1868af2022-04-12 13:08:36 -04001349func (c *Module) IsVndkPrebuiltLibrary() bool {
1350 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1351 return true
1352 }
1353 return false
1354}
1355
1356func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1357 return c.Properties.SdkAndPlatformVariantVisibleToMake
1358}
1359
Ivan Lozanod7586b62021-04-01 09:49:36 -04001360func (c *Module) HasLlndkStubs() bool {
1361 lib := moduleLibraryInterface(c)
1362 return lib != nil && lib.hasLLNDKStubs()
1363}
1364
1365func (c *Module) StubsVersion() string {
1366 if lib, ok := c.linker.(versionedInterface); ok {
1367 return lib.stubsVersion()
1368 }
1369 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1370}
1371
Colin Cross127bb8b2020-12-16 16:46:01 -08001372// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1373// and does not set llndk.vendor_available: false.
1374func (c *Module) isImplementationForLLNDKPublic() bool {
1375 library, _ := c.library.(*libraryDecorator)
1376 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001377 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001378}
1379
Justin Yunfd9e8042020-12-23 18:23:14 +09001380// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001381func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001382 // Check if VNDK-core-private or VNDK-SP-private
1383 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001384 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001385 }
1386
1387 // Check if LLNDK-private
1388 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001389 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001390 }
1391
1392 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001393}
1394
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001395// IsVndk() returns true if this module has a vndk variant.
1396// Note that IsVndk() returns true for all variants of vndk-enabled libraries. Not only vendor variant,
1397// but also platform and product variants of vndk-enabled libraries return true for IsVndk().
Ivan Lozano52767be2019-10-18 14:49:46 -07001398func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001399 if vndkdep := c.vndkdep; vndkdep != nil {
1400 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001401 }
1402 return false
1403}
1404
Yi Kong4ef54592022-02-14 20:00:10 +08001405func (c *Module) isAfdoCompile() bool {
1406 if afdo := c.afdo; afdo != nil {
Vinh Tran44cb78c2023-03-09 22:07:19 -05001407 return afdo.Properties.FdoProfilePath != nil
Yi Kong4ef54592022-02-14 20:00:10 +08001408 }
1409 return false
1410}
1411
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001412func (c *Module) isOrderfileCompile() bool {
1413 if orderfile := c.orderfile; orderfile != nil {
1414 return orderfile.Properties.OrderfileLoad
1415 }
1416 return false
1417}
1418
Yi Kongc702ebd2022-08-19 16:02:45 +08001419func (c *Module) isCfi() bool {
1420 if sanitize := c.sanitize; sanitize != nil {
Yi Kongddffe722023-07-18 16:40:36 +09001421 return Bool(sanitize.Properties.SanitizeMutated.Cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001422 }
1423 return false
1424}
1425
Yi Konged79fa32023-06-04 17:15:42 +09001426func (c *Module) isFuzzer() bool {
1427 if sanitize := c.sanitize; sanitize != nil {
1428 return Bool(sanitize.Properties.SanitizeMutated.Fuzzer)
1429 }
1430 return false
1431}
1432
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001433func (c *Module) isNDKStubLibrary() bool {
1434 if _, ok := c.compiler.(*stubDecorator); ok {
1435 return true
1436 }
1437 return false
1438}
1439
Ivan Lozanod7586b62021-04-01 09:49:36 -04001440func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001441 if vndkdep := c.vndkdep; vndkdep != nil {
1442 return vndkdep.isVndkSp()
1443 }
1444 return false
1445}
1446
Ivan Lozanof9e21722020-12-02 09:00:51 -05001447func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001448 if vndkdep := c.vndkdep; vndkdep != nil {
1449 return vndkdep.isVndkExt()
1450 }
1451 return false
1452}
1453
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001454func (c *Module) SubName() string {
1455 return c.Properties.SubName
1456}
1457
Ivan Lozano52767be2019-10-18 14:49:46 -07001458func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001459 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001460}
1461
Logan Chienf3511742017-10-31 18:04:35 +08001462func (c *Module) getVndkExtendsModuleName() string {
1463 if vndkdep := c.vndkdep; vndkdep != nil {
1464 return vndkdep.getVndkExtendsModuleName()
1465 }
1466 return ""
1467}
1468
Jiyong Park25fc6a92018-11-18 18:02:45 +09001469func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001470 if lib := c.library; lib != nil {
1471 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001472 }
1473 return false
1474}
1475
1476func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001477 if lib := c.library; lib != nil {
1478 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001479 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001480 return false
1481}
1482
Alan Stokes73feba32022-11-14 12:21:24 +00001483func (c *Module) IsStubsImplementationRequired() bool {
1484 if lib := c.library; lib != nil {
1485 return lib.isStubsImplementationRequired()
1486 }
1487 return false
1488}
1489
Colin Cross0477b422020-10-13 18:43:54 -07001490// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1491// the implementation. If it is an implementation library it returns its own name.
1492func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1493 name := ctx.OtherModuleName(c)
1494 if versioned, ok := c.linker.(versionedInterface); ok {
1495 name = versioned.implementationModuleName(name)
1496 }
1497 return name
1498}
1499
Martin Stjernholm2856c662020-12-02 15:03:42 +00001500// Similar to ImplementationModuleName, but uses the Make variant of the module
1501// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1502// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1503// under the premise that the prebuilt module overrides its source counterpart
1504// if it is exposed to Make).
1505func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1506 name := c.BaseModuleName()
1507 if versioned, ok := c.linker.(versionedInterface); ok {
1508 name = versioned.implementationModuleName(name)
1509 }
1510 return name
1511}
1512
Jiyong Park7d55b612021-06-11 17:22:09 +09001513func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001514 return Bool(c.Properties.Bootstrap)
1515}
1516
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001517func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001518 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1519 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1520 return false
1521 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001522 return c.linker != nil && c.linker.nativeCoverage()
1523}
1524
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001525func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001526 if p, ok := c.linker.(SnapshotInterface); ok {
1527 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001528 }
1529 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001530}
1531
Bill Peckham945441c2020-08-31 16:07:58 -07001532func (c *Module) ExcludeFromVendorSnapshot() bool {
1533 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1534}
1535
Jose Galmesf7294582020-11-13 12:07:36 -08001536func (c *Module) ExcludeFromRecoverySnapshot() bool {
1537 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1538}
1539
Jiyong Parkf1194352019-02-25 11:05:47 +09001540func isBionic(name string) bool {
1541 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001542 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001543 return true
1544 }
1545 return false
1546}
1547
Martin Stjernholm279de572019-09-10 23:18:20 +01001548func InstallToBootstrap(name string, config android.Config) bool {
Jingwen Chen29743c82023-01-25 17:49:46 +00001549 // NOTE: also update //build/bazel/rules/apex/cc.bzl#_installed_to_bootstrap
1550 // if this list is updated.
Florian Mayer95cd6db2023-03-23 17:48:07 -07001551 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001552 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001553 }
1554 return isBionic(name)
1555}
1556
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001557func (c *Module) XrefCcFiles() android.Paths {
1558 return c.kytheFiles
1559}
1560
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001561func (c *Module) isCfiAssemblySupportEnabled() bool {
1562 return c.sanitize != nil &&
1563 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1564}
1565
Inseob Kim800d1142021-06-14 12:03:51 +09001566func (c *Module) InstallInRoot() bool {
1567 return c.installer != nil && c.installer.installInRoot()
1568}
1569
Colin Crossca860ac2016-01-04 14:34:37 -08001570type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001571 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001572 moduleContextImpl
1573}
1574
Colin Cross37047f12016-12-13 17:06:13 -08001575type depsContext struct {
1576 android.BottomUpMutatorContext
1577 moduleContextImpl
1578}
1579
Colin Crossca860ac2016-01-04 14:34:37 -08001580type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001581 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001582 moduleContextImpl
1583}
1584
1585type moduleContextImpl struct {
1586 mod *Module
1587 ctx BaseModuleContext
1588}
1589
Colin Crossb98c8b02016-07-29 13:44:28 -07001590func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001591 return ctx.mod.toolchain(ctx.ctx)
1592}
1593
1594func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001595 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001596}
1597
1598func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001599 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001600}
1601
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001602func (ctx *moduleContextImpl) testBinary() bool {
1603 return ctx.mod.testBinary()
1604}
1605
Yi Kong56fc1b62022-09-06 16:24:00 +08001606func (ctx *moduleContextImpl) testLibrary() bool {
1607 return ctx.mod.testLibrary()
1608}
1609
Jiyong Park1d1119f2019-07-29 21:27:18 +09001610func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001611 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001612}
1613
Inseob Kim7f283f42020-06-01 21:53:49 +09001614func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001615 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001616}
1617
Inseob Kim1042d292020-06-01 23:23:05 +09001618func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001619 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001620}
1621
Jooyung Hanccce2f22020-03-07 03:45:53 +09001622func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001623 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001624}
1625
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001626func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001627 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001628}
1629
1630func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001631 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001632 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001633 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001634 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001635 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001636 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001637 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001638 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001639 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001640 }
1641 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001642}
1643
Jiyong Parkb35a8192020-08-10 15:59:36 +09001644func (ctx *moduleContextImpl) minSdkVersion() string {
1645 ver := ctx.mod.MinSdkVersion()
1646 if ver == "apex_inherit" && !ctx.isForPlatform() {
1647 ver = ctx.apexSdkVersion().String()
1648 }
1649 if ver == "apex_inherit" || ver == "" {
1650 ver = ctx.sdkVersion()
1651 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001652 // For crt objects, the meaning of min_sdk_version is very different from other types of
1653 // module. For them, min_sdk_version defines the oldest version that the build system will
1654 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1655 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1656 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001657 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1658 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1659 // support such an old version. The version is set to the later version in case when the
1660 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1661 // it's for an APEX.
1662 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1663 if ctx.isForPlatform() {
1664 ver = strconv.Itoa(android.FutureApiLevelInt)
1665 } else { // for apex
1666 ver = ctx.apexSdkVersion().String()
1667 if ver == "" { // in case when min_sdk_version was not set by the APEX
1668 ver = ctx.sdkVersion()
1669 }
1670 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001671 }
1672
Jiyong Parkb35a8192020-08-10 15:59:36 +09001673 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1674 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1675 minSdkVersionInt, err2 := strconv.Atoi(ver)
1676 if err == nil && err2 == nil {
1677 if sdkVersionInt < minSdkVersionInt {
1678 return strconv.Itoa(sdkVersionInt)
1679 }
1680 }
1681 return ver
1682}
1683
1684func (ctx *moduleContextImpl) isSdkVariant() bool {
1685 return ctx.mod.IsSdkVariant()
1686}
1687
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001688func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001689 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001690}
Justin Yun8effde42017-06-23 19:24:43 +09001691
Colin Cross95f1ca02020-10-29 20:47:22 -07001692func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1693 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001694}
1695
Colin Cross127bb8b2020-12-16 16:46:01 -08001696func (ctx *moduleContextImpl) IsLlndk() bool {
1697 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001698}
1699
Colin Cross127bb8b2020-12-16 16:46:01 -08001700func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1701 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001702}
1703
Colin Cross127bb8b2020-12-16 16:46:01 -08001704func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1705 return ctx.mod.isImplementationForLLNDKPublic()
1706}
1707
1708func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1709 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001710}
1711
Logan Chienf3511742017-10-31 18:04:35 +08001712func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001713 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001714}
1715
Yi Kong4ef54592022-02-14 20:00:10 +08001716func (ctx *moduleContextImpl) isAfdoCompile() bool {
1717 return ctx.mod.isAfdoCompile()
1718}
1719
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001720func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1721 return ctx.mod.isOrderfileCompile()
1722}
1723
Yi Kongc702ebd2022-08-19 16:02:45 +08001724func (ctx *moduleContextImpl) isCfi() bool {
1725 return ctx.mod.isCfi()
1726}
1727
Yi Konged79fa32023-06-04 17:15:42 +09001728func (ctx *moduleContextImpl) isFuzzer() bool {
1729 return ctx.mod.isFuzzer()
1730}
1731
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001732func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1733 return ctx.mod.isNDKStubLibrary()
1734}
1735
Justin Yun8effde42017-06-23 19:24:43 +09001736func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001737 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001738}
1739
Ivan Lozanof9e21722020-12-02 09:00:51 -05001740func (ctx *moduleContextImpl) IsVndkExt() bool {
1741 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001742}
1743
Colin Cross5271fea2021-04-27 13:06:04 -07001744func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1745 return ctx.mod.IsVendorPublicLibrary()
1746}
1747
Vic Yangefd249e2018-11-12 20:19:56 -08001748func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001749 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001750}
1751
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001752func (ctx *moduleContextImpl) selectedStl() string {
1753 if stl := ctx.mod.stl; stl != nil {
1754 return stl.Properties.SelectedStl
1755 }
1756 return ""
1757}
1758
Ivan Lozanobd721262018-11-27 14:33:03 -08001759func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1760 return ctx.mod.linker.useClangLld(actx)
1761}
1762
Colin Crossce75d2c2016-10-06 16:12:58 -07001763func (ctx *moduleContextImpl) baseModuleName() string {
1764 return ctx.mod.ModuleBase.BaseModuleName()
1765}
1766
Logan Chienf3511742017-10-31 18:04:35 +08001767func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1768 return ctx.mod.getVndkExtendsModuleName()
1769}
1770
Logan Chiene274fc92019-12-03 11:18:32 -08001771func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001772 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001773}
1774
Colin Crosse07f2312020-08-13 11:24:56 -07001775func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001776 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001777}
1778
Dan Albertc8060532020-07-22 22:32:17 -07001779func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001780 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001781}
1782
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001783func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001784 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001785}
1786
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001787func (ctx *moduleContextImpl) nativeCoverage() bool {
1788 return ctx.mod.nativeCoverage()
1789}
1790
Colin Cross56a83212020-09-15 18:30:11 -07001791func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1792 return ctx.mod.DirectlyInAnyApex()
1793}
1794
Colin Cross95b07f22020-12-16 11:06:50 -08001795func (ctx *moduleContextImpl) isPreventInstall() bool {
1796 return ctx.mod.Properties.PreventInstall
1797}
1798
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001799func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1800 shared := &ctx.mod.sharedFlags
1801 if shared.flagsMap == nil {
1802 shared.numSharedFlags = 0
1803 shared.flagsMap = make(map[string]string)
1804 }
1805 return shared
1806}
1807
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001808func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1809 return ctx.mod.isCfiAssemblySupportEnabled()
1810}
1811
Colin Cross635c3b02016-05-18 15:37:25 -07001812func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001813 return &Module{
1814 hod: hod,
1815 multilib: multilib,
1816 }
1817}
1818
Colin Cross635c3b02016-05-18 15:37:25 -07001819func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001820 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001821 module.features = []feature{
1822 &tidyFeature{},
1823 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001824 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001825 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001826 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001827 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001828 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001829 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001830 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001831 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001832 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001833 return module
1834}
1835
Colin Crossce75d2c2016-10-06 16:12:58 -07001836func (c *Module) Prebuilt() *android.Prebuilt {
1837 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1838 return p.prebuilt()
1839 }
1840 return nil
1841}
1842
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001843func (c *Module) IsPrebuilt() bool {
1844 return c.Prebuilt() != nil
1845}
1846
Colin Crossce75d2c2016-10-06 16:12:58 -07001847func (c *Module) Name() string {
1848 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001849 if p, ok := c.linker.(interface {
1850 Name(string) string
1851 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001852 name = p.Name(name)
1853 }
1854 return name
1855}
1856
Alex Light3d673592019-01-18 14:37:31 -08001857func (c *Module) Symlinks() []string {
1858 if p, ok := c.installer.(interface {
1859 symlinkList() []string
1860 }); ok {
1861 return p.symlinkList()
1862 }
1863 return nil
1864}
1865
Roland Levillainf89cd092019-07-29 16:22:59 +01001866func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1867 test, ok := c.linker.(testPerSrc)
1868 return ok && test.isAllTestsVariation()
1869}
1870
Chris Parsons216e10a2020-07-09 17:12:52 -04001871func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001872 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001873 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001874 }); ok {
1875 return p.dataPaths()
1876 }
1877 return nil
1878}
1879
Ivan Lozanof1868af2022-04-12 13:08:36 -04001880func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001881 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1882 // "current", it will append the VNDK version to the name suffix.
1883 var vndkVersion string
1884 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001885 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001886 if c.ProductSpecific() {
1887 // If the module is product specific with 'product_specific: true',
1888 // do not add a name suffix because it is a base module.
1889 return ""
1890 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001891 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001892 } else {
1893 vndkVersion = ctx.DeviceConfig().VndkVersion()
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001894 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001895 }
1896 if vndkVersion == "current" {
1897 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1898 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001899 if c.VndkVersion() != vndkVersion && c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001900 // add version suffix only if the module is using different vndk version than the
1901 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001902 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001903 }
1904 return nameSuffix
1905}
1906
Ivan Lozanof1868af2022-04-12 13:08:36 -04001907func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1908 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001909
1910 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001911 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001912 }
1913
Colin Cross127bb8b2020-12-16 16:46:01 -08001914 llndk := c.IsLlndk()
Colin Cross627280f2021-04-26 16:53:58 -07001915 if llndk || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001916 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1917 // added for product variant only when we have vendor and product variants with core
1918 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001919 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001920 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001921 subName += vendorPublicLibrarySuffix
1922 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001923 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1924 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001925 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001926 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001927 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001928 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001929 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001930 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001931 subName += RecoverySuffix
1932 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1933 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001934 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001935 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001936 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001937 } else if c.IsStubs() && c.IsSdkVariant() {
1938 // Public API surface (NDK)
1939 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1940 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001941 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001942
1943 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001944}
1945
Chris Parsonsf874e462022-05-10 13:50:12 -04001946var _ android.MixedBuildBuildable = (*Module)(nil)
1947
1948func (c *Module) getBazelModuleLabel(ctx android.BaseModuleContext) string {
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001949 var bazelModuleLabel string
Liz Kammer35ca77e2021-12-22 15:31:40 -05001950 if c.typ() == fullLibrary && c.static() {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001951 // cc_library is a special case in bp2build; two targets are generated -- one for each
1952 // of the shared and static variants. The shared variant keeps the module name, but the
1953 // static variant uses a different suffixed name.
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001954 bazelModuleLabel = bazelLabelForStaticModule(ctx, c)
1955 } else {
1956 bazelModuleLabel = c.GetBazelLabel(ctx, c)
Chris Parsonsf874e462022-05-10 13:50:12 -04001957 }
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001958 labelNoPrebuilt := bazelModuleLabel
1959 if c.IsPrebuilt() {
1960 labelNoPrebuilt = android.RemoveOptionalPrebuiltPrefixFromBazelLabel(bazelModuleLabel)
1961 }
1962 return labelNoPrebuilt
Chris Parsonsf874e462022-05-10 13:50:12 -04001963}
1964
1965func (c *Module) QueueBazelCall(ctx android.BaseModuleContext) {
1966 c.bazelHandler.QueueBazelCall(ctx, c.getBazelModuleLabel(ctx))
1967}
1968
Jingwen Chen3952a902022-12-12 12:20:58 +00001969// IsMixedBuildSupported returns true if the module should be analyzed by Bazel
Jingwen Chena485d092023-04-20 12:34:08 +00001970// in any of the --bazel-mode(s).
Chris Parsonsf874e462022-05-10 13:50:12 -04001971func (c *Module) IsMixedBuildSupported(ctx android.BaseModuleContext) bool {
Yu Liu8860c6c2023-06-07 12:43:26 -07001972 if !allEnabledSanitizersSupportedByBazel(ctx, c) {
Sam Delmericoef69d472023-04-18 17:32:43 -04001973 //TODO(b/278772861) support sanitizers in Bazel rules
Yu Liue4312402023-01-18 09:15:31 -08001974 return false
1975 }
Liz Kammer1cec9d12023-06-22 10:09:47 -04001976 if !imageVariantSupportedByBazel(c) {
1977 return false
1978 }
1979 if c.IsSdkVariant() {
1980 return false
1981 }
Sam Delmericoef69d472023-04-18 17:32:43 -04001982 return c.bazelHandler != nil
1983}
1984
Liz Kammer1cec9d12023-06-22 10:09:47 -04001985func imageVariantSupportedByBazel(c *Module) bool {
1986 if c.IsLlndk() {
1987 return false
1988 }
1989 if c.InVendor() {
1990 return false
1991 }
1992 if c.InProduct() {
1993 return false
1994 }
1995 if c.InRamdisk() {
1996 return false
1997 }
1998 if c.InVendorRamdisk() {
1999 return false
2000 }
2001 if c.InRecovery() {
2002 return false
2003 }
2004 return true
2005}
2006
Yu Liu8860c6c2023-06-07 12:43:26 -07002007func allEnabledSanitizersSupportedByBazel(ctx android.BaseModuleContext, c *Module) bool {
Sam Delmericoef69d472023-04-18 17:32:43 -04002008 if c.sanitize == nil {
2009 return true
2010 }
Yu Liue4312402023-01-18 09:15:31 -08002011 sanitizeProps := &c.sanitize.Properties.SanitizeMutated
Sam Delmericoef69d472023-04-18 17:32:43 -04002012
2013 unsupportedSanitizers := []*bool{
2014 sanitizeProps.Safestack,
Sam Delmericoef69d472023-04-18 17:32:43 -04002015 sanitizeProps.Scudo,
2016 BoolPtr(len(c.sanitize.Properties.Sanitize.Recover) > 0),
Sam Delmericoef69d472023-04-18 17:32:43 -04002017 }
2018 for _, san := range unsupportedSanitizers {
2019 if Bool(san) {
2020 return false
2021 }
2022 }
2023
2024 for _, san := range Sanitizers {
2025 if san == intOverflow {
2026 // TODO(b/261058727): enable mixed builds for all modules with UBSan
2027 // Currently we can only support ubsan when minimum runtime is used.
2028 ubsanEnabled := Bool(sanitizeProps.Integer_overflow) || len(sanitizeProps.Misc_undefined) > 0
Yu Liu8860c6c2023-06-07 12:43:26 -07002029 if !ubsanEnabled || c.MinimalRuntimeNeeded() {
2030 continue
Sam Delmericoef69d472023-04-18 17:32:43 -04002031 }
Yu Liu95497dc2023-05-25 11:15:07 -07002032 } else if san == cfi {
Yu Liu8860c6c2023-06-07 12:43:26 -07002033 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2034 // Only allow cfi if this is an apex variant
2035 if !apexInfo.IsForPlatform() {
2036 continue
2037 }
2038 }
2039 if c.sanitize.isSanitizerEnabled(san) {
Sam Delmericoef69d472023-04-18 17:32:43 -04002040 return false
2041 }
2042 }
2043
2044 return true
Yu Liue4312402023-01-18 09:15:31 -08002045}
2046
2047func GetApexConfigKey(ctx android.BaseModuleContext) *android.ApexConfigKey {
2048 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2049 if !apexInfo.IsForPlatform() {
2050 apexKey := android.ApexConfigKey{
2051 WithinApex: true,
2052 ApexSdkVersion: findApexSdkVersion(ctx, apexInfo).String(),
Spandan Das40b79f82023-06-25 20:56:06 +00002053 ApiDomain: findApiDomain(apexInfo),
Yu Liue4312402023-01-18 09:15:31 -08002054 }
2055 return &apexKey
2056 }
2057
2058 return nil
Chris Parsonsf874e462022-05-10 13:50:12 -04002059}
2060
Spandan Das40b79f82023-06-25 20:56:06 +00002061// Returns the api domain of a module for an apexInfo group
2062// Input:
2063// ai.InApexModules: [com.android.foo, test_com.android.foo, com.google.android.foo]
2064// Return:
2065// com.android.foo
2066
2067// If a module is included in multiple api domains (collated by min_sdk_version), it will return
2068// the first match. The other matches have the same build actions since they share a min_sdk_version, so returning
2069// the first match is fine.
2070func findApiDomain(ai android.ApexInfo) string {
2071 // Remove any test apexes
2072 matches, _ := android.FilterList(ai.InApexModules, ai.TestApexes)
2073 // Remove any google apexes. Rely on naming convention.
2074 pred := func(s string) bool { return !strings.HasPrefix(s, "com.google") }
2075 matches = android.FilterListPred(matches, pred)
2076 if len(matches) > 0 {
2077 // Return the first match
2078 return android.SortedUniqueStrings(matches)[0]
2079 } else {
2080 // No apex in the tree has a dependency on this module
2081 return ""
2082 }
2083}
2084
Chris Parsonsf874e462022-05-10 13:50:12 -04002085func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) {
2086 bazelModuleLabel := c.getBazelModuleLabel(ctx)
Chris Parsonsf874e462022-05-10 13:50:12 -04002087 c.bazelHandler.ProcessBazelQueryResponse(ctx, bazelModuleLabel)
2088
2089 c.Properties.SubName = GetSubnameProperty(ctx, c)
2090 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2091 if !apexInfo.IsForPlatform() {
2092 c.hideApexVariantFromMake = true
Chris Parsons77acf2e2021-12-03 17:27:16 -05002093 }
Liz Kammer35ca77e2021-12-22 15:31:40 -05002094
Chris Parsonsf874e462022-05-10 13:50:12 -04002095 c.makeLinkType = GetMakeLinkType(ctx, c)
2096
2097 mctx := &moduleContext{
2098 ModuleContext: ctx,
2099 moduleContextImpl: moduleContextImpl{
2100 mod: c,
2101 },
Chris Parsons8d6e4332021-02-22 16:13:50 -05002102 }
Chris Parsonsf874e462022-05-10 13:50:12 -04002103 mctx.ctx = mctx
2104
Jingwen Chen3952a902022-12-12 12:20:58 +00002105 // TODO(b/244432500): Get the tradefed config from the bazel target instead
2106 // of generating it with Soong.
Chris Parsonsf874e462022-05-10 13:50:12 -04002107 c.maybeInstall(mctx, apexInfo)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002108}
2109
Sam Delmerico75dbca22023-04-20 13:13:25 +00002110func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
2111 ctx := &moduleContext{
2112 ModuleContext: actx,
2113 moduleContextImpl: moduleContextImpl{
2114 mod: c,
2115 },
2116 }
2117 ctx.ctx = ctx
2118 return ctx
2119}
2120
Spandan Das20fce2d2023-04-12 17:21:39 +00002121// TODO (b/277651159): Remove this allowlist
2122var (
2123 skipStubLibraryMultipleApexViolation = map[string]bool{
2124 "libclang_rt.asan": true,
2125 "libclang_rt.hwasan": true,
2126 // runtime apex
2127 "libc": true,
2128 "libc_hwasan": true,
2129 "libdl_android": true,
2130 "libm": true,
2131 "libdl": true,
2132 // art apex
2133 "libandroidio": true,
2134 "libdexfile": true,
2135 "libnativebridge": true,
2136 "libnativehelper": true,
2137 "libnativeloader": true,
2138 "libsigchain": true,
2139 }
2140)
2141
2142// Returns true if a stub library could be installed in multiple apexes
2143func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2144 // If this is not an apex variant, no check necessary
2145 if !c.InAnyApex() {
2146 return false
2147 }
2148 // If this is not a stub library, no check necessary
2149 if !c.HasStubsVariants() {
2150 return false
2151 }
2152 // Skip the allowlist
2153 // Use BaseModuleName so that this matches prebuilts.
2154 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2155 return false
2156 }
2157
2158 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
2159 // Stub libraries should not have more than one apex_available
2160 if len(aaWithoutTestApexes) > 1 {
2161 return true
2162 }
2163 // Stub libraries should not use the wildcard
2164 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
2165 return true
2166 }
2167 // Default: no violation
2168 return false
2169}
2170
Chris Parsons8d6e4332021-02-22 16:13:50 -05002171func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05002172 // Handle the case of a test module split by `test_per_src` mutator.
2173 //
2174 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
2175 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
2176 // module and return early, as this module does not produce an output file per se.
2177 if c.IsTestPerSrcAllTestsVariation() {
2178 c.outputFile = android.OptionalPath{}
2179 return
2180 }
2181
Ivan Lozanof1868af2022-04-12 13:08:36 -04002182 c.Properties.SubName = GetSubnameProperty(actx, c)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002183 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2184 if !apexInfo.IsForPlatform() {
2185 c.hideApexVariantFromMake = true
2186 }
2187
Chris Parsonseefc9e62021-04-02 17:36:47 -04002188 c.makeLinkType = GetMakeLinkType(actx, c)
2189
Sam Delmerico75dbca22023-04-20 13:13:25 +00002190 ctx := moduleContextFromAndroidModuleContext(actx, c)
Colin Crossca860ac2016-01-04 14:34:37 -08002191
Colin Crossf18e1102017-11-16 14:33:08 -08002192 deps := c.depsToPaths(ctx)
2193 if ctx.Failed() {
2194 return
2195 }
2196
Joe Onorato37f900c2023-07-18 16:58:16 -07002197 for _, generator := range c.generators {
2198 gen := generator.GeneratorSources(ctx)
2199 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2200 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2201 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2202 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2203 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2204 if len(deps.Objs.objFiles) == 0 {
2205 // If we are reusuing object files (which happens when we're a shared library and we're
2206 // reusing our static variant's object files), then skip adding the actual source files,
2207 // because we already have the object for it.
2208 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2209 }
2210 }
2211
2212 if ctx.Failed() {
2213 return
2214 }
2215
Spandan Das20fce2d2023-04-12 17:21:39 +00002216 if c.stubLibraryMultipleApexViolation(actx) {
2217 actx.PropertyErrorf("apex_available",
2218 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2219 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002220 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2221 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002222 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2223 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002224 }
2225
Colin Crossca860ac2016-01-04 14:34:37 -08002226 flags := Flags{
2227 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002228 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002229 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002230 for _, generator := range c.generators {
2231 flags = generator.GeneratorFlags(ctx, flags, deps)
2232 }
Colin Crossca860ac2016-01-04 14:34:37 -08002233 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002234 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002235 }
2236 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002237 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002238 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002239 if c.stl != nil {
2240 flags = c.stl.flags(ctx, flags)
2241 }
Colin Cross16b23492016-01-06 14:41:07 -08002242 if c.sanitize != nil {
2243 flags = c.sanitize.flags(ctx, flags)
2244 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002245 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002246 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002247 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002248 if c.fuzzer != nil {
2249 flags = c.fuzzer.flags(ctx, flags)
2250 }
Stephen Craneba090d12017-05-09 15:44:35 -07002251 if c.lto != nil {
2252 flags = c.lto.flags(ctx, flags)
2253 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002254 if c.afdo != nil {
2255 flags = c.afdo.flags(ctx, flags)
2256 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002257 if c.orderfile != nil {
2258 flags = c.orderfile.flags(ctx, flags)
2259 }
Colin Crossca860ac2016-01-04 14:34:37 -08002260 for _, feature := range c.features {
2261 flags = feature.flags(ctx, flags)
2262 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002263 if ctx.Failed() {
2264 return
2265 }
2266
Colin Cross4af21ed2019-11-04 09:37:55 -08002267 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2268 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2269 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002270
Colin Cross4af21ed2019-11-04 09:37:55 -08002271 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002272
2273 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002274 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002275 }
2276 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002277 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002278 }
2279
Colin Cross3e5e7782022-06-17 22:17:05 +00002280 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2281
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002282 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002283 // We need access to all the flags seen by a source file.
2284 if c.sabi != nil {
2285 flags = c.sabi.flags(ctx, flags)
2286 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002287
Colin Cross4af21ed2019-11-04 09:37:55 -08002288 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002289
Joe Onorato37f900c2023-07-18 16:58:16 -07002290 for _, generator := range c.generators {
2291 generator.GeneratorBuildActions(ctx, flags, deps)
2292 }
2293
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002294 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002295 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002296 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002297 if ctx.Failed() {
2298 return
2299 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002300 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07002301 c.objFiles = objs.objFiles
2302 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08002303 }
2304
Colin Crossca860ac2016-01-04 14:34:37 -08002305 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002306 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002307 if ctx.Failed() {
2308 return
2309 }
Colin Cross635c3b02016-05-18 15:37:25 -07002310 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002311
Chris Parsons94a0bba2021-06-04 15:03:47 -04002312 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002313
Jose Galmes6f843bc2020-12-11 13:36:29 -08002314 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
2315 // RECOVERY_SNAPSHOT_VERSION is current.
2316 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04002317 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002318 i.collectHeadersForSnapshot(ctx)
2319 }
2320 }
Colin Crossce75d2c2016-10-06 16:12:58 -07002321 }
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002322 if c.testModule {
2323 ctx.SetProvider(testing.TestModuleProviderKey, testing.TestModuleProviderData{})
2324 }
Aditya Choudhary26df39f2023-11-29 16:42:42 +00002325 ctx.SetProvider(blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
Colin Cross5049f022015-03-18 13:28:46 -07002326
Colin Crossd788b3e2023-11-28 13:14:56 -08002327 aconfig.CollectDependencyAconfigFiles(ctx, &c.mergedAconfigFiles)
Yu Liueae7b362023-11-16 17:05:47 -08002328
Chris Parsons94a0bba2021-06-04 15:03:47 -04002329 c.maybeInstall(ctx, apexInfo)
2330}
2331
2332func (c *Module) maybeUnhideFromMake() {
2333 // If a lib is directly included in any of the APEXes or is not available to the
2334 // platform (which is often the case when the stub is provided as a prebuilt),
2335 // unhide the stubs variant having the latest version gets visible to make. In
2336 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2337 // force anything in the make world to link against the stubs library. (unless it
2338 // is explicitly referenced via .bootstrap suffix or the module is marked with
2339 // 'bootstrap: true').
2340 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
2341 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
2342 c.IsStubs() && !c.InVendorRamdisk() {
2343 c.Properties.HideFromMake = false // unhide
2344 // Note: this is still non-installable
2345 }
2346}
2347
Jingwen Chen3952a902022-12-12 12:20:58 +00002348// maybeInstall is called at the end of both GenerateAndroidBuildActions and
2349// ProcessBazelQueryResponse to run the install hooks for installable modules,
2350// like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002351func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002352 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002353 // If the module has been specifically configure to not be installed then
2354 // hide from make as otherwise it will break when running inside make
2355 // as the output path to install will not be specified. Not all uninstallable
2356 // modules can be hidden from make as some are needed for resolving make side
2357 // dependencies.
2358 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002359 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002360 c.SkipInstall()
2361 }
2362
2363 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2364 // to allow using the outputs in a genrule.
2365 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002366 c.installer.install(ctx, c.outputFile.Path())
2367 if ctx.Failed() {
2368 return
Colin Crossca860ac2016-01-04 14:34:37 -08002369 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002370 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002371}
2372
Sam Delmerico5fb794a2023-01-27 16:01:37 -05002373func (c *Module) setAndroidMkVariablesFromCquery(info cquery.CcAndroidMkInfo) {
2374 c.Properties.AndroidMkSharedLibs = info.LocalSharedLibs
2375 c.Properties.AndroidMkStaticLibs = info.LocalStaticLibs
2376 c.Properties.AndroidMkWholeStaticLibs = info.LocalWholeStaticLibs
2377}
2378
Colin Cross0ea8ba82019-06-06 14:33:29 -07002379func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002380 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002381 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002382 }
Colin Crossca860ac2016-01-04 14:34:37 -08002383 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002384}
2385
Colin Crossca860ac2016-01-04 14:34:37 -08002386func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002387 for _, generator := range c.generators {
2388 generator.GeneratorInit(ctx)
2389 }
Colin Crossca860ac2016-01-04 14:34:37 -08002390 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002391 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002392 }
Colin Crossca860ac2016-01-04 14:34:37 -08002393 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002394 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002395 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002396 if c.stl != nil {
2397 c.stl.begin(ctx)
2398 }
Colin Cross16b23492016-01-06 14:41:07 -08002399 if c.sanitize != nil {
2400 c.sanitize.begin(ctx)
2401 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002402 if c.coverage != nil {
2403 c.coverage.begin(ctx)
2404 }
Yi Kong9723e332023-12-04 14:52:53 +09002405 if c.afdo != nil {
2406 c.afdo.begin(ctx)
2407 }
Stephen Craneba090d12017-05-09 15:44:35 -07002408 if c.lto != nil {
2409 c.lto.begin(ctx)
2410 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002411 if c.orderfile != nil {
2412 c.orderfile.begin(ctx)
2413 }
Dan Albert92fe7402020-07-15 13:33:30 -07002414 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002415 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002416 if err != nil {
2417 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002418 c.Properties.Sdk_version = nil
2419 } else {
2420 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002421 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002422 }
Colin Crossca860ac2016-01-04 14:34:37 -08002423}
2424
Colin Cross37047f12016-12-13 17:06:13 -08002425func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002426 deps := Deps{}
2427
Joe Onorato37f900c2023-07-18 16:58:16 -07002428 for _, generator := range c.generators {
2429 deps = generator.GeneratorDeps(ctx, deps)
2430 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002431 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002432 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002433 }
2434 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002435 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002436 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002437 if c.stl != nil {
2438 deps = c.stl.deps(ctx, deps)
2439 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002440 if c.coverage != nil {
2441 deps = c.coverage.deps(ctx, deps)
2442 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002443
Colin Crossb6715442017-10-24 11:13:31 -07002444 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2445 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2446 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2447 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2448 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2449 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002450 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002451
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002452 for _, lib := range deps.ReexportSharedLibHeaders {
2453 if !inList(lib, deps.SharedLibs) {
2454 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2455 }
2456 }
2457
2458 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002459 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2460 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 -07002461 }
2462 }
2463
Colin Cross5950f382016-12-13 12:50:57 -08002464 for _, lib := range deps.ReexportHeaderLibHeaders {
2465 if !inList(lib, deps.HeaderLibs) {
2466 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2467 }
2468 }
2469
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002470 for _, gen := range deps.ReexportGeneratedHeaders {
2471 if !inList(gen, deps.GeneratedHeaders) {
2472 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2473 }
2474 }
2475
Colin Crossc99deeb2016-04-11 15:06:20 -07002476 return deps
2477}
2478
Dan Albert7e9d2952016-08-04 13:02:36 -07002479func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002480 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002481 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002482 moduleContextImpl: moduleContextImpl{
2483 mod: c,
2484 },
2485 }
2486 ctx.ctx = ctx
2487
Vinh Tran44cb78c2023-03-09 22:07:19 -05002488 if !actx.Host() || !ctx.static() || ctx.staticBinary() {
2489 c.afdo.addDep(ctx, actx)
2490 }
2491
Colin Crossca860ac2016-01-04 14:34:37 -08002492 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002493}
2494
Jiyong Park7ed9de32018-10-15 22:25:07 +09002495// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002496func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002497 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2498 version := name[sharp+1:]
2499 libname := name[:sharp]
2500 return libname, version
2501 }
2502 return name, ""
2503}
2504
Dan Albert92fe7402020-07-15 13:33:30 -07002505func GetCrtVariations(ctx android.BottomUpMutatorContext,
2506 m LinkableInterface) []blueprint.Variation {
2507 if ctx.Os() != android.Android {
2508 return nil
2509 }
2510 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002511 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2512 minSdkVersion := m.MinSdkVersion()
2513 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2514 minSdkVersion = m.SdkVersion()
2515 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002516 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2517 if err != nil {
2518 ctx.PropertyErrorf("min_sdk_version", err.Error())
2519 }
Colin Cross363ec762023-01-13 13:45:14 -08002520
2521 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002522 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002523 if apiLevel.LessThan(minApiForArch) {
2524 apiLevel = minApiForArch
2525 }
2526
Dan Albert92fe7402020-07-15 13:33:30 -07002527 return []blueprint.Variation{
2528 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002529 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002530 }
2531 }
2532 return []blueprint.Variation{
2533 {Mutator: "sdk", Variation: ""},
2534 }
2535}
2536
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002537func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2538 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002539
2540 variations = append([]blueprint.Variation(nil), variations...)
2541
Liz Kammer23942242022-04-08 15:41:00 -04002542 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002543 // Version is explicitly specified. i.e. libFoo#30
2544 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002545 if tag, ok := depTag.(libraryDependencyTag); ok {
2546 tag.explicitlyVersioned = true
2547 } else {
2548 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2549 }
Colin Crosse7257d22020-09-24 09:56:18 -07002550 }
Colin Crosse7257d22020-09-24 09:56:18 -07002551
Colin Cross0de8a1e2020-09-18 14:15:30 -07002552 if far {
2553 ctx.AddFarVariationDependencies(variations, depTag, name)
2554 } else {
2555 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002556 }
2557}
2558
Kiyoung Kim487689e2022-07-26 09:48:22 +09002559func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2560 apiImportInfo := multitree.ApiImportInfo{}
2561
2562 if c.Device() {
2563 var apiImportModule []blueprint.Module
2564 if actx.OtherModuleExists("api_imports") {
2565 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2566 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
2567 apiInfo := actx.OtherModuleProvider(apiImportModule[0], multitree.ApiImportsProvider).(multitree.ApiImportInfo)
2568 apiImportInfo = apiInfo
2569 actx.SetProvider(multitree.ApiImportsProvider, apiInfo)
2570 }
2571 }
2572 }
2573
2574 return apiImportInfo
2575}
2576
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002577func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002578 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002579 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002580 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002581 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2582 // between the modules in the snapshot and the snapshot itself.
2583 var snapshotModule []blueprint.Module
2584 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2585 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2586 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2587 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2588 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002589 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002590 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2591 *snapshotInfo = &snapshot
2592 // republish the snapshot for use in later mutators on this module
2593 actx.SetProvider(SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002594 }
2595 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002596 if *snapshotInfo == nil {
2597 *snapshotInfo = &SnapshotInfo{}
2598 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002599 return **snapshotInfo
2600}
2601
Kiyoung Kim487689e2022-07-26 09:48:22 +09002602func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2603 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002604 return snapshot
2605 }
2606
2607 return lib
2608}
2609
2610// RewriteLibs takes a list of names of shared libraries and scans it for three types
2611// of names:
2612//
2613// 1. Name of an NDK library that refers to a prebuilt module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002614//
2615// For each of these, it adds the name of the prebuilt module (which will be in
2616// prebuilts/ndk) to the list of nonvariant libs.
2617//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002618// 2. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002619//
2620// For each of these, it adds the name of the ndk_library module to the list of
2621// variant libs.
2622//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002623// 3. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002624//
2625// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002626//
2627// The caller can then know to add the variantLibs dependencies differently from the
2628// nonvariantLibs
2629func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2630 variantLibs = []string{}
2631
2632 nonvariantLibs = []string{}
2633 for _, entry := range list {
2634 // strip #version suffix out
2635 name, _ := StubsLibNameAndVersion(entry)
2636 if c.InRecovery() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002637 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002638 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2639 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2640 } else if c.UseVndk() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002641 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002642 } else {
2643 // put name#version back
2644 nonvariantLibs = append(nonvariantLibs, entry)
2645 }
2646 }
2647 return nonvariantLibs, variantLibs
2648}
2649
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002650func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2651 nonVariantLibs := []string{}
2652 variantLibs := []string{}
2653
2654 for _, lib := range libs {
2655 replaceLibName := GetReplaceModuleName(lib, replaceList)
2656 if replaceLibName == lib {
2657 // Do not handle any libs which are not in API imports
2658 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2659 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2660 variantLibs = append(variantLibs, replaceLibName)
2661 } else {
2662 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2663 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002664 }
2665
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002666 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002667}
2668
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002669func (c *Module) shouldUseApiSurface() bool {
2670 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2671 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2672 // LLNDK Variant
2673 return true
2674 }
2675
2676 if c.Properties.IsSdkVariant {
2677 // NDK Variant
2678 return true
2679 }
2680
2681 if c.isImportedApiLibrary() {
2682 // API Library should depend on API headers
2683 return true
2684 }
2685 }
2686
2687 return false
2688}
2689
Colin Cross1e676be2016-10-12 14:38:15 -07002690func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002691 if !c.Enabled() {
2692 return
2693 }
2694
Colin Cross37047f12016-12-13 17:06:13 -08002695 ctx := &depsContext{
2696 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002697 moduleContextImpl: moduleContextImpl{
2698 mod: c,
2699 },
2700 }
2701 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002702
Colin Crossc99deeb2016-04-11 15:06:20 -07002703 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002704 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002705
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002706 apiNdkLibs := []string{}
2707 apiLateNdkLibs := []string{}
2708
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002709 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002710 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2711 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2712 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2713 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2714 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002715 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002716
Yo Chiang219968c2020-09-22 18:45:04 +08002717 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2718
Colin Crosse0edaf92021-01-11 17:31:17 -08002719 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002720
Dan Albert914449f2016-06-17 16:45:24 -07002721 variantNdkLibs := []string{}
2722 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002723 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002724 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2725 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2726 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002727
2728 for idx, lib := range deps.RuntimeLibs {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002729 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002730 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002731 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002732
Colin Cross32ec36c2016-12-15 07:39:51 -08002733 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002734 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002735 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002736 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002737 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002738
Kiyoung Kim51279d32022-08-24 14:10:46 +09002739 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002740 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002741 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2742 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002743 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002744
Spandan Das73bcafc2022-08-18 23:26:00 +00002745 if c.isNDKStubLibrary() {
2746 // ndk_headers do not have any variations
2747 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002748 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002749 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002750 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002751 } else {
2752 actx.AddVariationDependencies(nil, depTag, lib)
2753 }
2754 }
2755
Dan Albertf1d14c72020-07-30 14:32:55 -07002756 if c.isNDKStubLibrary() {
2757 // NDK stubs depend on their implementation because the ABI dumps are
2758 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002759
Spandan Das8b08aea2023-03-14 19:29:34 +00002760 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2761 c.ImageVariation(),
2762 blueprint.Variation{Mutator: "link", Variation: "shared"},
2763 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002764 }
2765
Jiyong Park5d1598f2019-02-25 22:14:17 +09002766 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002767 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002768
Kiyoung Kim487689e2022-07-26 09:48:22 +09002769 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002770
Jiyong Park5d1598f2019-02-25 22:14:17 +09002771 actx.AddVariationDependencies([]blueprint.Variation{
2772 {Mutator: "link", Variation: "static"},
2773 }, depTag, lib)
2774 }
2775
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002776 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002777 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002778 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002779 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002780 }
Jiyong Parke3867542020-12-03 17:28:25 +09002781 if inList(lib, deps.ExcludeLibsForApex) {
2782 depTag.excludeInApex = true
2783 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002784
Kiyoung Kim487689e2022-07-26 09:48:22 +09002785 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002786
Dan Willemsen59339a22018-07-22 21:18:45 -07002787 actx.AddVariationDependencies([]blueprint.Variation{
2788 {Mutator: "link", Variation: "static"},
2789 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002790 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002791
Jooyung Han75568392020-03-20 04:29:24 +09002792 // staticUnwinderDep is treated as staticDep for Q apexes
2793 // so that native libraries/binaries are linked with static unwinder
2794 // because Q libc doesn't have unwinder APIs
2795 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002796 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002797 actx.AddVariationDependencies([]blueprint.Variation{
2798 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002799 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002800 }
2801
Jiyong Park7ed9de32018-10-15 22:25:07 +09002802 // shared lib names without the #version suffix
2803 var sharedLibNames []string
2804
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002805 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002806 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002807 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002808 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002809 }
Jiyong Parke3867542020-12-03 17:28:25 +09002810 if inList(lib, deps.ExcludeLibsForApex) {
2811 depTag.excludeInApex = true
2812 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002813 if inList(lib, deps.ExcludeLibsForNonApex) {
2814 depTag.excludeInNonApex = true
2815 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002816
Jiyong Park73c54ee2019-10-22 20:31:18 +09002817 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002818 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2819 name = apiLibraryName
2820 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002821 sharedLibNames = append(sharedLibNames, name)
2822
Colin Crosse7257d22020-09-24 09:56:18 -07002823 variations := []blueprint.Variation{
2824 {Mutator: "link", Variation: "shared"},
2825 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002826
2827 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2828 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2829 }
2830
2831 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2832 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2833 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002834 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002835
Colin Crossfe9acfe2021-06-14 16:13:03 -07002836 for _, lib := range deps.LateStaticLibs {
2837 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2838 actx.AddVariationDependencies([]blueprint.Variation{
2839 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002840 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Crossfe9acfe2021-06-14 16:13:03 -07002841 }
2842
Colin Cross3e5e7782022-06-17 22:17:05 +00002843 for _, lib := range deps.UnexportedStaticLibs {
2844 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2845 actx.AddVariationDependencies([]blueprint.Variation{
2846 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002847 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Cross3e5e7782022-06-17 22:17:05 +00002848 }
2849
Jiyong Park7ed9de32018-10-15 22:25:07 +09002850 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002851 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002852 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2853 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2854 // linking against both the stubs lib and the non-stubs lib at the same time.
2855 continue
2856 }
Colin Cross6e511a92020-07-27 21:26:48 -07002857 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002858 variations := []blueprint.Variation{
2859 {Mutator: "link", Variation: "shared"},
2860 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002861 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002862 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002863
Dan Willemsen59339a22018-07-22 21:18:45 -07002864 actx.AddVariationDependencies([]blueprint.Variation{
2865 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002866 }, dataLibDepTag, deps.DataLibs...)
2867
Colin Crossc8caa062021-09-24 16:50:14 -07002868 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2869
Chris Parsons79d66a52020-06-05 17:26:16 -04002870 actx.AddVariationDependencies([]blueprint.Variation{
2871 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002872 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002873
Colin Cross68861832016-07-08 10:41:41 -07002874 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002875
2876 for _, gen := range deps.GeneratedHeaders {
2877 depTag := genHeaderDepTag
2878 if inList(gen, deps.ReexportGeneratedHeaders) {
2879 depTag = genHeaderExportDepTag
2880 }
2881 actx.AddDependency(c, depTag, gen)
2882 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002883
Dan Albert92fe7402020-07-15 13:33:30 -07002884 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002885 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002886 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002887 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002888 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002889 }
Colin Crossc465efd2021-06-11 18:00:04 -07002890 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002891 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002892 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002893 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002894 if deps.DynamicLinker != "" {
2895 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002896 }
Dan Albert914449f2016-06-17 16:45:24 -07002897
2898 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002899
2900 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002901 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002902 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002903 {Mutator: "link", Variation: "shared"},
2904 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002905 actx.AddVariationDependencies([]blueprint.Variation{
2906 {Mutator: "version", Variation: version},
2907 {Mutator: "link", Variation: "shared"},
2908 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002909
2910 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002911 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002912 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002913 {Mutator: "link", Variation: "shared"},
2914 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002915 actx.AddVariationDependencies([]blueprint.Variation{
2916 {Mutator: "version", Variation: version},
2917 {Mutator: "link", Variation: "shared"},
2918 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002919
2920 if vndkdep := c.vndkdep; vndkdep != nil {
2921 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002922 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002923 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002924 {Mutator: "link", Variation: "shared"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002925 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002926 }
2927 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002928
Vinh Tran367d89d2023-04-28 11:21:25 -04002929 if len(deps.AidlLibs) > 0 {
2930 actx.AddDependency(
2931 c,
2932 aidlLibraryTag,
2933 deps.AidlLibs...,
2934 )
2935 }
2936
Kiyoung Kimee58c932022-10-25 22:59:41 +09002937 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002938}
Colin Cross21b9a242015-03-24 14:15:58 -07002939
Colin Crosse40b4ea2018-10-02 22:25:58 -07002940func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002941 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2942 c.beginMutator(ctx)
2943 }
2944}
2945
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002946// Whether a module can link to another module, taking into
2947// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002948func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002949 tag blueprint.DependencyTag) {
2950
2951 switch t := tag.(type) {
2952 case dependencyTag:
2953 if t != vndkExtDepTag {
2954 return
2955 }
2956 case libraryDependencyTag:
2957 default:
2958 return
2959 }
2960
Ivan Lozanof9e21722020-12-02 09:00:51 -05002961 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002962 // Host code is not restricted
2963 return
2964 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002965
2966 // VNDK is cc.Module supported only for now.
2967 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002968 // Though allowed dependency is limited by the image mutator,
2969 // each vendor and product module needs to check link-type
2970 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002971 if ccTo, ok := to.(*Module); ok {
2972 if ccFrom.vndkdep != nil {
2973 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2974 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002975 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002976 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002977 }
2978 return
2979 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002980 // TODO(b/244244438) : Remove this once all variants are implemented
2981 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2982 return
2983 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002984 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002985 // Platform code can link to anything
2986 return
2987 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002988 if from.InRamdisk() {
2989 // Ramdisk code is not NDK
2990 return
2991 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002992 if from.InVendorRamdisk() {
2993 // Vendor ramdisk code is not NDK
2994 return
2995 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002996 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002997 // Recovery code is not NDK
2998 return
2999 }
Colin Cross31076b32020-10-23 17:22:06 -07003000 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003001 if c.NdkPrebuiltStl() {
3002 // These are allowed, but they don't set sdk_version
3003 return
3004 }
3005 if c.StubDecorator() {
3006 // These aren't real libraries, but are the stub shared libraries that are included in
3007 // the NDK.
3008 return
3009 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003010 if c.isImportedApiLibrary() {
3011 // Imported library from the API surface is a stub library built against interface definition.
3012 return
3013 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003014 }
Logan Chien834b9a62019-01-14 15:39:03 +08003015
Ivan Lozano52767be2019-10-18 14:49:46 -07003016 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003017 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3018 // to link to libc++ (non-NDK and without sdk_version).
3019 return
3020 }
3021
Ivan Lozano52767be2019-10-18 14:49:46 -07003022 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003023 // NDK code linking to platform code is never okay.
3024 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003025 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003026 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003027 }
3028
3029 // At this point we know we have two NDK libraries, but we need to
3030 // check that we're not linking against anything built against a higher
3031 // API level, as it is only valid to link against older or equivalent
3032 // APIs.
3033
Inseob Kim01a28722018-04-11 09:48:45 +09003034 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003035 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003036 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003037 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003038 // Current can't be linked against by anything else.
3039 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003040 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003041 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003042 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003043 if err != nil {
3044 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003045 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003046 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003047 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003048 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003049 if err != nil {
3050 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003051 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003052 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003053 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003054
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003055 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003056 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003057 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003058 }
3059 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003060 }
Dan Albert202fe492017-12-15 13:56:59 -08003061
3062 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003063 fromStl := from.SelectedStl()
3064 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003065 if fromStl == "" || toStl == "" {
3066 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003067 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003068 // We can be permissive with the system "STL" since it is only the C++
3069 // ABI layer, but in the future we should make sure that everyone is
3070 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003071 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003072 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003073 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3074 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003075 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003076}
3077
Jooyung Han479ca172020-10-19 18:51:07 +09003078func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3079 if c, ok := ctx.Module().(*Module); ok {
3080 ctx.VisitDirectDeps(func(dep android.Module) {
3081 depTag := ctx.OtherModuleDependencyTag(dep)
3082 ccDep, ok := dep.(LinkableInterface)
3083 if ok {
3084 checkLinkType(ctx, c, ccDep, depTag)
3085 }
3086 })
3087 }
3088}
3089
Jiyong Park5fb8c102018-04-09 12:03:06 +09003090// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003091// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3092// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003093// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09003094func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
3095 check := func(child, parent android.Module) bool {
3096 to, ok := child.(*Module)
3097 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003098 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003099 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003100
Jooyung Hana70f0672019-01-18 15:20:43 +09003101 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3102 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003103 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003104
Jiyong Park0474e1f2021-01-14 14:26:06 +09003105 // These dependencies are not excercised at runtime. Tracking these will give us
3106 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003107 depTag := ctx.OtherModuleDependencyTag(child)
3108 if IsHeaderDepTag(depTag) {
3109 return false
3110 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003111 if depTag == staticVariantTag {
3112 return false
3113 }
3114 if depTag == stubImplDepTag {
3115 return false
3116 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003117
Justin Yun63e9ec72020-10-29 16:49:43 +09003118 // Even if target lib has no vendor variant, keep checking dependency
3119 // graph in case it depends on vendor_available or product_available
3120 // but not double_loadable transtively.
3121 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003122 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003123 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003124
Jiyong Park0474e1f2021-01-14 14:26:06 +09003125 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3126 // one.
3127 if Bool(to.VendorProperties.Double_loadable) {
3128 return true
3129 }
3130
Ivan Lozanod7586b62021-04-01 09:49:36 -04003131 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003132 return false
3133 }
3134
Jooyung Hana70f0672019-01-18 15:20:43 +09003135 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3136 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003137 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003138 return false
3139 }
3140 if module, ok := ctx.Module().(*Module); ok {
3141 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003142 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003143 ctx.WalkDeps(check)
3144 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003145 }
3146 }
3147}
3148
Yu Liue4312402023-01-18 09:15:31 -08003149func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3150 // For the dependency from platform to apex, use the latest stubs
3151 apexSdkVersion := android.FutureApiLevel
3152 if !apexInfo.IsForPlatform() {
3153 apexSdkVersion = apexInfo.MinSdkVersion
3154 }
3155
3156 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3157 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3158 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3159 // (b/144430859)
3160 apexSdkVersion = android.FutureApiLevel
3161 }
3162
3163 return apexSdkVersion
3164}
3165
Colin Crossc99deeb2016-04-11 15:06:20 -07003166// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003167func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003168 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003169
Colin Cross0de8a1e2020-09-18 14:15:30 -07003170 var directStaticDeps []StaticLibraryInfo
3171 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003172
Colin Cross0de8a1e2020-09-18 14:15:30 -07003173 reexportExporter := func(exporter FlagExporterInfo) {
3174 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3175 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3176 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3177 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3178 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003179 }
3180
Colin Cross56a83212020-09-15 18:30:11 -07003181 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
Yu Liue4312402023-01-18 09:15:31 -08003182 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003183
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003184 skipModuleList := map[string]bool{}
3185
3186 var apiImportInfo multitree.ApiImportInfo
3187 hasApiImportInfo := false
3188
3189 ctx.VisitDirectDeps(func(dep android.Module) {
3190 if dep.Name() == "api_imports" {
3191 apiImportInfo = ctx.OtherModuleProvider(dep, multitree.ApiImportsProvider).(multitree.ApiImportInfo)
3192 hasApiImportInfo = true
3193 }
3194 })
3195
3196 if hasApiImportInfo {
3197 targetStubModuleList := map[string]string{}
3198 targetOrigModuleList := map[string]string{}
3199
3200 // Search for dependency which both original module and API imported library with APEX stub exists
3201 ctx.VisitDirectDeps(func(dep android.Module) {
3202 depName := ctx.OtherModuleName(dep)
3203 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
3204 targetStubModuleList[apiLibrary] = depName
3205 }
3206 })
3207 ctx.VisitDirectDeps(func(dep android.Module) {
3208 depName := ctx.OtherModuleName(dep)
3209 if origLibrary, ok := targetStubModuleList[depName]; ok {
3210 targetOrigModuleList[origLibrary] = depName
3211 }
3212 })
3213
3214 // Decide which library should be used between original and API imported library
3215 ctx.VisitDirectDeps(func(dep android.Module) {
3216 depName := ctx.OtherModuleName(dep)
3217 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003218 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003219 skipModuleList[depName] = true
3220 } else {
3221 skipModuleList[apiLibrary] = true
3222 }
3223 }
3224 })
3225 }
3226
Colin Crossd11fcda2017-10-23 17:59:01 -07003227 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003228 depName := ctx.OtherModuleName(dep)
3229 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003230
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003231 if _, ok := skipModuleList[depName]; ok {
3232 // skip this module because original module or API imported module matching with this should be used instead.
3233 return
3234 }
3235
Dan Willemsen47450072021-10-19 20:24:49 -07003236 if depTag == android.DarwinUniversalVariantTag {
3237 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3238 return
3239 }
3240
Vinh Tran367d89d2023-04-28 11:21:25 -04003241 if depTag == aidlLibraryTag {
3242 if ctx.OtherModuleHasProvider(dep, aidl_library.AidlLibraryProvider) {
3243 depPaths.AidlLibraryInfos = append(
3244 depPaths.AidlLibraryInfos,
3245 ctx.OtherModuleProvider(
3246 dep,
3247 aidl_library.AidlLibraryProvider).(aidl_library.AidlLibraryInfo),
3248 )
3249 }
3250 }
3251
Ivan Lozano52767be2019-10-18 14:49:46 -07003252 ccDep, ok := dep.(LinkableInterface)
3253 if !ok {
3254
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003255 // handling for a few module types that aren't cc Module but that are also supported
3256 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003257 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003258 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003259 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3260 genRule.GeneratedSourceFiles()...)
3261 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003262 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003263 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003264 // Support exported headers from a generated_sources dependency
3265 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003266 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003267 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003268 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003269 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003270 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003271 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003272 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003273 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003274 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3275 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003276 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003277 // 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 +09003278 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003279
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003280 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003281 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003282 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003283 }
Colin Crosscef792e2021-06-11 18:01:26 -07003284 case CrtBeginDepTag:
3285 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3286 case CrtEndDepTag:
3287 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003288 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003289 return
3290 }
3291
Colin Crossfe17f6f2019-03-28 19:30:56 -07003292 if depTag == android.ProtoPluginDepTag {
3293 return
3294 }
3295
Colin Crossd11fcda2017-10-23 17:59:01 -07003296 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003297 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3298 return
3299 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003300 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003301 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3302 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003303 return
3304 }
3305
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003306 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003307 // Skip reused objects for stub libraries, they use their own stub object file instead.
3308 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3309 // version mutator, so the stubs variant is created from the shared variant that
3310 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003311 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07003312 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3313 objs := staticAnalogue.ReuseObjects
3314 depPaths.Objs = depPaths.Objs.Append(objs)
3315 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3316 reexportExporter(depExporterInfo)
3317 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003318 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003319 }
3320
Colin Cross6e511a92020-07-27 21:26:48 -07003321 linkFile := ccDep.OutputFile()
3322
3323 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3324 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003325 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003326 return
3327 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003328
Jiyong Parke3867542020-12-03 17:28:25 +09003329 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3330 return
3331 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003332 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3333 return
3334 }
Jiyong Parke3867542020-12-03 17:28:25 +09003335
Colin Cross0de8a1e2020-09-18 14:15:30 -07003336 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07003337
Colin Cross6e511a92020-07-27 21:26:48 -07003338 var ptr *android.Paths
3339 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003340
Colin Cross6e511a92020-07-27 21:26:48 -07003341 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003342
Colin Cross6e511a92020-07-27 21:26:48 -07003343 switch {
3344 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08003345 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
3346 if !ctx.Config().AllowMissingDependencies() {
3347 ctx.ModuleErrorf("module %q is not a header library", depName)
3348 } else {
3349 ctx.AddMissingDependencies([]string{depName})
3350 }
3351 return
3352 }
Colin Cross6e511a92020-07-27 21:26:48 -07003353 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003354 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
3355 if !ctx.Config().AllowMissingDependencies() {
3356 ctx.ModuleErrorf("module %q is not a shared library", depName)
3357 } else {
3358 ctx.AddMissingDependencies([]string{depName})
3359 }
3360 return
3361 }
Jiyong Parke3867542020-12-03 17:28:25 +09003362
Jiyong Park7d55b612021-06-11 17:22:09 +09003363 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3364 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003365
Jiyong Park1ad8e162020-12-01 23:40:09 +09003366 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3367 // linkFile, depFile, and ptr.
3368 if c.IsStubs() {
3369 break
3370 }
3371
Colin Cross0de8a1e2020-09-18 14:15:30 -07003372 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3373 depFile = sharedLibraryInfo.TableOfContents
3374
Colin Cross6e511a92020-07-27 21:26:48 -07003375 ptr = &depPaths.SharedLibs
3376 switch libDepTag.Order {
3377 case earlyLibraryDependency:
3378 ptr = &depPaths.EarlySharedLibs
3379 depPtr = &depPaths.EarlySharedLibsDeps
3380 case normalLibraryDependency:
3381 ptr = &depPaths.SharedLibs
3382 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003383 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003384 case lateLibraryDependency:
3385 ptr = &depPaths.LateSharedLibs
3386 depPtr = &depPaths.LateSharedLibsDeps
3387 default:
3388 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003389 }
Colin Cross6e511a92020-07-27 21:26:48 -07003390 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003391 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
3392 if !ctx.Config().AllowMissingDependencies() {
3393 ctx.ModuleErrorf("module %q is not a static library", depName)
3394 } else {
3395 ctx.AddMissingDependencies([]string{depName})
3396 }
3397 return
3398 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003399
3400 // Stubs lib doesn't link to the static lib dependencies. Don't set
3401 // linkFile, depFile, and ptr.
3402 if c.IsStubs() {
3403 break
3404 }
3405
Colin Cross0de8a1e2020-09-18 14:15:30 -07003406 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3407 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003408 if libDepTag.wholeStatic {
3409 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003410 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3411 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003412 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003413 // This case normally catches prebuilt static
3414 // libraries, but it can also occur when
3415 // AllowMissingDependencies is on and the
3416 // dependencies has no sources of its own
3417 // but has a whole_static_libs dependency
3418 // on a missing library. We want to depend
3419 // on the .a file so that there is something
3420 // in the dependency tree that contains the
3421 // error rule for the missing transitive
3422 // dependency.
3423 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003424 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003425 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3426 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003427 } else {
3428 switch libDepTag.Order {
3429 case earlyLibraryDependency:
3430 panic(fmt.Errorf("early static libs not suppported"))
3431 case normalLibraryDependency:
3432 // static dependencies will be handled separately so they can be ordered
3433 // using transitive dependencies.
3434 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003435 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003436 case lateLibraryDependency:
3437 ptr = &depPaths.LateStaticLibs
3438 default:
3439 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003440 }
3441 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003442 if libDepTag.unexportedSymbols {
3443 depPaths.LdFlags = append(depPaths.LdFlags,
3444 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3445 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003446 }
3447
Colin Cross6e511a92020-07-27 21:26:48 -07003448 if libDepTag.static() && !libDepTag.wholeStatic {
3449 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3450 ctx.ModuleErrorf("module %q not a static library", depName)
3451 return
3452 }
Logan Chien43d34c32017-12-20 01:17:32 +08003453
Colin Cross6e511a92020-07-27 21:26:48 -07003454 // When combining coverage files for shared libraries and executables, coverage files
3455 // in static libraries act as if they were whole static libraries. The same goes for
3456 // source based Abi dump files.
3457 if c, ok := ccDep.(*Module); ok {
3458 staticLib := c.linker.(libraryInterface)
3459 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3460 staticLib.objs().coverageFiles...)
3461 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3462 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003463 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003464 // Handle non-CC modules here
3465 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003466 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003467 }
3468 }
3469
Colin Cross6e511a92020-07-27 21:26:48 -07003470 if ptr != nil {
3471 if !linkFile.Valid() {
3472 if !ctx.Config().AllowMissingDependencies() {
3473 ctx.ModuleErrorf("module %q missing output file", depName)
3474 } else {
3475 ctx.AddMissingDependencies([]string{depName})
3476 }
3477 return
3478 }
3479 *ptr = append(*ptr, linkFile.Path())
3480 }
3481
3482 if depPtr != nil {
3483 dep := depFile
3484 if !dep.Valid() {
3485 dep = linkFile
3486 }
3487 *depPtr = append(*depPtr, dep.Path())
3488 }
3489
Colin Cross0de8a1e2020-09-18 14:15:30 -07003490 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3491 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3492 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3493 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3494
3495 if libDepTag.reexportFlags {
3496 reexportExporter(depExporterInfo)
3497 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3498 // Re-exported shared library headers must be included as well since they can help us with type information
3499 // about template instantiations (instantiated from their headers).
3500 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
3501 // scripts.
3502 c.sabi.Properties.ReexportedIncludes = append(
3503 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3504 }
3505
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003506 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003507 switch {
3508 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003509 c.Properties.AndroidMkHeaderLibs = append(
3510 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003511 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003512 if lib := moduleLibraryInterface(dep); lib != nil {
3513 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003514 // Add the dependency to the APEX(es) providing the library so that
3515 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07003516 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09003517 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003518 c.Properties.ApexesProvidingSharedLibs = append(
3519 c.Properties.ApexesProvidingSharedLibs, an)
3520 }
3521 }
3522 }
3523
3524 // Note: the order of libs in this list is not important because
3525 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003526 c.Properties.AndroidMkSharedLibs = append(
3527 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003528 // Record BaseLibName for snapshots.
3529 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003530 case libDepTag.static():
3531 if libDepTag.wholeStatic {
3532 c.Properties.AndroidMkWholeStaticLibs = append(
3533 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3534 } else {
3535 c.Properties.AndroidMkStaticLibs = append(
3536 c.Properties.AndroidMkStaticLibs, makeLibName)
3537 }
Justin Yun5e035862021-06-29 20:50:37 +09003538 // Record BaseLibName for snapshots.
3539 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003540 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003541 } else if !c.IsStubs() {
3542 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3543
Colin Cross6e511a92020-07-27 21:26:48 -07003544 switch depTag {
3545 case runtimeDepTag:
3546 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003547 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003548 // Record BaseLibName for snapshots.
3549 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003550 case objDepTag:
3551 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3552 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003553 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003554 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003555 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003556 case dynamicLinkerDepTag:
3557 depPaths.DynamicLinker = linkFile
3558 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003559 }
Colin Crossca860ac2016-01-04 14:34:37 -08003560 })
3561
Jeff Gaston294356f2017-09-27 17:05:30 -07003562 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003563 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3564 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3565 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003566
Colin Crossdd84e052017-05-17 13:44:16 -07003567 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003568 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003569 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3570 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003571 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003572 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3573 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003574 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003575 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003576 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003577
3578 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003579 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003580 }
Colin Crossdd84e052017-05-17 13:44:16 -07003581
Colin Crossca860ac2016-01-04 14:34:37 -08003582 return depPaths
3583}
3584
Spandan Das604f3762023-03-16 22:51:40 +00003585func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003586 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003587 thisModule, ok := ctx.Module().(android.ApexModule)
3588 if !ok {
3589 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3590 }
3591
3592 useVndk := false
3593 bootstrap := false
3594 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3595 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3596 } else {
3597 useVndk = linkable.UseVndk()
3598 bootstrap = linkable.Bootstrap()
3599 }
3600
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003601 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
3602
3603 useStubs := false
3604
3605 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3606 if !apexInfo.IsForPlatform() {
3607 // For platform libraries, use current version of LLNDK
3608 // If this is for use_vendor apex we will apply the same rules
3609 // of apex sdk enforcement below to choose right version.
3610 useStubs = true
3611 }
3612 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3613 // If not building for APEX or the containing APEX allows the use of
3614 // platform APIs, use stubs only when it is from an APEX (and not from
3615 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3616 // bootstrap modules, always link to non-stub variant
3617 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3618
3619 isApexImportedApiLibrary := false
3620
3621 if cc, ok := dep.(*Module); ok {
3622 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3623 if apiLibrary.hasApexStubs() {
3624 isApexImportedApiLibrary = true
3625 }
3626 }
3627 }
3628
3629 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3630
3631 if useStubs {
3632 // Another exception: if this module is a test for an APEX, then
3633 // it is linked with the non-stub variant of a module in the APEX
3634 // as if this is part of the APEX.
3635 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
3636 for _, apexContents := range testFor.ApexContents {
3637 if apexContents.DirectlyInApex(depName) {
3638 useStubs = false
3639 break
3640 }
3641 }
3642 }
3643 if useStubs {
3644 // Yet another exception: If this module and the dependency are
3645 // available to the same APEXes then skip stubs between their
3646 // platform variants. This complements the test_for case above,
3647 // which avoids the stubs on a direct APEX library dependency, by
3648 // avoiding stubs for indirect test dependencies as well.
3649 //
3650 // TODO(b/183882457): This doesn't work if the two libraries have
3651 // only partially overlapping apex_available. For that test_for
3652 // modules would need to be split into APEX variants and resolved
3653 // separately for each APEX they have access to.
3654 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3655 useStubs = false
3656 }
3657 }
3658 } else {
3659 // If building for APEX, use stubs when the parent is in any APEX that
3660 // the child is not in.
3661 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3662 }
3663
3664 return useStubs
3665}
3666
3667// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3668// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3669// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3670// has different level of updatability. For example, if a library foo in an APEX depends on a
3671// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3672// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3673// same APEX as foo, the non-stub variant of bar is used.
3674func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3675 depTag := ctx.OtherModuleDependencyTag(dep)
3676 libDepTag, ok := depTag.(libraryDependencyTag)
3677 if !ok || !libDepTag.shared() {
3678 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3679 }
3680
Jiyong Park7d55b612021-06-11 17:22:09 +09003681 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
3682 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3683 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Jiyong Park7d55b612021-06-11 17:22:09 +09003684
3685 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003686 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003687 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003688 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3689 toUse := stubs[len(stubs)-1]
3690 sharedLibraryInfo = toUse.SharedLibraryInfo
3691 depExporterInfo = toUse.FlagExporterInfo
3692 }
3693 }
3694 return sharedLibraryInfo, depExporterInfo
3695}
3696
Colin Cross0de8a1e2020-09-18 14:15:30 -07003697// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3698// to match the topological order of the dependency tree, including any static analogues of
3699// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3700// of the transitive dependencies.
Colin Crossc85750b2022-04-21 12:50:51 -07003701func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet[android.Path]) {
3702 transitiveStaticLibsBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003703 var staticPaths android.Paths
3704 for _, staticDep := range staticDeps {
3705 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3706 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3707 }
3708 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003709 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3710 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003711 }
3712 }
3713 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3714
3715 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3716
3717 // reorder the dependencies based on transitive dependencies
3718 staticPaths = android.FirstUniquePaths(staticPaths)
3719 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3720
3721 if len(orderedStaticPaths) != len(staticPaths) {
3722 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3723 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3724 }
3725
3726 return orderedStaticPaths, transitiveStaticLibs
3727}
3728
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003729// BaseLibName trims known prefixes and suffixes
3730func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003731 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3732 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003733 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003734 return libName
3735}
3736
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003737func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003738 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003739 ccDepModule, _ := ccDep.(*Module)
3740 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003741 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003742
Justin Yuncbca3732021-02-03 19:24:13 +09003743 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003744 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003745 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003746 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003747
Ivan Lozanod1dec542021-05-26 15:33:11 -04003748 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003749 }
3750 }
3751
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003752 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3753 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003754 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3755 // core module instead.
3756 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003757 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003758 // The vendor and product modules in Make will have been renamed to not conflict with the
3759 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003760 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003761 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003762 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003763 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003764 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003765 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003766 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003767 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003768 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003769 } else {
3770 return libName
3771 }
3772}
3773
Colin Crossca860ac2016-01-04 14:34:37 -08003774func (c *Module) InstallInData() bool {
3775 if c.installer == nil {
3776 return false
3777 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003778 return c.installer.inData()
3779}
3780
3781func (c *Module) InstallInSanitizerDir() bool {
3782 if c.installer == nil {
3783 return false
3784 }
3785 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003786 return true
3787 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003788 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003789}
3790
Yifan Hong1b3348d2020-01-21 15:53:22 -08003791func (c *Module) InstallInRamdisk() bool {
3792 return c.InRamdisk()
3793}
3794
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003795func (c *Module) InstallInVendorRamdisk() bool {
3796 return c.InVendorRamdisk()
3797}
3798
Jiyong Parkf9332f12018-02-01 00:54:12 +09003799func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003800 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003801}
3802
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003803func (c *Module) MakeUninstallable() {
3804 if c.installer == nil {
3805 c.ModuleBase.MakeUninstallable()
3806 return
3807 }
3808 c.installer.makeUninstallable(c)
3809}
3810
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003811func (c *Module) HostToolPath() android.OptionalPath {
3812 if c.installer == nil {
3813 return android.OptionalPath{}
3814 }
3815 return c.installer.hostToolPath()
3816}
3817
Nan Zhangd4e641b2017-07-12 12:55:28 -07003818func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3819 return c.outputFile
3820}
3821
Colin Cross41955e82019-05-29 14:40:35 -07003822func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3823 switch tag {
3824 case "":
3825 if c.outputFile.Valid() {
3826 return android.Paths{c.outputFile.Path()}, nil
3827 }
3828 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003829 case "unstripped":
3830 if c.linker != nil {
3831 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3832 }
3833 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003834 default:
3835 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003836 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003837}
3838
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003839func (c *Module) static() bool {
3840 if static, ok := c.linker.(interface {
3841 static() bool
3842 }); ok {
3843 return static.static()
3844 }
3845 return false
3846}
3847
Jiyong Park379de2f2018-12-19 02:47:14 +09003848func (c *Module) staticBinary() bool {
3849 if static, ok := c.linker.(interface {
3850 staticBinary() bool
3851 }); ok {
3852 return static.staticBinary()
3853 }
3854 return false
3855}
3856
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003857func (c *Module) testBinary() bool {
3858 if test, ok := c.linker.(interface {
3859 testBinary() bool
3860 }); ok {
3861 return test.testBinary()
3862 }
3863 return false
3864}
3865
Jingwen Chen537242c2022-08-24 11:53:27 +00003866func (c *Module) testLibrary() bool {
3867 if test, ok := c.linker.(interface {
3868 testLibrary() bool
3869 }); ok {
3870 return test.testLibrary()
3871 }
3872 return false
3873}
3874
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003875func (c *Module) benchmarkBinary() bool {
3876 if b, ok := c.linker.(interface {
3877 benchmarkBinary() bool
3878 }); ok {
3879 return b.benchmarkBinary()
3880 }
3881 return false
3882}
3883
3884func (c *Module) fuzzBinary() bool {
3885 if f, ok := c.linker.(interface {
3886 fuzzBinary() bool
3887 }); ok {
3888 return f.fuzzBinary()
3889 }
3890 return false
3891}
3892
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003893// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3894func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003895 if h, ok := c.linker.(interface {
3896 header() bool
3897 }); ok {
3898 return h.header()
3899 }
3900 return false
3901}
3902
Ivan Lozanod7586b62021-04-01 09:49:36 -04003903func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003904 if b, ok := c.linker.(interface {
3905 binary() bool
3906 }); ok {
3907 return b.binary()
3908 }
3909 return false
3910}
3911
Justin Yun5e035862021-06-29 20:50:37 +09003912func (c *Module) StaticExecutable() bool {
3913 if b, ok := c.linker.(*binaryDecorator); ok {
3914 return b.static()
3915 }
3916 return false
3917}
3918
Ivan Lozanod7586b62021-04-01 09:49:36 -04003919func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003920 if o, ok := c.linker.(interface {
3921 object() bool
3922 }); ok {
3923 return o.object()
3924 }
3925 return false
3926}
3927
Ivan Lozanof9e21722020-12-02 09:00:51 -05003928func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003929 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003930 if c.IsLlndk() {
3931 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003932 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003933 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003934 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003935 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003936 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003937 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003938 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003939 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003940 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003941 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003942 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003943 return "native:product"
3944 }
Jooyung Han38002912019-05-16 04:01:54 +09003945 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003946 } else if c.InRamdisk() {
3947 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003948 } else if c.InVendorRamdisk() {
3949 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003950 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003951 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003952 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003953 return "native:ndk:none:none"
3954 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3955 //family, link := getNdkStlFamilyAndLinkType(c)
3956 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003957 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003958 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003959 } else {
3960 return "native:platform"
3961 }
3962}
3963
Jiyong Park9d452992018-10-03 00:38:19 +09003964// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003965// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003966func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003967 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003968 // Stub libs and prebuilt libs in a versioned SDK are not
3969 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003970 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003971 } else if _, ok := c.linker.(testPerSrc); ok {
3972 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003973 }
3974 return false
3975}
3976
Jiyong Parka90ca002019-10-07 15:47:24 +09003977func (c *Module) AvailableFor(what string) bool {
3978 if linker, ok := c.linker.(interface {
3979 availableFor(string) bool
3980 }); ok {
3981 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3982 } else {
3983 return c.ApexModuleBase.AvailableFor(what)
3984 }
3985}
3986
Jiyong Park62304bb2020-04-13 16:19:48 +09003987func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003988 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003989}
3990
Paul Duffin0cb37b92020-03-04 14:52:46 +00003991func (c *Module) EverInstallable() bool {
3992 return c.installer != nil &&
3993 // Check to see whether the module is actually ever installable.
3994 c.installer.everInstallable()
3995}
3996
Ivan Lozanod7586b62021-04-01 09:49:36 -04003997func (c *Module) PreventInstall() bool {
3998 return c.Properties.PreventInstall
3999}
4000
4001func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07004002 if c.library != nil {
4003 if i := c.library.installable(); i != nil {
4004 return i
4005 }
4006 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04004007 return c.Properties.Installable
4008}
4009
4010func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00004011 ret := c.EverInstallable() &&
4012 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04004013 proptools.BoolDefault(c.Installable(), true) &&
4014 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004015
4016 // The platform variant doesn't need further condition. Apex variants however might not
4017 // be installable because it will likely to be included in the APEX and won't appear
4018 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07004019 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004020 return ret
4021 }
4022
4023 // Special case for modules that are configured to be installed to /data, which includes
4024 // test modules. For these modules, both APEX and non-APEX variants are considered as
4025 // installable. This is because even the APEX variants won't be included in the APEX, but
4026 // will anyway be installed to /data/*.
4027 // See b/146995717
4028 if c.InstallInData() {
4029 return ret
4030 }
4031
4032 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09004033}
4034
Logan Chien41eabe62019-04-10 13:33:58 +08004035func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
4036 if c.linker != nil {
4037 if library, ok := c.linker.(*libraryDecorator); ok {
4038 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
4039 }
4040 }
4041}
4042
Jiyong Park45bf82e2020-12-15 22:29:02 +09004043var _ android.ApexModule = (*Module)(nil)
4044
4045// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004046func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07004047 depTag := ctx.OtherModuleDependencyTag(dep)
4048 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
4049
4050 if cc, ok := dep.(*Module); ok {
4051 if cc.HasStubsVariants() {
4052 if isLibDepTag && libDepTag.shared() {
4053 // dynamic dep to a stubs lib crosses APEX boundary
4054 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09004055 }
Colin Cross6e511a92020-07-27 21:26:48 -07004056 if IsRuntimeDepTag(depTag) {
4057 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09004058 return false
4059 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004060 }
Zhijun Heec285872021-04-24 10:47:08 -07004061 if cc.IsLlndk() {
4062 return false
4063 }
Colin Crossaac32222020-07-29 12:51:56 -07004064 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07004065 // shared_lib dependency from a static lib is considered as crossing
4066 // the APEX boundary because the dependency doesn't actually is
4067 // linked; the dependency is used only during the compilation phase.
4068 return false
4069 }
Jiyong Parke3867542020-12-03 17:28:25 +09004070
4071 if isLibDepTag && libDepTag.excludeInApex {
4072 return false
4073 }
Colin Cross6e511a92020-07-27 21:26:48 -07004074 }
Colin Crossc1b36442021-05-06 13:42:48 -07004075 if depTag == stubImplDepTag {
4076 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004077 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004078 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004079 if depTag == staticVariantTag {
4080 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4081 // actually mean that the static lib (and its dependencies) are copied into the
4082 // APEX.
4083 return false
4084 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004085 return true
4086}
4087
Jiyong Park45bf82e2020-12-15 22:29:02 +09004088// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07004089func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
4090 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09004091 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4092 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
4093 return nil
4094 }
Jooyung Han749dc692020-04-15 11:03:39 +09004095 // We don't check for prebuilt modules
4096 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4097 return nil
4098 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004099
Jooyung Han749dc692020-04-15 11:03:39 +09004100 minSdkVersion := c.MinSdkVersion()
4101 if minSdkVersion == "apex_inherit" {
4102 return nil
4103 }
4104 if minSdkVersion == "" {
4105 // JNI libs within APK-in-APEX fall into here
4106 // Those are okay to set sdk_version instead
4107 // We don't have to check if this is a SDK variant because
4108 // non-SDK variant resets sdk_version, which works too.
4109 minSdkVersion = c.SdkVersion()
4110 }
Dan Albertc8060532020-07-22 22:32:17 -07004111 if minSdkVersion == "" {
4112 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4113 }
4114 // Not using nativeApiLevelFromUser because the context here is not
4115 // necessarily a native context.
4116 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004117 if err != nil {
4118 return err
4119 }
Dan Albertc8060532020-07-22 22:32:17 -07004120
Colin Cross8ca61c12022-10-06 21:00:14 -07004121 // A dependency only needs to support a min_sdk_version at least
4122 // as high as the api level that the architecture was introduced in.
4123 // This allows introducing new architectures in the platform that
4124 // need to be included in apexes that normally require an older
4125 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004126 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004127 if sdkVersion.LessThan(minApiForArch) {
4128 sdkVersion = minApiForArch
4129 }
4130
Dan Albertc8060532020-07-22 22:32:17 -07004131 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004132 return fmt.Errorf("newer SDK(%v)", ver)
4133 }
4134 return nil
4135}
4136
Paul Duffinb5769c12021-05-12 16:16:51 +01004137// Implements android.ApexModule
4138func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4139 // stub libraries and native bridge libraries are always available to platform
4140 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4141}
4142
Jooyung Han91f92032022-02-04 12:36:33 +09004143// Overrides android.ApexModuleBase.UniqueApexVariations
4144func (c *Module) UniqueApexVariations() bool {
4145 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
4146 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
4147 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09004148 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09004149 return c.UseVndk() && c.IsVndk()
4150}
4151
Inseob Kima1888ce2022-10-04 14:42:02 +09004152func (c *Module) overriddenModules() []string {
4153 if o, ok := c.linker.(overridable); ok {
4154 return o.overriddenModules()
4155 }
4156 return nil
4157}
4158
Rob Seymour925aa092021-08-10 20:42:03 +00004159var _ snapshot.RelativeInstallPath = (*Module)(nil)
4160
Liz Kammer35ca77e2021-12-22 15:31:40 -05004161type moduleType int
4162
4163const (
4164 unknownType moduleType = iota
4165 binary
4166 object
4167 fullLibrary
4168 staticLibrary
4169 sharedLibrary
4170 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004171 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004172 ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004173 ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004174)
4175
4176func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004177 if c.testBinary() {
4178 // testBinary is also a binary, so this comes before the c.Binary()
4179 // conditional. A testBinary has additional implicit dependencies and
4180 // other test-only semantics.
4181 return testBin
4182 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004183 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004184 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004185 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004186 } else if c.testLibrary() {
4187 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4188 // will let them add implicit compile deps on gtest, for example.
4189 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004190 // For now, treat them as regular libraries.
4191 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004192 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004193 static := false
4194 shared := false
4195 if library, ok := c.linker.(*libraryDecorator); ok {
4196 static = library.MutatedProperties.BuildStatic
4197 shared = library.MutatedProperties.BuildShared
4198 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4199 static = library.MutatedProperties.BuildStatic
4200 shared = library.MutatedProperties.BuildShared
4201 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004202 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004203 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004204 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004205 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004206 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004207 return staticLibrary
4208 }
4209 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004210 } else if c.isNDKStubLibrary() {
4211 return ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004212 } else if c.IsNdkPrebuiltStl() {
4213 return ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004214 }
4215 return unknownType
4216}
4217
4218// ConvertWithBp2build converts Module to Bazel for bp2build.
Chris Parsons637458d2023-09-19 20:09:00 +00004219func (c *Module) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) {
Yu Liu855cfc22023-09-14 15:10:03 -07004220 if len(c.generators) > 0 {
4221 allConverted := true
4222 for _, generator := range c.generators {
Yu Liuf11b7c32023-10-20 19:15:51 +00004223 allConverted = allConverted && generator.GeneratorBp2build(ctx, c)
Yu Liu855cfc22023-09-14 15:10:03 -07004224 }
4225 if allConverted {
4226 return
4227 }
4228 }
4229
Liz Kammer35ca77e2021-12-22 15:31:40 -05004230 prebuilt := c.IsPrebuilt()
4231 switch c.typ() {
4232 case binary:
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxb12ff592022-09-01 15:04:04 +00004233 if prebuilt {
4234 prebuiltBinaryBp2Build(ctx, c)
4235 } else {
Jingwen Chen537242c2022-08-24 11:53:27 +00004236 binaryBp2build(ctx, c)
4237 }
4238 case testBin:
4239 if !prebuilt {
4240 testBinaryBp2build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004241 }
4242 case object:
Colin Crossc5075e92022-12-05 16:46:39 -08004243 if prebuilt {
4244 prebuiltObjectBp2Build(ctx, c)
4245 } else {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004246 objectBp2Build(ctx, c)
4247 }
4248 case fullLibrary:
4249 if !prebuilt {
4250 libraryBp2Build(ctx, c)
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004251 } else {
4252 prebuiltLibraryBp2Build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004253 }
4254 case headerLibrary:
4255 libraryHeadersBp2Build(ctx, c)
4256 case staticLibrary:
Liz Kammer35ca77e2021-12-22 15:31:40 -05004257 if prebuilt {
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004258 prebuiltLibraryStaticBp2Build(ctx, c, false)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004259 } else {
4260 sharedOrStaticLibraryBp2Build(ctx, c, true)
4261 }
4262 case sharedLibrary:
4263 if prebuilt {
4264 prebuiltLibrarySharedBp2Build(ctx, c)
4265 } else {
4266 sharedOrStaticLibraryBp2Build(ctx, c, false)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004267 }
Spandan Dase12d2522023-09-12 21:42:31 +00004268 case ndkPrebuiltStl:
4269 ndkPrebuiltStlBp2build(ctx, c)
Spandan Das63acae92023-09-14 22:34:34 +00004270 case ndkLibrary:
4271 ndkLibraryBp2build(ctx, c)
Chris Parsons39a16972023-06-08 14:28:51 +00004272 default:
4273 ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_TYPE_UNSUPPORTED, "")
Spandan Das8b4a5f32022-09-29 00:28:24 +00004274 }
4275}
4276
Colin Crosscfad1192015-11-02 16:43:11 -08004277// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004278type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004279 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004280 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004281 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004282}
4283
Patrice Arrudac249c712019-03-19 17:00:29 -07004284// cc_defaults provides a set of properties that can be inherited by other cc
4285// modules. A module can use the properties from a cc_defaults using
4286// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4287// merged (when possible) by prepending the default module's values to the
4288// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004289func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004290 return DefaultsFactory()
4291}
4292
Colin Cross36242852017-06-23 15:06:31 -07004293func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004294 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004295
Colin Cross36242852017-06-23 15:06:31 -07004296 module.AddProperties(props...)
4297 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004298 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004299 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004300 &BaseCompilerProperties{},
4301 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004302 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004303 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004304 &StaticProperties{},
4305 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004306 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004307 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004308 &TestLinkerProperties{},
4309 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004310 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004311 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004312 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004313 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004314 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004315 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004316 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004317 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004318 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004319 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004320 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004321 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004322 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004323 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004324 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004325 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4326 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004327 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004328 )
Colin Crosscfad1192015-11-02 16:43:11 -08004329
Jooyung Hancc372c52019-09-25 15:18:44 +09004330 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004331
4332 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004333}
4334
Jiyong Park2286afd2020-06-16 21:58:53 +09004335func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004336 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004337}
4338
Kiyoung Kim51279d32022-08-24 14:10:46 +09004339func (c *Module) isImportedApiLibrary() bool {
4340 _, ok := c.linker.(*apiLibraryDecorator)
4341 return ok
4342}
4343
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004344func kytheExtractAllFactory() android.Singleton {
4345 return &kytheExtractAllSingleton{}
4346}
4347
4348type kytheExtractAllSingleton struct {
4349}
4350
4351func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4352 var xrefTargets android.Paths
4353 ctx.VisitAllModules(func(module android.Module) {
4354 if ccModule, ok := module.(xref); ok {
4355 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4356 }
4357 })
4358 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4359 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004360 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004361 }
4362}
4363
Jihoon Kangf78a8902022-09-01 22:47:07 +00004364func (c *Module) Partition() string {
4365 if p, ok := c.installer.(interface {
4366 getPartition() string
4367 }); ok {
4368 return p.getPartition()
4369 }
4370 return ""
4371}
4372
Colin Cross06a931b2015-10-28 17:23:31 -07004373var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004374var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004375var BoolPtr = proptools.BoolPtr
4376var String = proptools.String
4377var StringPtr = proptools.StringPtr