blob: 867a59c032be8445badc5201c132eb7afdb19563 [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
931 transitiveAconfigFiles map[string]*android.DepSet[android.Path]
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 }
Colin Cross5049f022015-03-18 13:28:46 -07002325
Yu Liueae7b362023-11-16 17:05:47 -08002326 aconfig.CollectTransitiveAconfigFiles(ctx, &c.transitiveAconfigFiles)
2327
Chris Parsons94a0bba2021-06-04 15:03:47 -04002328 c.maybeInstall(ctx, apexInfo)
2329}
2330
2331func (c *Module) maybeUnhideFromMake() {
2332 // If a lib is directly included in any of the APEXes or is not available to the
2333 // platform (which is often the case when the stub is provided as a prebuilt),
2334 // unhide the stubs variant having the latest version gets visible to make. In
2335 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2336 // force anything in the make world to link against the stubs library. (unless it
2337 // is explicitly referenced via .bootstrap suffix or the module is marked with
2338 // 'bootstrap: true').
2339 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
2340 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
2341 c.IsStubs() && !c.InVendorRamdisk() {
2342 c.Properties.HideFromMake = false // unhide
2343 // Note: this is still non-installable
2344 }
2345}
2346
Jingwen Chen3952a902022-12-12 12:20:58 +00002347// maybeInstall is called at the end of both GenerateAndroidBuildActions and
2348// ProcessBazelQueryResponse to run the install hooks for installable modules,
2349// like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002350func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002351 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002352 // If the module has been specifically configure to not be installed then
2353 // hide from make as otherwise it will break when running inside make
2354 // as the output path to install will not be specified. Not all uninstallable
2355 // modules can be hidden from make as some are needed for resolving make side
2356 // dependencies.
2357 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002358 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002359 c.SkipInstall()
2360 }
2361
2362 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2363 // to allow using the outputs in a genrule.
2364 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002365 c.installer.install(ctx, c.outputFile.Path())
2366 if ctx.Failed() {
2367 return
Colin Crossca860ac2016-01-04 14:34:37 -08002368 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002369 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002370}
2371
Sam Delmerico5fb794a2023-01-27 16:01:37 -05002372func (c *Module) setAndroidMkVariablesFromCquery(info cquery.CcAndroidMkInfo) {
2373 c.Properties.AndroidMkSharedLibs = info.LocalSharedLibs
2374 c.Properties.AndroidMkStaticLibs = info.LocalStaticLibs
2375 c.Properties.AndroidMkWholeStaticLibs = info.LocalWholeStaticLibs
2376}
2377
Colin Cross0ea8ba82019-06-06 14:33:29 -07002378func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002379 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002380 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002381 }
Colin Crossca860ac2016-01-04 14:34:37 -08002382 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002383}
2384
Colin Crossca860ac2016-01-04 14:34:37 -08002385func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002386 for _, generator := range c.generators {
2387 generator.GeneratorInit(ctx)
2388 }
Colin Crossca860ac2016-01-04 14:34:37 -08002389 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002390 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002391 }
Colin Crossca860ac2016-01-04 14:34:37 -08002392 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002393 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002394 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002395 if c.stl != nil {
2396 c.stl.begin(ctx)
2397 }
Colin Cross16b23492016-01-06 14:41:07 -08002398 if c.sanitize != nil {
2399 c.sanitize.begin(ctx)
2400 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002401 if c.coverage != nil {
2402 c.coverage.begin(ctx)
2403 }
Stephen Craneba090d12017-05-09 15:44:35 -07002404 if c.lto != nil {
2405 c.lto.begin(ctx)
2406 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002407 if c.orderfile != nil {
2408 c.orderfile.begin(ctx)
2409 }
Dan Albert92fe7402020-07-15 13:33:30 -07002410 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002411 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002412 if err != nil {
2413 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002414 c.Properties.Sdk_version = nil
2415 } else {
2416 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002417 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002418 }
Colin Crossca860ac2016-01-04 14:34:37 -08002419}
2420
Colin Cross37047f12016-12-13 17:06:13 -08002421func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002422 deps := Deps{}
2423
Joe Onorato37f900c2023-07-18 16:58:16 -07002424 for _, generator := range c.generators {
2425 deps = generator.GeneratorDeps(ctx, deps)
2426 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002427 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002428 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002429 }
2430 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002431 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002432 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002433 if c.stl != nil {
2434 deps = c.stl.deps(ctx, deps)
2435 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002436 if c.coverage != nil {
2437 deps = c.coverage.deps(ctx, deps)
2438 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002439
Colin Crossb6715442017-10-24 11:13:31 -07002440 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2441 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2442 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2443 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2444 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2445 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002446 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002447
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002448 for _, lib := range deps.ReexportSharedLibHeaders {
2449 if !inList(lib, deps.SharedLibs) {
2450 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2451 }
2452 }
2453
2454 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002455 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2456 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 -07002457 }
2458 }
2459
Colin Cross5950f382016-12-13 12:50:57 -08002460 for _, lib := range deps.ReexportHeaderLibHeaders {
2461 if !inList(lib, deps.HeaderLibs) {
2462 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2463 }
2464 }
2465
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002466 for _, gen := range deps.ReexportGeneratedHeaders {
2467 if !inList(gen, deps.GeneratedHeaders) {
2468 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2469 }
2470 }
2471
Colin Crossc99deeb2016-04-11 15:06:20 -07002472 return deps
2473}
2474
Dan Albert7e9d2952016-08-04 13:02:36 -07002475func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002476 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002477 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002478 moduleContextImpl: moduleContextImpl{
2479 mod: c,
2480 },
2481 }
2482 ctx.ctx = ctx
2483
Vinh Tran44cb78c2023-03-09 22:07:19 -05002484 if !actx.Host() || !ctx.static() || ctx.staticBinary() {
2485 c.afdo.addDep(ctx, actx)
2486 }
2487
Colin Crossca860ac2016-01-04 14:34:37 -08002488 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002489}
2490
Jiyong Park7ed9de32018-10-15 22:25:07 +09002491// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002492func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002493 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2494 version := name[sharp+1:]
2495 libname := name[:sharp]
2496 return libname, version
2497 }
2498 return name, ""
2499}
2500
Dan Albert92fe7402020-07-15 13:33:30 -07002501func GetCrtVariations(ctx android.BottomUpMutatorContext,
2502 m LinkableInterface) []blueprint.Variation {
2503 if ctx.Os() != android.Android {
2504 return nil
2505 }
2506 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002507 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2508 minSdkVersion := m.MinSdkVersion()
2509 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2510 minSdkVersion = m.SdkVersion()
2511 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002512 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2513 if err != nil {
2514 ctx.PropertyErrorf("min_sdk_version", err.Error())
2515 }
Colin Cross363ec762023-01-13 13:45:14 -08002516
2517 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002518 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002519 if apiLevel.LessThan(minApiForArch) {
2520 apiLevel = minApiForArch
2521 }
2522
Dan Albert92fe7402020-07-15 13:33:30 -07002523 return []blueprint.Variation{
2524 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002525 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002526 }
2527 }
2528 return []blueprint.Variation{
2529 {Mutator: "sdk", Variation: ""},
2530 }
2531}
2532
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002533func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2534 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002535
2536 variations = append([]blueprint.Variation(nil), variations...)
2537
Liz Kammer23942242022-04-08 15:41:00 -04002538 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002539 // Version is explicitly specified. i.e. libFoo#30
2540 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002541 if tag, ok := depTag.(libraryDependencyTag); ok {
2542 tag.explicitlyVersioned = true
2543 } else {
2544 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2545 }
Colin Crosse7257d22020-09-24 09:56:18 -07002546 }
Colin Crosse7257d22020-09-24 09:56:18 -07002547
Colin Cross0de8a1e2020-09-18 14:15:30 -07002548 if far {
2549 ctx.AddFarVariationDependencies(variations, depTag, name)
2550 } else {
2551 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002552 }
2553}
2554
Kiyoung Kim487689e2022-07-26 09:48:22 +09002555func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2556 apiImportInfo := multitree.ApiImportInfo{}
2557
2558 if c.Device() {
2559 var apiImportModule []blueprint.Module
2560 if actx.OtherModuleExists("api_imports") {
2561 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2562 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
2563 apiInfo := actx.OtherModuleProvider(apiImportModule[0], multitree.ApiImportsProvider).(multitree.ApiImportInfo)
2564 apiImportInfo = apiInfo
2565 actx.SetProvider(multitree.ApiImportsProvider, apiInfo)
2566 }
2567 }
2568 }
2569
2570 return apiImportInfo
2571}
2572
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002573func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002574 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002575 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002576 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002577 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2578 // between the modules in the snapshot and the snapshot itself.
2579 var snapshotModule []blueprint.Module
2580 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2581 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2582 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2583 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2584 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002585 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002586 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2587 *snapshotInfo = &snapshot
2588 // republish the snapshot for use in later mutators on this module
2589 actx.SetProvider(SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002590 }
2591 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002592 if *snapshotInfo == nil {
2593 *snapshotInfo = &SnapshotInfo{}
2594 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002595 return **snapshotInfo
2596}
2597
Kiyoung Kim487689e2022-07-26 09:48:22 +09002598func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2599 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002600 return snapshot
2601 }
2602
2603 return lib
2604}
2605
2606// RewriteLibs takes a list of names of shared libraries and scans it for three types
2607// of names:
2608//
2609// 1. Name of an NDK library that refers to a prebuilt module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002610//
2611// For each of these, it adds the name of the prebuilt module (which will be in
2612// prebuilts/ndk) to the list of nonvariant libs.
2613//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002614// 2. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002615//
2616// For each of these, it adds the name of the ndk_library module to the list of
2617// variant libs.
2618//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002619// 3. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002620//
2621// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002622//
2623// The caller can then know to add the variantLibs dependencies differently from the
2624// nonvariantLibs
2625func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2626 variantLibs = []string{}
2627
2628 nonvariantLibs = []string{}
2629 for _, entry := range list {
2630 // strip #version suffix out
2631 name, _ := StubsLibNameAndVersion(entry)
2632 if c.InRecovery() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002633 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002634 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2635 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2636 } else if c.UseVndk() {
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 {
2639 // put name#version back
2640 nonvariantLibs = append(nonvariantLibs, entry)
2641 }
2642 }
2643 return nonvariantLibs, variantLibs
2644}
2645
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002646func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2647 nonVariantLibs := []string{}
2648 variantLibs := []string{}
2649
2650 for _, lib := range libs {
2651 replaceLibName := GetReplaceModuleName(lib, replaceList)
2652 if replaceLibName == lib {
2653 // Do not handle any libs which are not in API imports
2654 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2655 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2656 variantLibs = append(variantLibs, replaceLibName)
2657 } else {
2658 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2659 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002660 }
2661
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002662 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002663}
2664
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002665func (c *Module) shouldUseApiSurface() bool {
2666 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2667 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2668 // LLNDK Variant
2669 return true
2670 }
2671
2672 if c.Properties.IsSdkVariant {
2673 // NDK Variant
2674 return true
2675 }
2676
2677 if c.isImportedApiLibrary() {
2678 // API Library should depend on API headers
2679 return true
2680 }
2681 }
2682
2683 return false
2684}
2685
Colin Cross1e676be2016-10-12 14:38:15 -07002686func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002687 if !c.Enabled() {
2688 return
2689 }
2690
Colin Cross37047f12016-12-13 17:06:13 -08002691 ctx := &depsContext{
2692 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002693 moduleContextImpl: moduleContextImpl{
2694 mod: c,
2695 },
2696 }
2697 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002698
Colin Crossc99deeb2016-04-11 15:06:20 -07002699 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002700 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002701
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002702 apiNdkLibs := []string{}
2703 apiLateNdkLibs := []string{}
2704
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002705 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002706 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2707 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2708 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2709 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2710 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002711 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002712
Yo Chiang219968c2020-09-22 18:45:04 +08002713 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2714
Colin Crosse0edaf92021-01-11 17:31:17 -08002715 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002716
Dan Albert914449f2016-06-17 16:45:24 -07002717 variantNdkLibs := []string{}
2718 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002719 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002720 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2721 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2722 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002723
2724 for idx, lib := range deps.RuntimeLibs {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002725 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002726 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002727 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002728
Colin Cross32ec36c2016-12-15 07:39:51 -08002729 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002730 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002731 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002732 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002733 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002734
Kiyoung Kim51279d32022-08-24 14:10:46 +09002735 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002736 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002737 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2738 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002739 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002740
Spandan Das73bcafc2022-08-18 23:26:00 +00002741 if c.isNDKStubLibrary() {
2742 // ndk_headers do not have any variations
2743 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002744 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002745 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002746 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002747 } else {
2748 actx.AddVariationDependencies(nil, depTag, lib)
2749 }
2750 }
2751
Dan Albertf1d14c72020-07-30 14:32:55 -07002752 if c.isNDKStubLibrary() {
2753 // NDK stubs depend on their implementation because the ABI dumps are
2754 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002755
Spandan Das8b08aea2023-03-14 19:29:34 +00002756 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2757 c.ImageVariation(),
2758 blueprint.Variation{Mutator: "link", Variation: "shared"},
2759 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002760 }
2761
Jiyong Park5d1598f2019-02-25 22:14:17 +09002762 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002763 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002764
Kiyoung Kim487689e2022-07-26 09:48:22 +09002765 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002766
Jiyong Park5d1598f2019-02-25 22:14:17 +09002767 actx.AddVariationDependencies([]blueprint.Variation{
2768 {Mutator: "link", Variation: "static"},
2769 }, depTag, lib)
2770 }
2771
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002772 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002773 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002774 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002775 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002776 }
Jiyong Parke3867542020-12-03 17:28:25 +09002777 if inList(lib, deps.ExcludeLibsForApex) {
2778 depTag.excludeInApex = true
2779 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002780
Kiyoung Kim487689e2022-07-26 09:48:22 +09002781 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002782
Dan Willemsen59339a22018-07-22 21:18:45 -07002783 actx.AddVariationDependencies([]blueprint.Variation{
2784 {Mutator: "link", Variation: "static"},
2785 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002786 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002787
Jooyung Han75568392020-03-20 04:29:24 +09002788 // staticUnwinderDep is treated as staticDep for Q apexes
2789 // so that native libraries/binaries are linked with static unwinder
2790 // because Q libc doesn't have unwinder APIs
2791 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002792 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002793 actx.AddVariationDependencies([]blueprint.Variation{
2794 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002795 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002796 }
2797
Jiyong Park7ed9de32018-10-15 22:25:07 +09002798 // shared lib names without the #version suffix
2799 var sharedLibNames []string
2800
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002801 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002802 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002803 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002804 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002805 }
Jiyong Parke3867542020-12-03 17:28:25 +09002806 if inList(lib, deps.ExcludeLibsForApex) {
2807 depTag.excludeInApex = true
2808 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002809 if inList(lib, deps.ExcludeLibsForNonApex) {
2810 depTag.excludeInNonApex = true
2811 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002812
Jiyong Park73c54ee2019-10-22 20:31:18 +09002813 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002814 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2815 name = apiLibraryName
2816 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002817 sharedLibNames = append(sharedLibNames, name)
2818
Colin Crosse7257d22020-09-24 09:56:18 -07002819 variations := []blueprint.Variation{
2820 {Mutator: "link", Variation: "shared"},
2821 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002822
2823 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2824 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2825 }
2826
2827 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2828 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2829 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002830 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002831
Colin Crossfe9acfe2021-06-14 16:13:03 -07002832 for _, lib := range deps.LateStaticLibs {
2833 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2834 actx.AddVariationDependencies([]blueprint.Variation{
2835 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002836 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Crossfe9acfe2021-06-14 16:13:03 -07002837 }
2838
Colin Cross3e5e7782022-06-17 22:17:05 +00002839 for _, lib := range deps.UnexportedStaticLibs {
2840 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2841 actx.AddVariationDependencies([]blueprint.Variation{
2842 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002843 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Cross3e5e7782022-06-17 22:17:05 +00002844 }
2845
Jiyong Park7ed9de32018-10-15 22:25:07 +09002846 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002847 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002848 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2849 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2850 // linking against both the stubs lib and the non-stubs lib at the same time.
2851 continue
2852 }
Colin Cross6e511a92020-07-27 21:26:48 -07002853 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002854 variations := []blueprint.Variation{
2855 {Mutator: "link", Variation: "shared"},
2856 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002857 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002858 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002859
Dan Willemsen59339a22018-07-22 21:18:45 -07002860 actx.AddVariationDependencies([]blueprint.Variation{
2861 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002862 }, dataLibDepTag, deps.DataLibs...)
2863
Colin Crossc8caa062021-09-24 16:50:14 -07002864 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2865
Chris Parsons79d66a52020-06-05 17:26:16 -04002866 actx.AddVariationDependencies([]blueprint.Variation{
2867 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002868 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002869
Colin Cross68861832016-07-08 10:41:41 -07002870 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002871
2872 for _, gen := range deps.GeneratedHeaders {
2873 depTag := genHeaderDepTag
2874 if inList(gen, deps.ReexportGeneratedHeaders) {
2875 depTag = genHeaderExportDepTag
2876 }
2877 actx.AddDependency(c, depTag, gen)
2878 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002879
Dan Albert92fe7402020-07-15 13:33:30 -07002880 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002881 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002882 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002883 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002884 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002885 }
Colin Crossc465efd2021-06-11 18:00:04 -07002886 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002887 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002888 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002889 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002890 if deps.DynamicLinker != "" {
2891 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002892 }
Dan Albert914449f2016-06-17 16:45:24 -07002893
2894 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002895
2896 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002897 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002898 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002899 {Mutator: "link", Variation: "shared"},
2900 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002901 actx.AddVariationDependencies([]blueprint.Variation{
2902 {Mutator: "version", Variation: version},
2903 {Mutator: "link", Variation: "shared"},
2904 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002905
2906 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002907 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002908 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002909 {Mutator: "link", Variation: "shared"},
2910 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002911 actx.AddVariationDependencies([]blueprint.Variation{
2912 {Mutator: "version", Variation: version},
2913 {Mutator: "link", Variation: "shared"},
2914 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002915
2916 if vndkdep := c.vndkdep; vndkdep != nil {
2917 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002918 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002919 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002920 {Mutator: "link", Variation: "shared"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002921 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002922 }
2923 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002924
Vinh Tran367d89d2023-04-28 11:21:25 -04002925 if len(deps.AidlLibs) > 0 {
2926 actx.AddDependency(
2927 c,
2928 aidlLibraryTag,
2929 deps.AidlLibs...,
2930 )
2931 }
2932
Kiyoung Kimee58c932022-10-25 22:59:41 +09002933 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002934}
Colin Cross21b9a242015-03-24 14:15:58 -07002935
Colin Crosse40b4ea2018-10-02 22:25:58 -07002936func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002937 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2938 c.beginMutator(ctx)
2939 }
2940}
2941
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002942// Whether a module can link to another module, taking into
2943// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002944func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002945 tag blueprint.DependencyTag) {
2946
2947 switch t := tag.(type) {
2948 case dependencyTag:
2949 if t != vndkExtDepTag {
2950 return
2951 }
2952 case libraryDependencyTag:
2953 default:
2954 return
2955 }
2956
Ivan Lozanof9e21722020-12-02 09:00:51 -05002957 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002958 // Host code is not restricted
2959 return
2960 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002961
2962 // VNDK is cc.Module supported only for now.
2963 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002964 // Though allowed dependency is limited by the image mutator,
2965 // each vendor and product module needs to check link-type
2966 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002967 if ccTo, ok := to.(*Module); ok {
2968 if ccFrom.vndkdep != nil {
2969 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2970 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002971 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002972 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002973 }
2974 return
2975 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002976 // TODO(b/244244438) : Remove this once all variants are implemented
2977 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2978 return
2979 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002980 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002981 // Platform code can link to anything
2982 return
2983 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002984 if from.InRamdisk() {
2985 // Ramdisk code is not NDK
2986 return
2987 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002988 if from.InVendorRamdisk() {
2989 // Vendor ramdisk code is not NDK
2990 return
2991 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002992 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002993 // Recovery code is not NDK
2994 return
2995 }
Colin Cross31076b32020-10-23 17:22:06 -07002996 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002997 if c.NdkPrebuiltStl() {
2998 // These are allowed, but they don't set sdk_version
2999 return
3000 }
3001 if c.StubDecorator() {
3002 // These aren't real libraries, but are the stub shared libraries that are included in
3003 // the NDK.
3004 return
3005 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003006 if c.isImportedApiLibrary() {
3007 // Imported library from the API surface is a stub library built against interface definition.
3008 return
3009 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003010 }
Logan Chien834b9a62019-01-14 15:39:03 +08003011
Ivan Lozano52767be2019-10-18 14:49:46 -07003012 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003013 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3014 // to link to libc++ (non-NDK and without sdk_version).
3015 return
3016 }
3017
Ivan Lozano52767be2019-10-18 14:49:46 -07003018 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003019 // NDK code linking to platform code is never okay.
3020 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003021 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003022 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003023 }
3024
3025 // At this point we know we have two NDK libraries, but we need to
3026 // check that we're not linking against anything built against a higher
3027 // API level, as it is only valid to link against older or equivalent
3028 // APIs.
3029
Inseob Kim01a28722018-04-11 09:48:45 +09003030 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003031 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003032 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003033 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003034 // Current can't be linked against by anything else.
3035 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003036 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003037 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003038 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003039 if err != nil {
3040 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003041 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003042 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003043 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003044 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003045 if err != nil {
3046 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003047 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003048 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003049 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003050
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003051 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003052 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003053 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003054 }
3055 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003056 }
Dan Albert202fe492017-12-15 13:56:59 -08003057
3058 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003059 fromStl := from.SelectedStl()
3060 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003061 if fromStl == "" || toStl == "" {
3062 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003063 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003064 // We can be permissive with the system "STL" since it is only the C++
3065 // ABI layer, but in the future we should make sure that everyone is
3066 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003067 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003068 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003069 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3070 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003071 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003072}
3073
Jooyung Han479ca172020-10-19 18:51:07 +09003074func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3075 if c, ok := ctx.Module().(*Module); ok {
3076 ctx.VisitDirectDeps(func(dep android.Module) {
3077 depTag := ctx.OtherModuleDependencyTag(dep)
3078 ccDep, ok := dep.(LinkableInterface)
3079 if ok {
3080 checkLinkType(ctx, c, ccDep, depTag)
3081 }
3082 })
3083 }
3084}
3085
Jiyong Park5fb8c102018-04-09 12:03:06 +09003086// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003087// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3088// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003089// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09003090func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
3091 check := func(child, parent android.Module) bool {
3092 to, ok := child.(*Module)
3093 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003094 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003095 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003096
Jooyung Hana70f0672019-01-18 15:20:43 +09003097 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3098 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003099 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003100
Jiyong Park0474e1f2021-01-14 14:26:06 +09003101 // These dependencies are not excercised at runtime. Tracking these will give us
3102 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003103 depTag := ctx.OtherModuleDependencyTag(child)
3104 if IsHeaderDepTag(depTag) {
3105 return false
3106 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003107 if depTag == staticVariantTag {
3108 return false
3109 }
3110 if depTag == stubImplDepTag {
3111 return false
3112 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003113
Justin Yun63e9ec72020-10-29 16:49:43 +09003114 // Even if target lib has no vendor variant, keep checking dependency
3115 // graph in case it depends on vendor_available or product_available
3116 // but not double_loadable transtively.
3117 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003118 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003119 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003120
Jiyong Park0474e1f2021-01-14 14:26:06 +09003121 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3122 // one.
3123 if Bool(to.VendorProperties.Double_loadable) {
3124 return true
3125 }
3126
Ivan Lozanod7586b62021-04-01 09:49:36 -04003127 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003128 return false
3129 }
3130
Jooyung Hana70f0672019-01-18 15:20:43 +09003131 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3132 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003133 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003134 return false
3135 }
3136 if module, ok := ctx.Module().(*Module); ok {
3137 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003138 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003139 ctx.WalkDeps(check)
3140 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003141 }
3142 }
3143}
3144
Yu Liue4312402023-01-18 09:15:31 -08003145func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3146 // For the dependency from platform to apex, use the latest stubs
3147 apexSdkVersion := android.FutureApiLevel
3148 if !apexInfo.IsForPlatform() {
3149 apexSdkVersion = apexInfo.MinSdkVersion
3150 }
3151
3152 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3153 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3154 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3155 // (b/144430859)
3156 apexSdkVersion = android.FutureApiLevel
3157 }
3158
3159 return apexSdkVersion
3160}
3161
Colin Crossc99deeb2016-04-11 15:06:20 -07003162// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003163func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003164 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003165
Colin Cross0de8a1e2020-09-18 14:15:30 -07003166 var directStaticDeps []StaticLibraryInfo
3167 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003168
Colin Cross0de8a1e2020-09-18 14:15:30 -07003169 reexportExporter := func(exporter FlagExporterInfo) {
3170 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3171 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3172 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3173 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3174 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003175 }
3176
Colin Cross56a83212020-09-15 18:30:11 -07003177 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
Yu Liue4312402023-01-18 09:15:31 -08003178 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003179
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003180 skipModuleList := map[string]bool{}
3181
3182 var apiImportInfo multitree.ApiImportInfo
3183 hasApiImportInfo := false
3184
3185 ctx.VisitDirectDeps(func(dep android.Module) {
3186 if dep.Name() == "api_imports" {
3187 apiImportInfo = ctx.OtherModuleProvider(dep, multitree.ApiImportsProvider).(multitree.ApiImportInfo)
3188 hasApiImportInfo = true
3189 }
3190 })
3191
3192 if hasApiImportInfo {
3193 targetStubModuleList := map[string]string{}
3194 targetOrigModuleList := map[string]string{}
3195
3196 // Search for dependency which both original module and API imported library with APEX stub exists
3197 ctx.VisitDirectDeps(func(dep android.Module) {
3198 depName := ctx.OtherModuleName(dep)
3199 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
3200 targetStubModuleList[apiLibrary] = depName
3201 }
3202 })
3203 ctx.VisitDirectDeps(func(dep android.Module) {
3204 depName := ctx.OtherModuleName(dep)
3205 if origLibrary, ok := targetStubModuleList[depName]; ok {
3206 targetOrigModuleList[origLibrary] = depName
3207 }
3208 })
3209
3210 // Decide which library should be used between original and API imported library
3211 ctx.VisitDirectDeps(func(dep android.Module) {
3212 depName := ctx.OtherModuleName(dep)
3213 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003214 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003215 skipModuleList[depName] = true
3216 } else {
3217 skipModuleList[apiLibrary] = true
3218 }
3219 }
3220 })
3221 }
3222
Colin Crossd11fcda2017-10-23 17:59:01 -07003223 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003224 depName := ctx.OtherModuleName(dep)
3225 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003226
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003227 if _, ok := skipModuleList[depName]; ok {
3228 // skip this module because original module or API imported module matching with this should be used instead.
3229 return
3230 }
3231
Dan Willemsen47450072021-10-19 20:24:49 -07003232 if depTag == android.DarwinUniversalVariantTag {
3233 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3234 return
3235 }
3236
Vinh Tran367d89d2023-04-28 11:21:25 -04003237 if depTag == aidlLibraryTag {
3238 if ctx.OtherModuleHasProvider(dep, aidl_library.AidlLibraryProvider) {
3239 depPaths.AidlLibraryInfos = append(
3240 depPaths.AidlLibraryInfos,
3241 ctx.OtherModuleProvider(
3242 dep,
3243 aidl_library.AidlLibraryProvider).(aidl_library.AidlLibraryInfo),
3244 )
3245 }
3246 }
3247
Ivan Lozano52767be2019-10-18 14:49:46 -07003248 ccDep, ok := dep.(LinkableInterface)
3249 if !ok {
3250
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003251 // handling for a few module types that aren't cc Module but that are also supported
3252 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003253 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003254 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003255 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3256 genRule.GeneratedSourceFiles()...)
3257 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003258 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003259 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003260 // Support exported headers from a generated_sources dependency
3261 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003262 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003263 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003264 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003265 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003266 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003267 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003268 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003269 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003270 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3271 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003272 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003273 // 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 +09003274 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003275
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003276 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003277 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003278 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003279 }
Colin Crosscef792e2021-06-11 18:01:26 -07003280 case CrtBeginDepTag:
3281 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3282 case CrtEndDepTag:
3283 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003284 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003285 return
3286 }
3287
Colin Crossfe17f6f2019-03-28 19:30:56 -07003288 if depTag == android.ProtoPluginDepTag {
3289 return
3290 }
3291
Colin Crossd11fcda2017-10-23 17:59:01 -07003292 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003293 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3294 return
3295 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003296 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003297 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3298 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003299 return
3300 }
3301
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003302 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003303 // Skip reused objects for stub libraries, they use their own stub object file instead.
3304 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3305 // version mutator, so the stubs variant is created from the shared variant that
3306 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003307 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07003308 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3309 objs := staticAnalogue.ReuseObjects
3310 depPaths.Objs = depPaths.Objs.Append(objs)
3311 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3312 reexportExporter(depExporterInfo)
3313 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003314 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003315 }
3316
Colin Cross6e511a92020-07-27 21:26:48 -07003317 linkFile := ccDep.OutputFile()
3318
3319 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3320 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003321 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003322 return
3323 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003324
Jiyong Parke3867542020-12-03 17:28:25 +09003325 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3326 return
3327 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003328 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3329 return
3330 }
Jiyong Parke3867542020-12-03 17:28:25 +09003331
Colin Cross0de8a1e2020-09-18 14:15:30 -07003332 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07003333
Colin Cross6e511a92020-07-27 21:26:48 -07003334 var ptr *android.Paths
3335 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003336
Colin Cross6e511a92020-07-27 21:26:48 -07003337 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003338
Colin Cross6e511a92020-07-27 21:26:48 -07003339 switch {
3340 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08003341 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
3342 if !ctx.Config().AllowMissingDependencies() {
3343 ctx.ModuleErrorf("module %q is not a header library", depName)
3344 } else {
3345 ctx.AddMissingDependencies([]string{depName})
3346 }
3347 return
3348 }
Colin Cross6e511a92020-07-27 21:26:48 -07003349 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003350 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
3351 if !ctx.Config().AllowMissingDependencies() {
3352 ctx.ModuleErrorf("module %q is not a shared library", depName)
3353 } else {
3354 ctx.AddMissingDependencies([]string{depName})
3355 }
3356 return
3357 }
Jiyong Parke3867542020-12-03 17:28:25 +09003358
Jiyong Park7d55b612021-06-11 17:22:09 +09003359 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3360 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003361
Jiyong Park1ad8e162020-12-01 23:40:09 +09003362 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3363 // linkFile, depFile, and ptr.
3364 if c.IsStubs() {
3365 break
3366 }
3367
Colin Cross0de8a1e2020-09-18 14:15:30 -07003368 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3369 depFile = sharedLibraryInfo.TableOfContents
3370
Colin Cross6e511a92020-07-27 21:26:48 -07003371 ptr = &depPaths.SharedLibs
3372 switch libDepTag.Order {
3373 case earlyLibraryDependency:
3374 ptr = &depPaths.EarlySharedLibs
3375 depPtr = &depPaths.EarlySharedLibsDeps
3376 case normalLibraryDependency:
3377 ptr = &depPaths.SharedLibs
3378 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003379 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003380 case lateLibraryDependency:
3381 ptr = &depPaths.LateSharedLibs
3382 depPtr = &depPaths.LateSharedLibsDeps
3383 default:
3384 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003385 }
Colin Cross6e511a92020-07-27 21:26:48 -07003386 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003387 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
3388 if !ctx.Config().AllowMissingDependencies() {
3389 ctx.ModuleErrorf("module %q is not a static library", depName)
3390 } else {
3391 ctx.AddMissingDependencies([]string{depName})
3392 }
3393 return
3394 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003395
3396 // Stubs lib doesn't link to the static lib dependencies. Don't set
3397 // linkFile, depFile, and ptr.
3398 if c.IsStubs() {
3399 break
3400 }
3401
Colin Cross0de8a1e2020-09-18 14:15:30 -07003402 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3403 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003404 if libDepTag.wholeStatic {
3405 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003406 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3407 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003408 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003409 // This case normally catches prebuilt static
3410 // libraries, but it can also occur when
3411 // AllowMissingDependencies is on and the
3412 // dependencies has no sources of its own
3413 // but has a whole_static_libs dependency
3414 // on a missing library. We want to depend
3415 // on the .a file so that there is something
3416 // in the dependency tree that contains the
3417 // error rule for the missing transitive
3418 // dependency.
3419 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003420 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003421 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3422 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003423 } else {
3424 switch libDepTag.Order {
3425 case earlyLibraryDependency:
3426 panic(fmt.Errorf("early static libs not suppported"))
3427 case normalLibraryDependency:
3428 // static dependencies will be handled separately so they can be ordered
3429 // using transitive dependencies.
3430 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003431 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003432 case lateLibraryDependency:
3433 ptr = &depPaths.LateStaticLibs
3434 default:
3435 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003436 }
3437 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003438 if libDepTag.unexportedSymbols {
3439 depPaths.LdFlags = append(depPaths.LdFlags,
3440 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3441 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003442 }
3443
Colin Cross6e511a92020-07-27 21:26:48 -07003444 if libDepTag.static() && !libDepTag.wholeStatic {
3445 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3446 ctx.ModuleErrorf("module %q not a static library", depName)
3447 return
3448 }
Logan Chien43d34c32017-12-20 01:17:32 +08003449
Colin Cross6e511a92020-07-27 21:26:48 -07003450 // When combining coverage files for shared libraries and executables, coverage files
3451 // in static libraries act as if they were whole static libraries. The same goes for
3452 // source based Abi dump files.
3453 if c, ok := ccDep.(*Module); ok {
3454 staticLib := c.linker.(libraryInterface)
3455 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3456 staticLib.objs().coverageFiles...)
3457 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3458 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003459 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003460 // Handle non-CC modules here
3461 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003462 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003463 }
3464 }
3465
Colin Cross6e511a92020-07-27 21:26:48 -07003466 if ptr != nil {
3467 if !linkFile.Valid() {
3468 if !ctx.Config().AllowMissingDependencies() {
3469 ctx.ModuleErrorf("module %q missing output file", depName)
3470 } else {
3471 ctx.AddMissingDependencies([]string{depName})
3472 }
3473 return
3474 }
3475 *ptr = append(*ptr, linkFile.Path())
3476 }
3477
3478 if depPtr != nil {
3479 dep := depFile
3480 if !dep.Valid() {
3481 dep = linkFile
3482 }
3483 *depPtr = append(*depPtr, dep.Path())
3484 }
3485
Colin Cross0de8a1e2020-09-18 14:15:30 -07003486 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3487 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3488 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3489 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3490
3491 if libDepTag.reexportFlags {
3492 reexportExporter(depExporterInfo)
3493 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3494 // Re-exported shared library headers must be included as well since they can help us with type information
3495 // about template instantiations (instantiated from their headers).
3496 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
3497 // scripts.
3498 c.sabi.Properties.ReexportedIncludes = append(
3499 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3500 }
3501
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003502 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003503 switch {
3504 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003505 c.Properties.AndroidMkHeaderLibs = append(
3506 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003507 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003508 if lib := moduleLibraryInterface(dep); lib != nil {
3509 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003510 // Add the dependency to the APEX(es) providing the library so that
3511 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07003512 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09003513 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003514 c.Properties.ApexesProvidingSharedLibs = append(
3515 c.Properties.ApexesProvidingSharedLibs, an)
3516 }
3517 }
3518 }
3519
3520 // Note: the order of libs in this list is not important because
3521 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003522 c.Properties.AndroidMkSharedLibs = append(
3523 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003524 // Record BaseLibName for snapshots.
3525 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003526 case libDepTag.static():
3527 if libDepTag.wholeStatic {
3528 c.Properties.AndroidMkWholeStaticLibs = append(
3529 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3530 } else {
3531 c.Properties.AndroidMkStaticLibs = append(
3532 c.Properties.AndroidMkStaticLibs, makeLibName)
3533 }
Justin Yun5e035862021-06-29 20:50:37 +09003534 // Record BaseLibName for snapshots.
3535 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003536 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003537 } else if !c.IsStubs() {
3538 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3539
Colin Cross6e511a92020-07-27 21:26:48 -07003540 switch depTag {
3541 case runtimeDepTag:
3542 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003543 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003544 // Record BaseLibName for snapshots.
3545 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003546 case objDepTag:
3547 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3548 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003549 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003550 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003551 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003552 case dynamicLinkerDepTag:
3553 depPaths.DynamicLinker = linkFile
3554 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003555 }
Colin Crossca860ac2016-01-04 14:34:37 -08003556 })
3557
Jeff Gaston294356f2017-09-27 17:05:30 -07003558 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003559 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3560 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3561 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003562
Colin Crossdd84e052017-05-17 13:44:16 -07003563 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003564 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003565 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3566 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003567 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003568 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3569 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003570 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003571 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003572 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003573
3574 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003575 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003576 }
Colin Crossdd84e052017-05-17 13:44:16 -07003577
Colin Crossca860ac2016-01-04 14:34:37 -08003578 return depPaths
3579}
3580
Spandan Das604f3762023-03-16 22:51:40 +00003581func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003582 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003583 thisModule, ok := ctx.Module().(android.ApexModule)
3584 if !ok {
3585 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3586 }
3587
3588 useVndk := false
3589 bootstrap := false
3590 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3591 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3592 } else {
3593 useVndk = linkable.UseVndk()
3594 bootstrap = linkable.Bootstrap()
3595 }
3596
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003597 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
3598
3599 useStubs := false
3600
3601 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3602 if !apexInfo.IsForPlatform() {
3603 // For platform libraries, use current version of LLNDK
3604 // If this is for use_vendor apex we will apply the same rules
3605 // of apex sdk enforcement below to choose right version.
3606 useStubs = true
3607 }
3608 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3609 // If not building for APEX or the containing APEX allows the use of
3610 // platform APIs, use stubs only when it is from an APEX (and not from
3611 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3612 // bootstrap modules, always link to non-stub variant
3613 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3614
3615 isApexImportedApiLibrary := false
3616
3617 if cc, ok := dep.(*Module); ok {
3618 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3619 if apiLibrary.hasApexStubs() {
3620 isApexImportedApiLibrary = true
3621 }
3622 }
3623 }
3624
3625 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3626
3627 if useStubs {
3628 // Another exception: if this module is a test for an APEX, then
3629 // it is linked with the non-stub variant of a module in the APEX
3630 // as if this is part of the APEX.
3631 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
3632 for _, apexContents := range testFor.ApexContents {
3633 if apexContents.DirectlyInApex(depName) {
3634 useStubs = false
3635 break
3636 }
3637 }
3638 }
3639 if useStubs {
3640 // Yet another exception: If this module and the dependency are
3641 // available to the same APEXes then skip stubs between their
3642 // platform variants. This complements the test_for case above,
3643 // which avoids the stubs on a direct APEX library dependency, by
3644 // avoiding stubs for indirect test dependencies as well.
3645 //
3646 // TODO(b/183882457): This doesn't work if the two libraries have
3647 // only partially overlapping apex_available. For that test_for
3648 // modules would need to be split into APEX variants and resolved
3649 // separately for each APEX they have access to.
3650 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3651 useStubs = false
3652 }
3653 }
3654 } else {
3655 // If building for APEX, use stubs when the parent is in any APEX that
3656 // the child is not in.
3657 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3658 }
3659
3660 return useStubs
3661}
3662
3663// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3664// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3665// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3666// has different level of updatability. For example, if a library foo in an APEX depends on a
3667// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3668// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3669// same APEX as foo, the non-stub variant of bar is used.
3670func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3671 depTag := ctx.OtherModuleDependencyTag(dep)
3672 libDepTag, ok := depTag.(libraryDependencyTag)
3673 if !ok || !libDepTag.shared() {
3674 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3675 }
3676
Jiyong Park7d55b612021-06-11 17:22:09 +09003677 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
3678 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3679 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Jiyong Park7d55b612021-06-11 17:22:09 +09003680
3681 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003682 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003683 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003684 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3685 toUse := stubs[len(stubs)-1]
3686 sharedLibraryInfo = toUse.SharedLibraryInfo
3687 depExporterInfo = toUse.FlagExporterInfo
3688 }
3689 }
3690 return sharedLibraryInfo, depExporterInfo
3691}
3692
Colin Cross0de8a1e2020-09-18 14:15:30 -07003693// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3694// to match the topological order of the dependency tree, including any static analogues of
3695// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3696// of the transitive dependencies.
Colin Crossc85750b2022-04-21 12:50:51 -07003697func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet[android.Path]) {
3698 transitiveStaticLibsBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003699 var staticPaths android.Paths
3700 for _, staticDep := range staticDeps {
3701 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3702 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3703 }
3704 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003705 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3706 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003707 }
3708 }
3709 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3710
3711 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3712
3713 // reorder the dependencies based on transitive dependencies
3714 staticPaths = android.FirstUniquePaths(staticPaths)
3715 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3716
3717 if len(orderedStaticPaths) != len(staticPaths) {
3718 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3719 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3720 }
3721
3722 return orderedStaticPaths, transitiveStaticLibs
3723}
3724
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003725// BaseLibName trims known prefixes and suffixes
3726func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003727 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3728 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003729 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003730 return libName
3731}
3732
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003733func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003734 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003735 ccDepModule, _ := ccDep.(*Module)
3736 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003737 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003738
Justin Yuncbca3732021-02-03 19:24:13 +09003739 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003740 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003741 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003742 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003743
Ivan Lozanod1dec542021-05-26 15:33:11 -04003744 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003745 }
3746 }
3747
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003748 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3749 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003750 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3751 // core module instead.
3752 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003753 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003754 // The vendor and product modules in Make will have been renamed to not conflict with the
3755 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003756 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003757 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003758 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003759 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003760 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003761 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003762 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003763 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003764 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003765 } else {
3766 return libName
3767 }
3768}
3769
Colin Crossca860ac2016-01-04 14:34:37 -08003770func (c *Module) InstallInData() bool {
3771 if c.installer == nil {
3772 return false
3773 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003774 return c.installer.inData()
3775}
3776
3777func (c *Module) InstallInSanitizerDir() bool {
3778 if c.installer == nil {
3779 return false
3780 }
3781 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003782 return true
3783 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003784 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003785}
3786
Yifan Hong1b3348d2020-01-21 15:53:22 -08003787func (c *Module) InstallInRamdisk() bool {
3788 return c.InRamdisk()
3789}
3790
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003791func (c *Module) InstallInVendorRamdisk() bool {
3792 return c.InVendorRamdisk()
3793}
3794
Jiyong Parkf9332f12018-02-01 00:54:12 +09003795func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003796 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003797}
3798
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003799func (c *Module) MakeUninstallable() {
3800 if c.installer == nil {
3801 c.ModuleBase.MakeUninstallable()
3802 return
3803 }
3804 c.installer.makeUninstallable(c)
3805}
3806
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003807func (c *Module) HostToolPath() android.OptionalPath {
3808 if c.installer == nil {
3809 return android.OptionalPath{}
3810 }
3811 return c.installer.hostToolPath()
3812}
3813
Nan Zhangd4e641b2017-07-12 12:55:28 -07003814func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3815 return c.outputFile
3816}
3817
Colin Cross41955e82019-05-29 14:40:35 -07003818func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3819 switch tag {
3820 case "":
3821 if c.outputFile.Valid() {
3822 return android.Paths{c.outputFile.Path()}, nil
3823 }
3824 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003825 case "unstripped":
3826 if c.linker != nil {
3827 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3828 }
3829 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003830 default:
3831 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003832 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003833}
3834
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003835func (c *Module) static() bool {
3836 if static, ok := c.linker.(interface {
3837 static() bool
3838 }); ok {
3839 return static.static()
3840 }
3841 return false
3842}
3843
Jiyong Park379de2f2018-12-19 02:47:14 +09003844func (c *Module) staticBinary() bool {
3845 if static, ok := c.linker.(interface {
3846 staticBinary() bool
3847 }); ok {
3848 return static.staticBinary()
3849 }
3850 return false
3851}
3852
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003853func (c *Module) testBinary() bool {
3854 if test, ok := c.linker.(interface {
3855 testBinary() bool
3856 }); ok {
3857 return test.testBinary()
3858 }
3859 return false
3860}
3861
Jingwen Chen537242c2022-08-24 11:53:27 +00003862func (c *Module) testLibrary() bool {
3863 if test, ok := c.linker.(interface {
3864 testLibrary() bool
3865 }); ok {
3866 return test.testLibrary()
3867 }
3868 return false
3869}
3870
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003871func (c *Module) benchmarkBinary() bool {
3872 if b, ok := c.linker.(interface {
3873 benchmarkBinary() bool
3874 }); ok {
3875 return b.benchmarkBinary()
3876 }
3877 return false
3878}
3879
3880func (c *Module) fuzzBinary() bool {
3881 if f, ok := c.linker.(interface {
3882 fuzzBinary() bool
3883 }); ok {
3884 return f.fuzzBinary()
3885 }
3886 return false
3887}
3888
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003889// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3890func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003891 if h, ok := c.linker.(interface {
3892 header() bool
3893 }); ok {
3894 return h.header()
3895 }
3896 return false
3897}
3898
Ivan Lozanod7586b62021-04-01 09:49:36 -04003899func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003900 if b, ok := c.linker.(interface {
3901 binary() bool
3902 }); ok {
3903 return b.binary()
3904 }
3905 return false
3906}
3907
Justin Yun5e035862021-06-29 20:50:37 +09003908func (c *Module) StaticExecutable() bool {
3909 if b, ok := c.linker.(*binaryDecorator); ok {
3910 return b.static()
3911 }
3912 return false
3913}
3914
Ivan Lozanod7586b62021-04-01 09:49:36 -04003915func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003916 if o, ok := c.linker.(interface {
3917 object() bool
3918 }); ok {
3919 return o.object()
3920 }
3921 return false
3922}
3923
Ivan Lozanof9e21722020-12-02 09:00:51 -05003924func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003925 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003926 if c.IsLlndk() {
3927 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003928 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003929 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003930 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003931 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003932 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003933 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003934 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003935 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003936 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003937 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003938 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003939 return "native:product"
3940 }
Jooyung Han38002912019-05-16 04:01:54 +09003941 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003942 } else if c.InRamdisk() {
3943 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003944 } else if c.InVendorRamdisk() {
3945 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003946 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003947 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003948 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003949 return "native:ndk:none:none"
3950 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3951 //family, link := getNdkStlFamilyAndLinkType(c)
3952 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003953 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003954 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003955 } else {
3956 return "native:platform"
3957 }
3958}
3959
Jiyong Park9d452992018-10-03 00:38:19 +09003960// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003961// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003962func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003963 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003964 // Stub libs and prebuilt libs in a versioned SDK are not
3965 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003966 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003967 } else if _, ok := c.linker.(testPerSrc); ok {
3968 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003969 }
3970 return false
3971}
3972
Jiyong Parka90ca002019-10-07 15:47:24 +09003973func (c *Module) AvailableFor(what string) bool {
3974 if linker, ok := c.linker.(interface {
3975 availableFor(string) bool
3976 }); ok {
3977 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3978 } else {
3979 return c.ApexModuleBase.AvailableFor(what)
3980 }
3981}
3982
Jiyong Park62304bb2020-04-13 16:19:48 +09003983func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003984 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003985}
3986
Paul Duffin0cb37b92020-03-04 14:52:46 +00003987func (c *Module) EverInstallable() bool {
3988 return c.installer != nil &&
3989 // Check to see whether the module is actually ever installable.
3990 c.installer.everInstallable()
3991}
3992
Ivan Lozanod7586b62021-04-01 09:49:36 -04003993func (c *Module) PreventInstall() bool {
3994 return c.Properties.PreventInstall
3995}
3996
3997func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003998 if c.library != nil {
3999 if i := c.library.installable(); i != nil {
4000 return i
4001 }
4002 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04004003 return c.Properties.Installable
4004}
4005
4006func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00004007 ret := c.EverInstallable() &&
4008 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04004009 proptools.BoolDefault(c.Installable(), true) &&
4010 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004011
4012 // The platform variant doesn't need further condition. Apex variants however might not
4013 // be installable because it will likely to be included in the APEX and won't appear
4014 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07004015 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004016 return ret
4017 }
4018
4019 // Special case for modules that are configured to be installed to /data, which includes
4020 // test modules. For these modules, both APEX and non-APEX variants are considered as
4021 // installable. This is because even the APEX variants won't be included in the APEX, but
4022 // will anyway be installed to /data/*.
4023 // See b/146995717
4024 if c.InstallInData() {
4025 return ret
4026 }
4027
4028 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09004029}
4030
Logan Chien41eabe62019-04-10 13:33:58 +08004031func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
4032 if c.linker != nil {
4033 if library, ok := c.linker.(*libraryDecorator); ok {
4034 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
4035 }
4036 }
4037}
4038
Jiyong Park45bf82e2020-12-15 22:29:02 +09004039var _ android.ApexModule = (*Module)(nil)
4040
4041// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004042func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07004043 depTag := ctx.OtherModuleDependencyTag(dep)
4044 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
4045
4046 if cc, ok := dep.(*Module); ok {
4047 if cc.HasStubsVariants() {
4048 if isLibDepTag && libDepTag.shared() {
4049 // dynamic dep to a stubs lib crosses APEX boundary
4050 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09004051 }
Colin Cross6e511a92020-07-27 21:26:48 -07004052 if IsRuntimeDepTag(depTag) {
4053 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09004054 return false
4055 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004056 }
Zhijun Heec285872021-04-24 10:47:08 -07004057 if cc.IsLlndk() {
4058 return false
4059 }
Colin Crossaac32222020-07-29 12:51:56 -07004060 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07004061 // shared_lib dependency from a static lib is considered as crossing
4062 // the APEX boundary because the dependency doesn't actually is
4063 // linked; the dependency is used only during the compilation phase.
4064 return false
4065 }
Jiyong Parke3867542020-12-03 17:28:25 +09004066
4067 if isLibDepTag && libDepTag.excludeInApex {
4068 return false
4069 }
Colin Cross6e511a92020-07-27 21:26:48 -07004070 }
Colin Crossc1b36442021-05-06 13:42:48 -07004071 if depTag == stubImplDepTag {
4072 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004073 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004074 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004075 if depTag == staticVariantTag {
4076 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4077 // actually mean that the static lib (and its dependencies) are copied into the
4078 // APEX.
4079 return false
4080 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004081 return true
4082}
4083
Jiyong Park45bf82e2020-12-15 22:29:02 +09004084// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07004085func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
4086 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09004087 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4088 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
4089 return nil
4090 }
Jooyung Han749dc692020-04-15 11:03:39 +09004091 // We don't check for prebuilt modules
4092 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4093 return nil
4094 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004095
Jooyung Han749dc692020-04-15 11:03:39 +09004096 minSdkVersion := c.MinSdkVersion()
4097 if minSdkVersion == "apex_inherit" {
4098 return nil
4099 }
4100 if minSdkVersion == "" {
4101 // JNI libs within APK-in-APEX fall into here
4102 // Those are okay to set sdk_version instead
4103 // We don't have to check if this is a SDK variant because
4104 // non-SDK variant resets sdk_version, which works too.
4105 minSdkVersion = c.SdkVersion()
4106 }
Dan Albertc8060532020-07-22 22:32:17 -07004107 if minSdkVersion == "" {
4108 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4109 }
4110 // Not using nativeApiLevelFromUser because the context here is not
4111 // necessarily a native context.
4112 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004113 if err != nil {
4114 return err
4115 }
Dan Albertc8060532020-07-22 22:32:17 -07004116
Colin Cross8ca61c12022-10-06 21:00:14 -07004117 // A dependency only needs to support a min_sdk_version at least
4118 // as high as the api level that the architecture was introduced in.
4119 // This allows introducing new architectures in the platform that
4120 // need to be included in apexes that normally require an older
4121 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004122 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004123 if sdkVersion.LessThan(minApiForArch) {
4124 sdkVersion = minApiForArch
4125 }
4126
Dan Albertc8060532020-07-22 22:32:17 -07004127 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004128 return fmt.Errorf("newer SDK(%v)", ver)
4129 }
4130 return nil
4131}
4132
Paul Duffinb5769c12021-05-12 16:16:51 +01004133// Implements android.ApexModule
4134func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4135 // stub libraries and native bridge libraries are always available to platform
4136 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4137}
4138
Jooyung Han91f92032022-02-04 12:36:33 +09004139// Overrides android.ApexModuleBase.UniqueApexVariations
4140func (c *Module) UniqueApexVariations() bool {
4141 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
4142 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
4143 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09004144 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09004145 return c.UseVndk() && c.IsVndk()
4146}
4147
Inseob Kima1888ce2022-10-04 14:42:02 +09004148func (c *Module) overriddenModules() []string {
4149 if o, ok := c.linker.(overridable); ok {
4150 return o.overriddenModules()
4151 }
4152 return nil
4153}
4154
Rob Seymour925aa092021-08-10 20:42:03 +00004155var _ snapshot.RelativeInstallPath = (*Module)(nil)
4156
Liz Kammer35ca77e2021-12-22 15:31:40 -05004157type moduleType int
4158
4159const (
4160 unknownType moduleType = iota
4161 binary
4162 object
4163 fullLibrary
4164 staticLibrary
4165 sharedLibrary
4166 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004167 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004168 ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004169 ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004170)
4171
4172func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004173 if c.testBinary() {
4174 // testBinary is also a binary, so this comes before the c.Binary()
4175 // conditional. A testBinary has additional implicit dependencies and
4176 // other test-only semantics.
4177 return testBin
4178 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004179 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004180 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004181 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004182 } else if c.testLibrary() {
4183 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4184 // will let them add implicit compile deps on gtest, for example.
4185 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004186 // For now, treat them as regular libraries.
4187 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004188 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004189 static := false
4190 shared := false
4191 if library, ok := c.linker.(*libraryDecorator); ok {
4192 static = library.MutatedProperties.BuildStatic
4193 shared = library.MutatedProperties.BuildShared
4194 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4195 static = library.MutatedProperties.BuildStatic
4196 shared = library.MutatedProperties.BuildShared
4197 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004198 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004199 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004200 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004201 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004202 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004203 return staticLibrary
4204 }
4205 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004206 } else if c.isNDKStubLibrary() {
4207 return ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004208 } else if c.IsNdkPrebuiltStl() {
4209 return ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004210 }
4211 return unknownType
4212}
4213
4214// ConvertWithBp2build converts Module to Bazel for bp2build.
Chris Parsons637458d2023-09-19 20:09:00 +00004215func (c *Module) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) {
Yu Liu855cfc22023-09-14 15:10:03 -07004216 if len(c.generators) > 0 {
4217 allConverted := true
4218 for _, generator := range c.generators {
Yu Liuf11b7c32023-10-20 19:15:51 +00004219 allConverted = allConverted && generator.GeneratorBp2build(ctx, c)
Yu Liu855cfc22023-09-14 15:10:03 -07004220 }
4221 if allConverted {
4222 return
4223 }
4224 }
4225
Liz Kammer35ca77e2021-12-22 15:31:40 -05004226 prebuilt := c.IsPrebuilt()
4227 switch c.typ() {
4228 case binary:
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxb12ff592022-09-01 15:04:04 +00004229 if prebuilt {
4230 prebuiltBinaryBp2Build(ctx, c)
4231 } else {
Jingwen Chen537242c2022-08-24 11:53:27 +00004232 binaryBp2build(ctx, c)
4233 }
4234 case testBin:
4235 if !prebuilt {
4236 testBinaryBp2build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004237 }
4238 case object:
Colin Crossc5075e92022-12-05 16:46:39 -08004239 if prebuilt {
4240 prebuiltObjectBp2Build(ctx, c)
4241 } else {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004242 objectBp2Build(ctx, c)
4243 }
4244 case fullLibrary:
4245 if !prebuilt {
4246 libraryBp2Build(ctx, c)
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004247 } else {
4248 prebuiltLibraryBp2Build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004249 }
4250 case headerLibrary:
4251 libraryHeadersBp2Build(ctx, c)
4252 case staticLibrary:
Liz Kammer35ca77e2021-12-22 15:31:40 -05004253 if prebuilt {
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004254 prebuiltLibraryStaticBp2Build(ctx, c, false)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004255 } else {
4256 sharedOrStaticLibraryBp2Build(ctx, c, true)
4257 }
4258 case sharedLibrary:
4259 if prebuilt {
4260 prebuiltLibrarySharedBp2Build(ctx, c)
4261 } else {
4262 sharedOrStaticLibraryBp2Build(ctx, c, false)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004263 }
Spandan Dase12d2522023-09-12 21:42:31 +00004264 case ndkPrebuiltStl:
4265 ndkPrebuiltStlBp2build(ctx, c)
Spandan Das63acae92023-09-14 22:34:34 +00004266 case ndkLibrary:
4267 ndkLibraryBp2build(ctx, c)
Chris Parsons39a16972023-06-08 14:28:51 +00004268 default:
4269 ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_TYPE_UNSUPPORTED, "")
Spandan Das8b4a5f32022-09-29 00:28:24 +00004270 }
4271}
4272
Colin Crosscfad1192015-11-02 16:43:11 -08004273// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004274type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004275 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004276 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004277 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004278}
4279
Patrice Arrudac249c712019-03-19 17:00:29 -07004280// cc_defaults provides a set of properties that can be inherited by other cc
4281// modules. A module can use the properties from a cc_defaults using
4282// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4283// merged (when possible) by prepending the default module's values to the
4284// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004285func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004286 return DefaultsFactory()
4287}
4288
Colin Cross36242852017-06-23 15:06:31 -07004289func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004290 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004291
Colin Cross36242852017-06-23 15:06:31 -07004292 module.AddProperties(props...)
4293 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004294 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004295 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004296 &BaseCompilerProperties{},
4297 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004298 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004299 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004300 &StaticProperties{},
4301 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004302 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004303 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004304 &TestLinkerProperties{},
4305 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004306 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004307 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004308 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004309 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004310 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004311 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004312 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004313 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004314 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004315 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004316 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004317 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004318 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004319 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004320 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004321 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4322 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004323 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004324 )
Colin Crosscfad1192015-11-02 16:43:11 -08004325
Jooyung Hancc372c52019-09-25 15:18:44 +09004326 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004327
4328 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004329}
4330
Jiyong Park2286afd2020-06-16 21:58:53 +09004331func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004332 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004333}
4334
Kiyoung Kim51279d32022-08-24 14:10:46 +09004335func (c *Module) isImportedApiLibrary() bool {
4336 _, ok := c.linker.(*apiLibraryDecorator)
4337 return ok
4338}
4339
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004340func kytheExtractAllFactory() android.Singleton {
4341 return &kytheExtractAllSingleton{}
4342}
4343
4344type kytheExtractAllSingleton struct {
4345}
4346
4347func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4348 var xrefTargets android.Paths
4349 ctx.VisitAllModules(func(module android.Module) {
4350 if ccModule, ok := module.(xref); ok {
4351 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4352 }
4353 })
4354 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4355 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004356 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004357 }
4358}
4359
Jihoon Kangf78a8902022-09-01 22:47:07 +00004360func (c *Module) Partition() string {
4361 if p, ok := c.installer.(interface {
4362 getPartition() string
4363 }); ok {
4364 return p.getPartition()
4365 }
4366 return ""
4367}
4368
Colin Cross06a931b2015-10-28 17:23:31 -07004369var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004370var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004371var BoolPtr = proptools.BoolPtr
4372var String = proptools.String
4373var StringPtr = proptools.StringPtr