blob: d2518a1353029873c372db61639eb71171c28164 [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
Colin Crossc472d572015-03-17 15:06:21 -0700145}
146
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500147// PathDeps is a struct containing file paths to dependencies of a module.
148// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
149// It's used to construct flags for various build statements (such as for compiling and linking).
150// It is then passed to module decorator functions responsible for registering build statements
151// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800152type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700153 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900154 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700155 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900156 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700157 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700158 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700159
Colin Cross0de8a1e2020-09-18 14:15:30 -0700160 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossc85750b2022-04-21 12:50:51 -0700161 TranstiveStaticLibrariesForOrdering *android.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700162
Colin Cross26c34ed2016-09-30 17:10:16 -0700163 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100164 Objs Objects
165 // Paths to .o files in dependencies that provide them. Note that these lists
166 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800167 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700168 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700169
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100170 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
171 // the libs from all whole_static_lib dependencies.
172 WholeStaticLibsFromPrebuilts android.Paths
173
Colin Cross26c34ed2016-09-30 17:10:16 -0700174 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700175 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900176 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700177
Inseob Kimd110f872019-12-06 13:15:38 +0900178 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000179 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900180 IncludeDirs android.Paths
181 SystemIncludeDirs android.Paths
182 ReexportedDirs android.Paths
183 ReexportedSystemDirs android.Paths
184 ReexportedFlags []string
185 ReexportedGeneratedHeaders android.Paths
186 ReexportedDeps android.Paths
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700187
Colin Cross26c34ed2016-09-30 17:10:16 -0700188 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700189 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700190
Dan Willemsena0790e32018-10-12 00:24:23 -0700191 // Path to the dynamic linker binary
192 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700193
194 // For Darwin builds, the path to the second architecture's output that should
195 // be combined with this architectures's output into a FAT MachO file.
196 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400197
198 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
199 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700200}
201
Colin Cross4af21ed2019-11-04 09:37:55 -0800202// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
203// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
204// command line so they can be overridden by the local module flags).
205type LocalOrGlobalFlags struct {
206 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700207 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800208 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700209 CFlags []string // Flags that apply to C and C++ source files
210 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
211 ConlyFlags []string // Flags that apply to C source files
212 CppFlags []string // Flags that apply to C++ source files
213 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700214 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800215}
216
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500217// Flags contains various types of command line flags (and settings) for use in building build
218// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800219type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500220 // Local flags (which individual modules are responsible for). These may override global flags.
221 Local LocalOrGlobalFlags
222 // Global flags (which build system or toolchain is responsible for).
Colin Cross4af21ed2019-11-04 09:37:55 -0800223 Global LocalOrGlobalFlags
224
225 aidlFlags []string // Flags that apply to aidl source files
226 rsFlags []string // Flags that apply to renderscript source files
227 libFlags []string // Flags to add libraries early to the link order
228 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
229 TidyFlags []string // Flags that apply to clang-tidy
230 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700231
Colin Crossc3199482017-03-30 15:03:04 -0700232 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800233 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700234 SystemIncludeFlags []string
235
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800236 Toolchain config.Toolchain
237 Tidy bool // True if ninja .tidy rules should be generated.
238 NeedTidyFiles bool // True if module link should depend on .tidy files
239 GcovCoverage bool // True if coverage files should be generated.
240 SAbiDump bool // True if header abi dumps should be generated.
241 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
Colin Crossca860ac2016-01-04 14:34:37 -0800242
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500243 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800244 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500245 // The target-device system path to the dynamic linker.
246 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800247
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700248 CFlagsDeps android.Paths // Files depended on by compiler flags
249 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800250
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500251 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700252 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800253
Colin Cross19878da2019-03-28 14:45:07 -0700254 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700255 protoC bool // Whether to use C instead of C++
256 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700257
258 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200259 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700260}
261
Colin Crossca860ac2016-01-04 14:34:37 -0800262// Properties used to compile all C or C++ modules
263type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700264 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800265 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700266
Jiyong Parkb35a8192020-08-10 15:59:36 +0900267 // The API level that this module is built against. The APIs of this API level will be
268 // visible at build time, but use of any APIs newer than min_sdk_version will render the
269 // module unloadable on older devices. In the future it will be possible to weakly-link new
270 // APIs, making the behavior match Java: such modules will load on older devices, but
271 // calling new APIs on devices that do not support them will result in a crash.
272 //
273 // This property has the same behavior as sdk_version does for Java modules. For those
274 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
275 // does for Java code.
276 //
277 // In addition, setting this property causes two variants to be built, one for the platform
278 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800279 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700280
Jiyong Parkb35a8192020-08-10 15:59:36 +0900281 // Minimum OS API level supported by this C or C++ module. This property becomes the value
282 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
283 // this property is also used to ensure that the min_sdk_version of the containing module is
284 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
285 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
286 // min_sdk_version of the containing APEX. When the module
287 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900288 Min_sdk_version *string
289
Colin Crossc511bc52020-04-07 16:50:32 +0000290 // If true, always create an sdk variant and don't create a platform variant.
291 Sdk_variant_only *bool
292
Jiyong Parkde866cb2018-12-07 23:08:36 +0900293 AndroidMkSharedLibs []string `blueprint:"mutated"`
294 AndroidMkStaticLibs []string `blueprint:"mutated"`
295 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
296 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
Bill Peckhama46de702020-04-21 17:23:37 -0700297 AndroidMkHeaderLibs []string `blueprint:"mutated"`
Jiyong Parkde866cb2018-12-07 23:08:36 +0900298 HideFromMake bool `blueprint:"mutated"`
299 PreventInstall bool `blueprint:"mutated"`
300 ApexesProvidingSharedLibs []string `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700301
Yo Chiang219968c2020-09-22 18:45:04 +0800302 // Set by DepsMutator.
303 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
304
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200305 // The name of the image this module is built for, suffixed with a '.'
Justin Yun5f7f7e82019-11-18 19:52:14 +0900306 ImageVariationPrefix string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200307
308 // The VNDK version this module is built against. If empty, the module is not
309 // build against the VNDK.
310 VndkVersion string `blueprint:"mutated"`
311
312 // Suffix for the name of Android.mk entries generated by this module
313 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800314
315 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
316 // file
317 Logtags []string
Jiyong Parkf9332f12018-02-01 00:54:12 +0900318
Yifan Hong39143a92020-10-26 12:43:12 -0700319 // Make this module available when building for ramdisk.
320 // On device without a dedicated recovery partition, the module is only
321 // available after switching root into
322 // /first_stage_ramdisk. To expose the module before switching root, install
323 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800324 Ramdisk_available *bool
325
Yifan Hong39143a92020-10-26 12:43:12 -0700326 // Make this module available when building for vendor ramdisk.
327 // On device without a dedicated recovery partition, the module is only
328 // available after switching root into
329 // /first_stage_ramdisk. To expose the module before switching root, install
330 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700331 Vendor_ramdisk_available *bool
332
Jiyong Parkf9332f12018-02-01 00:54:12 +0900333 // Make this module available when building for recovery
334 Recovery_available *bool
335
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200336 // Used by imageMutator, set by ImageMutatorBegin()
337 CoreVariantNeeded bool `blueprint:"mutated"`
338 RamdiskVariantNeeded bool `blueprint:"mutated"`
339 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
340 RecoveryVariantNeeded bool `blueprint:"mutated"`
341
342 // A list of variations for the "image" mutator of the form
343 //<image name> '.' <version char>, for example, 'vendor.S'
344 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900345
346 // Allows this module to use non-APEX version of libraries. Useful
347 // for building binaries that are started before APEXes are activated.
348 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900349
350 // Even if DeviceConfig().VndkUseCoreVariant() is set, this module must use vendor variant.
351 // see soong/cc/config/vndk.go
352 MustUseVendorVariant bool `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900353
354 // Used by vendor snapshot to record dependencies from snapshot modules.
355 SnapshotSharedLibs []string `blueprint:"mutated"`
Justin Yun5e035862021-06-29 20:50:37 +0900356 SnapshotStaticLibs []string `blueprint:"mutated"`
Inseob Kim8471cda2019-11-15 09:59:12 +0900357 SnapshotRuntimeLibs []string `blueprint:"mutated"`
Paul Duffin0cb37b92020-03-04 14:52:46 +0000358
Colin Cross1bc94122021-10-28 13:25:54 -0700359 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000360
361 // Set by factories of module types that can only be referenced from variants compiled against
362 // the SDK.
363 AlwaysSdk bool `blueprint:"mutated"`
364
365 // Variant is an SDK variant created by sdkMutator
366 IsSdkVariant bool `blueprint:"mutated"`
367 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
368 // variant to have a ".sdk" suffix.
369 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700370
371 // Normally Soong uses the directory structure to decide which modules
372 // should be included (framework) or excluded (non-framework) from the
Jose Galmes6f843bc2020-12-11 13:36:29 -0800373 // different snapshots (vendor, recovery, etc.), but this property
374 // allows a partner to exclude a module normally thought of as a
375 // framework module from the vendor snapshot.
376 Exclude_from_vendor_snapshot *bool
377
378 // Normally Soong uses the directory structure to decide which modules
379 // should be included (framework) or excluded (non-framework) from the
380 // different snapshots (vendor, recovery, etc.), but this property
381 // allows a partner to exclude a module normally thought of as a
382 // framework module from the recovery snapshot.
Jose Galmesf7294582020-11-13 12:07:36 -0800383 Exclude_from_recovery_snapshot *bool
Jiyong Park46a512f2020-12-04 18:02:13 +0900384
385 // List of APEXes that this module has private access to for testing purpose. The module
386 // can depend on libraries that are not exported by the APEXes and use private symbols
387 // from the exported libraries.
Martin Stjernholm855e90b2021-03-25 02:33:14 +0000388 Test_for []string `android:"arch_variant"`
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800389
390 Target struct {
391 Platform struct {
392 // List of modules required by the core variant.
393 Required []string `android:"arch_variant"`
394
395 // List of modules not required by the core variant.
396 Exclude_required []string `android:"arch_variant"`
397 } `android:"arch_variant"`
398
399 Recovery struct {
400 // List of modules required by the recovery variant.
401 Required []string `android:"arch_variant"`
402
403 // List of modules not required by the recovery variant.
404 Exclude_required []string `android:"arch_variant"`
405 } `android:"arch_variant"`
406 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700407}
408
409type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900410 // whether this module should be allowed to be directly depended by other
411 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900412 // If set to true, two variants will be built separately, one like
413 // normal, and the other limited to the set of libraries and headers
414 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700415 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900416 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700417 // so it shouldn't have any unversioned runtime dependencies, or
418 // make assumptions about the system that may not be true in the
419 // future.
420 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900421 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900422 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900423 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900424 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900425 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700426 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
427 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900428
Justin Yunebcf0c52021-01-08 18:00:19 +0900429 // This is the same as the "vendor_available" except that the install path
430 // of the vendor variant is /odm or /vendor/odm.
431 // By replacing "vendor_available: true" with "odm_available: true", the
432 // module will install its vendor variant to the /odm partition or /vendor/odm.
433 // As the modules with "odm_available: true" still create the vendor variants,
434 // they can link to the other vendor modules as the vendor_available modules do.
435 // Also, the vendor modules can link to odm_available modules.
436 //
437 // It may not be used for VNDK modules.
438 Odm_available *bool
439
Justin Yun63e9ec72020-10-29 16:49:43 +0900440 // whether this module should be allowed to be directly depended by other
441 // modules with `product_specific: true` or `product_available: true`.
442 // If set to true, an additional product variant will be built separately
443 // that is limited to the set of libraries and headers that are exposed to
444 // /product modules.
445 //
446 // The product variant may be used with a different (newer) /system,
447 // so it shouldn't have any unversioned runtime dependencies, or
448 // make assumptions about the system that may not be true in the
449 // future.
450 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900451 // If set to false, this module becomes inaccessible from /product modules.
452 //
453 // Different from the 'vendor_available' property, the modules with
454 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
455 // library without 'product_available' may not be depended on by any other
456 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900457 //
458 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
459 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
460 Product_available *bool
461
Jiyong Park5fb8c102018-04-09 12:03:06 +0900462 // whether this module is capable of being loaded with other instance
463 // (possibly an older version) of the same module in the same process.
464 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
465 // can be double loaded in a vendor process if the library is also a
466 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
467 // explicitly marked as `double_loadable: true` by the owner, or the dependency
468 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
469 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800470
471 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
472 IsLLNDK bool `blueprint:"mutated"`
473
Colin Cross78212242021-01-06 14:51:30 -0800474 // IsVNDKUsingCoreVariant is true for VNDK modules if the global VndkUseCoreVariant option is
475 // set and the module is not listed in VndkMustUseVendorVariantList.
476 IsVNDKUsingCoreVariant bool `blueprint:"mutated"`
477
478 // IsVNDKCore is set if a VNDK module does not set the vndk.support_system_process property.
479 IsVNDKCore bool `blueprint:"mutated"`
480
481 // IsVNDKSP is set if a VNDK module sets the vndk.support_system_process property.
482 IsVNDKSP bool `blueprint:"mutated"`
483
484 // IsVNDKPrivate is set if a VNDK module sets the vndk.private property or an LLNDK
485 // module sets the llndk.private property.
486 IsVNDKPrivate bool `blueprint:"mutated"`
487
488 // IsVNDKProduct is set if a VNDK module sets the product_available property.
489 IsVNDKProduct bool `blueprint:"mutated"`
Colin Cross5271fea2021-04-27 13:06:04 -0700490
491 // IsVendorPublicLibrary is set for the core and product variants of a library that has
492 // vendor_public_library stubs.
493 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800494}
495
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500496// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
497// to understanding details about the type of the current module.
498// For example, one might call these functions to determine whether the current module is a static
499// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800500type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800501 static() bool
502 staticBinary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700503 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800504 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900505 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900506 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900507 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700508 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900509 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700510 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800511 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900512 minSdkVersion() string
513 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700514 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700515 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800516 IsLlndk() bool
517 IsLlndkPublic() bool
518 isImplementationForLLNDKPublic() bool
519 IsVndkPrivate() bool
Justin Yun8effde42017-06-23 19:24:43 +0900520 isVndk() bool
521 isVndkSp() bool
Ivan Lozanof9e21722020-12-02 09:00:51 -0500522 IsVndkExt() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700523 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900524 inProduct() bool
525 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800526 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700527 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900528 inRecovery() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700529 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700530 baseModuleName() string
Logan Chienf3511742017-10-31 18:04:35 +0800531 getVndkExtendsModuleName() string
Yi Kong4ef54592022-02-14 20:00:10 +0800532 isAfdoCompile() bool
Yi Kong7e53c572018-02-14 18:16:12 +0800533 isPgoCompile() bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000534 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800535 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900536 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800537 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800538 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800539 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700540 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700541 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900542 bootstrap() bool
Vic Yangefd249e2018-11-12 20:19:56 -0800543 mustUseVendorVariant() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700544 nativeCoverage() bool
Colin Cross56a83212020-09-15 18:30:11 -0700545 directlyInAnyApex() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800546 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800547 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800548 getSharedFlags() *SharedFlags
549}
550
551type SharedFlags struct {
552 numSharedFlags int
553 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800554}
555
556type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700557 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800558 ModuleContextIntf
559}
560
561type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700562 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800563 ModuleContextIntf
564}
565
Colin Cross37047f12016-12-13 17:06:13 -0800566type DepsContext interface {
567 android.BottomUpMutatorContext
568 ModuleContextIntf
569}
570
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500571// feature represents additional (optional) steps to building cc-related modules, such as invocation
572// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800573type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800574 flags(ctx ModuleContext, flags Flags) Flags
575 props() []interface{}
576}
577
Joe Onorato37f900c2023-07-18 16:58:16 -0700578// Information returned from Generator about the source code it's generating
579type GeneratedSource struct {
580 IncludeDirs android.Paths
581 Sources android.Paths
582 Headers android.Paths
583 ReexportedDirs android.Paths
584}
585
586// generator allows injection of generated code
587type Generator interface {
588 GeneratorProps() []interface{}
589 GeneratorInit(ctx BaseModuleContext)
590 GeneratorDeps(ctx DepsContext, deps Deps) Deps
591 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
592 GeneratorSources(ctx ModuleContext) GeneratedSource
593 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
Yu Liuf11b7c32023-10-20 19:15:51 +0000594 GeneratorBp2build(ctx android.Bp2buildMutatorContext, module *Module) bool
Joe Onorato37f900c2023-07-18 16:58:16 -0700595}
596
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500597// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500598// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800599type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700600 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800601 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800602 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700603 compilerProps() []interface{}
604
Colin Cross76fada02016-07-27 10:31:13 -0700605 appendCflags([]string)
606 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700607 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800608}
609
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500610// linker is the interface for a linker decorator object. Individual module types can provide
611// their own implementation for this decorator, and thus specify custom logic regarding build
612// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800613type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700614 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800615 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700616 linkerFlags(ctx ModuleContext, flags Flags) Flags
617 linkerProps() []interface{}
Ivan Lozanobd721262018-11-27 14:33:03 -0800618 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700619
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700620 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700621 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900622 unstrippedOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700623
624 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900625 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000626
627 // Get the deps that have been explicitly specified in the properties.
Paul Duffin13f02712020-03-06 12:30:43 +0000628 linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
629}
630
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500631// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000632type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500633 sharedLibs []string
634 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
635 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700636 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800637}
638
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500639// installer is the interface for an installer helper object. This helper is responsible for
640// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800641type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700642 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700643 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000644 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800645 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700646 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700647 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900648 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000649 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900650 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800651}
652
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800653type xref interface {
654 XrefCcFiles() android.Paths
655}
656
Inseob Kima1888ce2022-10-04 14:42:02 +0900657type overridable interface {
658 overriddenModules() []string
659}
660
Colin Cross6e511a92020-07-27 21:26:48 -0700661type libraryDependencyKind int
662
663const (
664 headerLibraryDependency = iota
665 sharedLibraryDependency
666 staticLibraryDependency
667)
668
669func (k libraryDependencyKind) String() string {
670 switch k {
671 case headerLibraryDependency:
672 return "headerLibraryDependency"
673 case sharedLibraryDependency:
674 return "sharedLibraryDependency"
675 case staticLibraryDependency:
676 return "staticLibraryDependency"
677 default:
678 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
679 }
680}
681
682type libraryDependencyOrder int
683
684const (
685 earlyLibraryDependency = -1
686 normalLibraryDependency = 0
687 lateLibraryDependency = 1
688)
689
690func (o libraryDependencyOrder) String() string {
691 switch o {
692 case earlyLibraryDependency:
693 return "earlyLibraryDependency"
694 case normalLibraryDependency:
695 return "normalLibraryDependency"
696 case lateLibraryDependency:
697 return "lateLibraryDependency"
698 default:
699 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
700 }
701}
702
703// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
704// tags that have a set of predefined tag objects that are reused for each dependency, a
705// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
706// That means that comparing a libraryDependencyTag for equality will only be equal if all
707// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
708// then check individual metadata fields instead.
709type libraryDependencyTag struct {
710 blueprint.BaseDependencyTag
711
712 // These are exported so that fmt.Printf("%#v") can call their String methods.
713 Kind libraryDependencyKind
714 Order libraryDependencyOrder
715
716 wholeStatic bool
717
718 reexportFlags bool
719 explicitlyVersioned bool
720 dataLib bool
721 ndk bool
722
723 staticUnwinder bool
724
725 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900726
Cindy Zhou18417cb2020-12-10 07:12:38 -0800727 // Whether or not this dependency should skip the apex dependency check
728 skipApexAllowedDependenciesCheck bool
729
Jiyong Parke3867542020-12-03 17:28:25 +0900730 // Whether or not this dependency has to be followed for the apex variants
731 excludeInApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000732
733 // If true, don't automatically export symbols from the static library into a shared library.
734 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700735}
736
737// header returns true if the libraryDependencyTag is tagging a header lib dependency.
738func (d libraryDependencyTag) header() bool {
739 return d.Kind == headerLibraryDependency
740}
741
742// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
743func (d libraryDependencyTag) shared() bool {
744 return d.Kind == sharedLibraryDependency
745}
746
747// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
748func (d libraryDependencyTag) static() bool {
749 return d.Kind == staticLibraryDependency
750}
751
Colin Cross65cb3142021-12-10 23:05:02 +0000752func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
753 if d.shared() {
754 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
755 }
756 return nil
757}
758
759var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
760
Colin Crosse9fe2942020-11-10 18:12:15 -0800761// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
762// binaries or other shared libraries are installed as dependencies.
763func (d libraryDependencyTag) InstallDepNeeded() bool {
764 return d.shared()
765}
766
767var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
768
769// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700770// libraryDependencyTag. Each tag object is created globally and reused for multiple
771// dependencies (although since the object contains no references, assigning a tag to a
772// variable and modifying it will not modify the original). Users can compare the tag
773// returned by ctx.OtherModuleDependencyTag against the global original
774type dependencyTag struct {
775 blueprint.BaseDependencyTag
776 name string
777}
778
Colin Crosse9fe2942020-11-10 18:12:15 -0800779// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
780// libraryDependencyTag, but where the dependency needs to be installed when the parent is
781// installed.
782type installDependencyTag struct {
783 blueprint.BaseDependencyTag
784 android.InstallAlwaysNeededDependencyTag
785 name string
786}
787
Colin Crossc99deeb2016-04-11 15:06:20 -0700788var (
Colin Cross6e511a92020-07-27 21:26:48 -0700789 genSourceDepTag = dependencyTag{name: "gen source"}
790 genHeaderDepTag = dependencyTag{name: "gen header"}
791 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
792 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900793 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700794 reuseObjTag = dependencyTag{name: "reuse objects"}
795 staticVariantTag = dependencyTag{name: "static variant"}
796 vndkExtDepTag = dependencyTag{name: "vndk extends"}
797 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700798 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800799 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross6e511a92020-07-27 21:26:48 -0700800 testPerSrcDepTag = dependencyTag{name: "test_per_src"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700801 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000802 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500803 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400804 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700805)
806
Roland Levillainf89cd092019-07-29 16:22:59 +0100807func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700808 ccLibDepTag, ok := depTag.(libraryDependencyTag)
809 return ok && ccLibDepTag.shared()
810}
811
812func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
813 ccLibDepTag, ok := depTag.(libraryDependencyTag)
814 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100815}
816
Zach Johnson3df4e632020-11-06 11:56:27 -0800817func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
818 ccLibDepTag, ok := depTag.(libraryDependencyTag)
819 return ok && ccLibDepTag.header()
820}
821
Roland Levillainf89cd092019-07-29 16:22:59 +0100822func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800823 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100824}
825
826func IsTestPerSrcDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700827 ccDepTag, ok := depTag.(dependencyTag)
Roland Levillainf89cd092019-07-29 16:22:59 +0100828 return ok && ccDepTag == testPerSrcDepTag
829}
830
Chris Parsonsf874e462022-05-10 13:50:12 -0400831// bazelHandler is the interface for a helper object related to deferring to Bazel for
832// processing a cc module (during Bazel mixed builds). Individual module types should define
833// their own bazel handler if they support being handled by Bazel.
834type BazelHandler interface {
835 // QueueBazelCall invokes request-queueing functions on the BazelContext
836 //so that these requests are handled when Bazel's cquery is invoked.
837 QueueBazelCall(ctx android.BaseModuleContext, label string)
838
839 // ProcessBazelQueryResponse uses information retrieved from Bazel to set properties
840 // on the current module with given label.
841 ProcessBazelQueryResponse(ctx android.ModuleContext, label string)
842}
843
Colin Crossca860ac2016-01-04 14:34:37 -0800844// Module contains the properties and members used by all C/C++ module types, and implements
845// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500846// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
847// interface.
848//
849// To define a C/C++ related module, construct a new Module object and point its delegates to
850// type-specific structs. These delegates will be invoked to register module-specific build
851// statements which may be unique to the module type. For example, module.compiler.compile() should
852// be defined so as to register build statements which are responsible for compiling the module.
853//
854// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
855// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
856// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
857// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800858type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700859 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700860
Liz Kammerea6666f2021-02-17 10:17:28 -0500861 android.BazelModuleBase
Colin Crossc472d572015-03-17 15:06:21 -0700862
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700863 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700864 Properties BaseProperties
Colin Crossfa138792015-04-24 17:31:52 -0700865
Colin Crossca860ac2016-01-04 14:34:37 -0800866 // initialize before calling Init
Aditya Choudhary87b2ab22023-11-17 15:27:06 +0000867 hod android.HostOrDeviceSupported
868 multilib android.Multilib
869 bazelable bool
870 testModule bool
Colin Crossc472d572015-03-17 15:06:21 -0700871
Paul Duffina0843f62019-12-13 19:50:38 +0000872 // Allowable SdkMemberTypes of this module type.
873 sdkMemberTypes []android.SdkMemberType
874
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500875 // decorator delegates, initialize before calling Init
876 // these may contain module-specific implementations, and effectively allow for custom
877 // type-specific logic. These members may reference different objects or the same object.
878 // Functions of these decorators will be invoked to initialize and register type-specific
879 // build statements.
Joe Onorato37f900c2023-07-18 16:58:16 -0700880 generators []Generator
Chris Parsons8d6e4332021-02-22 16:13:50 -0500881 compiler compiler
882 linker linker
883 installer installer
Chris Parsonsf874e462022-05-10 13:50:12 -0400884 bazelHandler BazelHandler
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500885
Spandan Dase12d2522023-09-12 21:42:31 +0000886 features []feature
887 stl *stl
888 sanitize *sanitize
889 coverage *coverage
890 fuzzer *fuzzer
891 sabi *sabi
892 vndkdep *vndkdep
893 lto *lto
894 afdo *afdo
895 pgo *pgo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000896 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800897
Colin Cross31076b32020-10-23 17:22:06 -0700898 library libraryInterface
899
Colin Cross635c3b02016-05-18 15:37:25 -0700900 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800901
Colin Crossb98c8b02016-07-29 13:44:28 -0700902 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700903
904 subAndroidMkOnce map[subAndroidMkProvider]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800905
906 // Flags used to compile this module
907 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700908
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800909 // Shared flags among build rules of this module
910 sharedFlags SharedFlags
911
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800912 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700913 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900914
915 makeLinkType string
Sasha Smundak2a4549e2018-11-05 16:49:08 -0800916 // Kythe (source file indexer) paths for this compilation module
917 kytheFiles android.Paths
Chih-Hung Hsieh80783772021-10-11 16:46:56 -0700918 // Object .o file output paths for this compilation module
919 objFiles android.Paths
920 // Tidy .tidy file output paths for this compilation module
921 tidyFiles android.Paths
Jooyung Han75568392020-03-20 04:29:24 +0900922
923 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700924 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700925
926 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -0800927
928 // Aconfig files for all transitive deps. Also exposed via TransitiveDeclarationsInfo
929 transitiveAconfigFiles map[string]*android.DepSet[android.Path]
Colin Crossc472d572015-03-17 15:06:21 -0700930}
931
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200932func (c *Module) AddJSONData(d *map[string]interface{}) {
Liz Kammer74ec1682021-08-17 17:29:51 -0400933 var hasAidl, hasLex, hasProto, hasRenderscript, hasSysprop, hasWinMsg, hasYacc bool
934 if b, ok := c.compiler.(*baseCompiler); ok {
935 hasAidl = b.hasSrcExt(".aidl")
936 hasLex = b.hasSrcExt(".l") || b.hasSrcExt(".ll")
937 hasProto = b.hasSrcExt(".proto")
938 hasRenderscript = b.hasSrcExt(".rscript") || b.hasSrcExt(".fs")
939 hasSysprop = b.hasSrcExt(".sysprop")
940 hasWinMsg = b.hasSrcExt(".mc")
941 hasYacc = b.hasSrcExt(".y") || b.hasSrcExt(".yy")
942 }
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200943 c.AndroidModuleBase().AddJSONData(d)
944 (*d)["Cc"] = map[string]interface{}{
945 "SdkVersion": c.SdkVersion(),
946 "MinSdkVersion": c.MinSdkVersion(),
947 "VndkVersion": c.VndkVersion(),
948 "ProductSpecific": c.ProductSpecific(),
949 "SocSpecific": c.SocSpecific(),
950 "DeviceSpecific": c.DeviceSpecific(),
951 "InProduct": c.InProduct(),
952 "InVendor": c.InVendor(),
953 "InRamdisk": c.InRamdisk(),
954 "InVendorRamdisk": c.InVendorRamdisk(),
955 "InRecovery": c.InRecovery(),
956 "VendorAvailable": c.VendorAvailable(),
957 "ProductAvailable": c.ProductAvailable(),
958 "RamdiskAvailable": c.RamdiskAvailable(),
959 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
960 "RecoveryAvailable": c.RecoveryAvailable(),
961 "OdmAvailable": c.OdmAvailable(),
962 "InstallInData": c.InstallInData(),
963 "InstallInRamdisk": c.InstallInRamdisk(),
964 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
965 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
966 "InstallInRecovery": c.InstallInRecovery(),
967 "InstallInRoot": c.InstallInRoot(),
968 "IsVndk": c.IsVndk(),
969 "IsVndkExt": c.IsVndkExt(),
970 "IsVndkPrivate": c.IsVndkPrivate(),
971 "IsVndkSp": c.IsVndkSp(),
972 "IsLlndk": c.IsLlndk(),
973 "IsLlndkPublic": c.IsLlndkPublic(),
974 "IsSnapshotLibrary": c.IsSnapshotLibrary(),
975 "IsSnapshotPrebuilt": c.IsSnapshotPrebuilt(),
976 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
977 "ApexSdkVersion": c.apexSdkVersion,
978 "TestFor": c.TestFor(),
Liz Kammer74ec1682021-08-17 17:29:51 -0400979 "AidlSrcs": hasAidl,
980 "LexSrcs": hasLex,
981 "ProtoSrcs": hasProto,
982 "RenderscriptSrcs": hasRenderscript,
983 "SyspropSrcs": hasSysprop,
984 "WinMsgSrcs": hasWinMsg,
985 "YaccSrsc": hasYacc,
986 "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200987 }
988}
989
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500990func (c *Module) SetPreventInstall() {
991 c.Properties.PreventInstall = true
992}
993
994func (c *Module) SetHideFromMake() {
995 c.Properties.HideFromMake = true
996}
997
Ivan Lozanod7586b62021-04-01 09:49:36 -0400998func (c *Module) HiddenFromMake() bool {
999 return c.Properties.HideFromMake
1000}
1001
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001002func (c *Module) RequiredModuleNames() []string {
1003 required := android.CopyOf(c.ModuleBase.RequiredModuleNames())
1004 if c.ImageVariation().Variation == android.CoreVariation {
1005 required = append(required, c.Properties.Target.Platform.Required...)
1006 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1007 } else if c.InRecovery() {
1008 required = append(required, c.Properties.Target.Recovery.Required...)
1009 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1010 }
1011 return android.FirstUniqueStrings(required)
1012}
1013
Ivan Lozano52767be2019-10-18 14:49:46 -07001014func (c *Module) Toc() android.OptionalPath {
1015 if c.linker != nil {
1016 if library, ok := c.linker.(libraryInterface); ok {
1017 return library.toc()
1018 }
1019 }
1020 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1021}
1022
1023func (c *Module) ApiLevel() string {
1024 if c.linker != nil {
1025 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001026 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001027 }
1028 }
1029 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1030}
1031
1032func (c *Module) Static() bool {
1033 if c.linker != nil {
1034 if library, ok := c.linker.(libraryInterface); ok {
1035 return library.static()
1036 }
1037 }
1038 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1039}
1040
1041func (c *Module) Shared() bool {
1042 if c.linker != nil {
1043 if library, ok := c.linker.(libraryInterface); ok {
1044 return library.shared()
1045 }
1046 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001047
Ivan Lozano52767be2019-10-18 14:49:46 -07001048 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1049}
1050
1051func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001052 if c.stl != nil {
1053 return c.stl.Properties.SelectedStl
1054 }
1055 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001056}
1057
Ivan Lozano52767be2019-10-18 14:49:46 -07001058func (c *Module) NdkPrebuiltStl() bool {
1059 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1060 return true
1061 }
1062 return false
1063}
1064
1065func (c *Module) StubDecorator() bool {
1066 if _, ok := c.linker.(*stubDecorator); ok {
1067 return true
1068 }
1069 return false
1070}
1071
1072func (c *Module) SdkVersion() string {
1073 return String(c.Properties.Sdk_version)
1074}
1075
Artur Satayev480e25b2020-04-27 18:53:18 +01001076func (c *Module) MinSdkVersion() string {
1077 return String(c.Properties.Min_sdk_version)
1078}
1079
Jiyong Park5df7bd32021-08-25 16:18:46 +09001080func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001081 if linker, ok := c.linker.(*objectLinker); ok {
1082 return linker.isCrt()
1083 }
1084 return false
1085}
1086
Jiyong Park5df7bd32021-08-25 16:18:46 +09001087func (c *Module) SplitPerApiLevel() bool {
1088 return c.canUseSdk() && c.isCrt()
1089}
1090
Colin Crossc511bc52020-04-07 16:50:32 +00001091func (c *Module) AlwaysSdk() bool {
1092 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1093}
1094
Ivan Lozano183a3212019-10-18 14:18:45 -07001095func (c *Module) CcLibrary() bool {
1096 if c.linker != nil {
1097 if _, ok := c.linker.(*libraryDecorator); ok {
1098 return true
1099 }
Colin Crossd48fe732020-09-23 20:37:24 -07001100 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1101 return true
1102 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001103 }
1104 return false
1105}
1106
1107func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001108 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001109 return true
1110 }
1111 return false
1112}
1113
Spandan Dase12d2522023-09-12 21:42:31 +00001114func (c *Module) IsNdkPrebuiltStl() bool {
1115 if c.linker == nil {
1116 return false
1117 }
1118 if _, ok := c.linker.(*ndkPrebuiltStlLinker); ok {
1119 return true
1120 }
1121 return false
1122}
1123
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001124func (c *Module) RlibStd() bool {
1125 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1126}
1127
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001128func (c *Module) RustLibraryInterface() bool {
1129 return false
1130}
1131
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001132func (c *Module) IsFuzzModule() bool {
1133 if _, ok := c.compiler.(*fuzzBinary); ok {
1134 return true
1135 }
1136 return false
1137}
1138
1139func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1140 return c.FuzzModule
1141}
1142
1143func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1144 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1145 return fuzzer.fuzzPackagedModule
1146 }
1147 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1148}
1149
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001150func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001151 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1152 return fuzzer.sharedLibraries
1153 }
1154 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1155}
1156
Ivan Lozano2b262972019-11-21 12:30:50 -08001157func (c *Module) NonCcVariants() bool {
1158 return false
1159}
1160
Ivan Lozano183a3212019-10-18 14:18:45 -07001161func (c *Module) SetStatic() {
1162 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001163 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001164 library.setStatic()
1165 return
1166 }
1167 }
1168 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1169}
1170
1171func (c *Module) SetShared() {
1172 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001173 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001174 library.setShared()
1175 return
1176 }
1177 }
1178 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1179}
1180
1181func (c *Module) BuildStaticVariant() bool {
1182 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001183 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001184 return library.buildStatic()
1185 }
1186 }
1187 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1188}
1189
1190func (c *Module) BuildSharedVariant() bool {
1191 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001192 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001193 return library.buildShared()
1194 }
1195 }
1196 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1197}
1198
1199func (c *Module) Module() android.Module {
1200 return c
1201}
1202
Jiyong Parkc20eee32018-09-05 22:36:17 +09001203func (c *Module) OutputFile() android.OptionalPath {
1204 return c.outputFile
1205}
1206
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001207func (c *Module) CoverageFiles() android.Paths {
1208 if c.linker != nil {
1209 if library, ok := c.linker.(libraryInterface); ok {
1210 return library.objs().coverageFiles
1211 }
1212 }
1213 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1214}
1215
Ivan Lozano183a3212019-10-18 14:18:45 -07001216var _ LinkableInterface = (*Module)(nil)
1217
Jiyong Park719b4462019-01-13 00:39:51 +09001218func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001219 if c.linker != nil {
1220 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001221 }
1222 return nil
1223}
1224
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001225func (c *Module) CoverageOutputFile() android.OptionalPath {
1226 if c.linker != nil {
1227 return c.linker.coverageOutputFilePath()
1228 }
1229 return android.OptionalPath{}
1230}
1231
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001232func (c *Module) RelativeInstallPath() string {
1233 if c.installer != nil {
1234 return c.installer.relativeInstallPath()
1235 }
1236 return ""
1237}
1238
Jooyung Han344d5432019-08-23 11:17:39 +09001239func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001240 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001241}
1242
Colin Cross36242852017-06-23 15:06:31 -07001243func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001244 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001245 for _, generator := range c.generators {
1246 c.AddProperties(generator.GeneratorProps()...)
1247 }
Colin Crossca860ac2016-01-04 14:34:37 -08001248 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001249 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001250 }
1251 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001252 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001253 }
1254 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001255 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001256 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001257 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001258 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001259 }
Colin Cross16b23492016-01-06 14:41:07 -08001260 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001261 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001262 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001263 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001264 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001265 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001266 if c.fuzzer != nil {
1267 c.AddProperties(c.fuzzer.props()...)
1268 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001269 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001270 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001271 }
Justin Yun8effde42017-06-23 19:24:43 +09001272 if c.vndkdep != nil {
1273 c.AddProperties(c.vndkdep.props()...)
1274 }
Stephen Craneba090d12017-05-09 15:44:35 -07001275 if c.lto != nil {
1276 c.AddProperties(c.lto.props()...)
1277 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001278 if c.afdo != nil {
1279 c.AddProperties(c.afdo.props()...)
1280 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001281 if c.pgo != nil {
1282 c.AddProperties(c.pgo.props()...)
1283 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001284 if c.orderfile != nil {
1285 c.AddProperties(c.orderfile.props()...)
1286 }
Colin Crossca860ac2016-01-04 14:34:37 -08001287 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001288 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001289 }
Colin Crossc472d572015-03-17 15:06:21 -07001290
Colin Cross36242852017-06-23 15:06:31 -07001291 android.InitAndroidArchModule(c, c.hod, c.multilib)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001292 if c.bazelable {
1293 android.InitBazelModule(c)
1294 }
Jiyong Park7916bfc2019-09-30 19:13:12 +09001295 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001296 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001297
Colin Cross36242852017-06-23 15:06:31 -07001298 return c
Colin Crossc472d572015-03-17 15:06:21 -07001299}
1300
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001301// UseVndk() returns true if this module is built against VNDK.
1302// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001303func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001304 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001305}
1306
Colin Crossc511bc52020-04-07 16:50:32 +00001307func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001308 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
1309 !c.UseVndk() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001310}
1311
1312func (c *Module) UseSdk() bool {
1313 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001314 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001315 }
1316 return false
1317}
1318
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001319func (c *Module) isCoverageVariant() bool {
1320 return c.coverage.Properties.IsCoverageVariant
1321}
1322
Colin Cross95f1ca02020-10-29 20:47:22 -07001323func (c *Module) IsNdk(config android.Config) bool {
1324 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001325}
1326
Colin Cross127bb8b2020-12-16 16:46:01 -08001327func (c *Module) IsLlndk() bool {
1328 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001329}
1330
Colin Cross127bb8b2020-12-16 16:46:01 -08001331func (c *Module) IsLlndkPublic() bool {
Colin Cross78212242021-01-06 14:51:30 -08001332 return c.VendorProperties.IsLLNDK && !c.VendorProperties.IsVNDKPrivate
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001333}
1334
Colin Cross1f3f1302021-04-26 18:37:44 -07001335func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001336 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001337 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001338}
1339
Colin Cross5271fea2021-04-27 13:06:04 -07001340func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1341 lib := moduleLibraryInterface(m)
1342 return lib != nil && (lib.hasVendorPublicLibrary())
1343}
1344
1345// IsVendorPublicLibrary returns true for vendor public libraries.
1346func (c *Module) IsVendorPublicLibrary() bool {
1347 return c.VendorProperties.IsVendorPublicLibrary
1348}
1349
Ivan Lozanof1868af2022-04-12 13:08:36 -04001350func (c *Module) IsVndkPrebuiltLibrary() bool {
1351 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1352 return true
1353 }
1354 return false
1355}
1356
1357func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1358 return c.Properties.SdkAndPlatformVariantVisibleToMake
1359}
1360
Ivan Lozanod7586b62021-04-01 09:49:36 -04001361func (c *Module) HasLlndkStubs() bool {
1362 lib := moduleLibraryInterface(c)
1363 return lib != nil && lib.hasLLNDKStubs()
1364}
1365
1366func (c *Module) StubsVersion() string {
1367 if lib, ok := c.linker.(versionedInterface); ok {
1368 return lib.stubsVersion()
1369 }
1370 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1371}
1372
Colin Cross127bb8b2020-12-16 16:46:01 -08001373// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1374// and does not set llndk.vendor_available: false.
1375func (c *Module) isImplementationForLLNDKPublic() bool {
1376 library, _ := c.library.(*libraryDecorator)
1377 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001378 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001379}
1380
Justin Yunfd9e8042020-12-23 18:23:14 +09001381// Returns true for LLNDK-private, VNDK-SP-private, and VNDK-core-private.
Colin Cross127bb8b2020-12-16 16:46:01 -08001382func (c *Module) IsVndkPrivate() bool {
Justin Yunfd9e8042020-12-23 18:23:14 +09001383 // Check if VNDK-core-private or VNDK-SP-private
1384 if c.IsVndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001385 return Bool(c.vndkdep.Properties.Vndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001386 }
1387
1388 // Check if LLNDK-private
1389 if library, ok := c.library.(*libraryDecorator); ok && c.IsLlndk() {
Justin Yunc0d8c492021-01-07 17:45:31 +09001390 return Bool(library.Properties.Llndk.Private)
Justin Yunfd9e8042020-12-23 18:23:14 +09001391 }
1392
1393 return false
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001394}
1395
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001396// IsVndk() returns true if this module has a vndk variant.
1397// Note that IsVndk() returns true for all variants of vndk-enabled libraries. Not only vendor variant,
1398// but also platform and product variants of vndk-enabled libraries return true for IsVndk().
Ivan Lozano52767be2019-10-18 14:49:46 -07001399func (c *Module) IsVndk() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001400 if vndkdep := c.vndkdep; vndkdep != nil {
1401 return vndkdep.isVndk()
Justin Yun8effde42017-06-23 19:24:43 +09001402 }
1403 return false
1404}
1405
Yi Kong4ef54592022-02-14 20:00:10 +08001406func (c *Module) isAfdoCompile() bool {
1407 if afdo := c.afdo; afdo != nil {
Vinh Tran44cb78c2023-03-09 22:07:19 -05001408 return afdo.Properties.FdoProfilePath != nil
Yi Kong4ef54592022-02-14 20:00:10 +08001409 }
1410 return false
1411}
1412
Yi Kong7e53c572018-02-14 18:16:12 +08001413func (c *Module) isPgoCompile() bool {
1414 if pgo := c.pgo; pgo != nil {
1415 return pgo.Properties.PgoCompile
1416 }
1417 return false
1418}
1419
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001420func (c *Module) isOrderfileCompile() bool {
1421 if orderfile := c.orderfile; orderfile != nil {
1422 return orderfile.Properties.OrderfileLoad
1423 }
1424 return false
1425}
1426
Yi Kongc702ebd2022-08-19 16:02:45 +08001427func (c *Module) isCfi() bool {
1428 if sanitize := c.sanitize; sanitize != nil {
Yi Kongddffe722023-07-18 16:40:36 +09001429 return Bool(sanitize.Properties.SanitizeMutated.Cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001430 }
1431 return false
1432}
1433
Yi Konged79fa32023-06-04 17:15:42 +09001434func (c *Module) isFuzzer() bool {
1435 if sanitize := c.sanitize; sanitize != nil {
1436 return Bool(sanitize.Properties.SanitizeMutated.Fuzzer)
1437 }
1438 return false
1439}
1440
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001441func (c *Module) isNDKStubLibrary() bool {
1442 if _, ok := c.compiler.(*stubDecorator); ok {
1443 return true
1444 }
1445 return false
1446}
1447
Ivan Lozanod7586b62021-04-01 09:49:36 -04001448func (c *Module) IsVndkSp() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001449 if vndkdep := c.vndkdep; vndkdep != nil {
1450 return vndkdep.isVndkSp()
1451 }
1452 return false
1453}
1454
Ivan Lozanof9e21722020-12-02 09:00:51 -05001455func (c *Module) IsVndkExt() bool {
Logan Chienf3511742017-10-31 18:04:35 +08001456 if vndkdep := c.vndkdep; vndkdep != nil {
1457 return vndkdep.isVndkExt()
1458 }
1459 return false
1460}
1461
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001462func (c *Module) SubName() string {
1463 return c.Properties.SubName
1464}
1465
Ivan Lozano52767be2019-10-18 14:49:46 -07001466func (c *Module) MustUseVendorVariant() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001467 return c.IsVndkSp() || c.Properties.MustUseVendorVariant
Vic Yangefd249e2018-11-12 20:19:56 -08001468}
1469
Logan Chienf3511742017-10-31 18:04:35 +08001470func (c *Module) getVndkExtendsModuleName() string {
1471 if vndkdep := c.vndkdep; vndkdep != nil {
1472 return vndkdep.getVndkExtendsModuleName()
1473 }
1474 return ""
1475}
1476
Jiyong Park25fc6a92018-11-18 18:02:45 +09001477func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001478 if lib := c.library; lib != nil {
1479 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001480 }
1481 return false
1482}
1483
1484func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001485 if lib := c.library; lib != nil {
1486 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001487 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001488 return false
1489}
1490
Alan Stokes73feba32022-11-14 12:21:24 +00001491func (c *Module) IsStubsImplementationRequired() bool {
1492 if lib := c.library; lib != nil {
1493 return lib.isStubsImplementationRequired()
1494 }
1495 return false
1496}
1497
Colin Cross0477b422020-10-13 18:43:54 -07001498// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1499// the implementation. If it is an implementation library it returns its own name.
1500func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1501 name := ctx.OtherModuleName(c)
1502 if versioned, ok := c.linker.(versionedInterface); ok {
1503 name = versioned.implementationModuleName(name)
1504 }
1505 return name
1506}
1507
Martin Stjernholm2856c662020-12-02 15:03:42 +00001508// Similar to ImplementationModuleName, but uses the Make variant of the module
1509// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1510// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1511// under the premise that the prebuilt module overrides its source counterpart
1512// if it is exposed to Make).
1513func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1514 name := c.BaseModuleName()
1515 if versioned, ok := c.linker.(versionedInterface); ok {
1516 name = versioned.implementationModuleName(name)
1517 }
1518 return name
1519}
1520
Jiyong Park7d55b612021-06-11 17:22:09 +09001521func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001522 return Bool(c.Properties.Bootstrap)
1523}
1524
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001525func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001526 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1527 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1528 return false
1529 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001530 return c.linker != nil && c.linker.nativeCoverage()
1531}
1532
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001533func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001534 if p, ok := c.linker.(SnapshotInterface); ok {
1535 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001536 }
1537 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001538}
1539
Bill Peckham945441c2020-08-31 16:07:58 -07001540func (c *Module) ExcludeFromVendorSnapshot() bool {
1541 return Bool(c.Properties.Exclude_from_vendor_snapshot)
1542}
1543
Jose Galmesf7294582020-11-13 12:07:36 -08001544func (c *Module) ExcludeFromRecoverySnapshot() bool {
1545 return Bool(c.Properties.Exclude_from_recovery_snapshot)
1546}
1547
Jiyong Parkf1194352019-02-25 11:05:47 +09001548func isBionic(name string) bool {
1549 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001550 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001551 return true
1552 }
1553 return false
1554}
1555
Martin Stjernholm279de572019-09-10 23:18:20 +01001556func InstallToBootstrap(name string, config android.Config) bool {
Jingwen Chen29743c82023-01-25 17:49:46 +00001557 // NOTE: also update //build/bazel/rules/apex/cc.bzl#_installed_to_bootstrap
1558 // if this list is updated.
Florian Mayer95cd6db2023-03-23 17:48:07 -07001559 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001560 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001561 }
1562 return isBionic(name)
1563}
1564
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001565func (c *Module) XrefCcFiles() android.Paths {
1566 return c.kytheFiles
1567}
1568
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001569func (c *Module) isCfiAssemblySupportEnabled() bool {
1570 return c.sanitize != nil &&
1571 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1572}
1573
Inseob Kim800d1142021-06-14 12:03:51 +09001574func (c *Module) InstallInRoot() bool {
1575 return c.installer != nil && c.installer.installInRoot()
1576}
1577
Colin Crossca860ac2016-01-04 14:34:37 -08001578type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001579 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001580 moduleContextImpl
1581}
1582
Colin Cross37047f12016-12-13 17:06:13 -08001583type depsContext struct {
1584 android.BottomUpMutatorContext
1585 moduleContextImpl
1586}
1587
Colin Crossca860ac2016-01-04 14:34:37 -08001588type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001589 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001590 moduleContextImpl
1591}
1592
1593type moduleContextImpl struct {
1594 mod *Module
1595 ctx BaseModuleContext
1596}
1597
Colin Crossb98c8b02016-07-29 13:44:28 -07001598func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001599 return ctx.mod.toolchain(ctx.ctx)
1600}
1601
1602func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001603 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001604}
1605
1606func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001607 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001608}
1609
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001610func (ctx *moduleContextImpl) testBinary() bool {
1611 return ctx.mod.testBinary()
1612}
1613
Yi Kong56fc1b62022-09-06 16:24:00 +08001614func (ctx *moduleContextImpl) testLibrary() bool {
1615 return ctx.mod.testLibrary()
1616}
1617
Jiyong Park1d1119f2019-07-29 21:27:18 +09001618func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001619 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001620}
1621
Inseob Kim7f283f42020-06-01 21:53:49 +09001622func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001623 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001624}
1625
Inseob Kim1042d292020-06-01 23:23:05 +09001626func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001627 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001628}
1629
Jooyung Hanccce2f22020-03-07 03:45:53 +09001630func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001631 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001632}
1633
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001634func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001635 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001636}
1637
1638func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001639 if ctx.ctx.Device() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001640 if ctx.useVndk() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001641 vndkVer := ctx.mod.VndkVersion()
Jooyung Han03302ee2020-04-08 09:22:26 +09001642 if inList(vndkVer, ctx.ctx.Config().PlatformVersionActiveCodenames()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001643 return "current"
Justin Yun732aa6a2018-03-23 17:43:47 +09001644 }
Justin Yun5f7f7e82019-11-18 19:52:14 +09001645 return vndkVer
Dan Willemsend2ede872016-11-18 14:54:24 -08001646 }
Justin Yun732aa6a2018-03-23 17:43:47 +09001647 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001648 }
1649 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001650}
1651
Jiyong Parkb35a8192020-08-10 15:59:36 +09001652func (ctx *moduleContextImpl) minSdkVersion() string {
1653 ver := ctx.mod.MinSdkVersion()
1654 if ver == "apex_inherit" && !ctx.isForPlatform() {
1655 ver = ctx.apexSdkVersion().String()
1656 }
1657 if ver == "apex_inherit" || ver == "" {
1658 ver = ctx.sdkVersion()
1659 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001660 // For crt objects, the meaning of min_sdk_version is very different from other types of
1661 // module. For them, min_sdk_version defines the oldest version that the build system will
1662 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1663 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1664 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001665 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1666 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1667 // support such an old version. The version is set to the later version in case when the
1668 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1669 // it's for an APEX.
1670 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1671 if ctx.isForPlatform() {
1672 ver = strconv.Itoa(android.FutureApiLevelInt)
1673 } else { // for apex
1674 ver = ctx.apexSdkVersion().String()
1675 if ver == "" { // in case when min_sdk_version was not set by the APEX
1676 ver = ctx.sdkVersion()
1677 }
1678 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001679 }
1680
Jiyong Parkb35a8192020-08-10 15:59:36 +09001681 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1682 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1683 minSdkVersionInt, err2 := strconv.Atoi(ver)
1684 if err == nil && err2 == nil {
1685 if sdkVersionInt < minSdkVersionInt {
1686 return strconv.Itoa(sdkVersionInt)
1687 }
1688 }
1689 return ver
1690}
1691
1692func (ctx *moduleContextImpl) isSdkVariant() bool {
1693 return ctx.mod.IsSdkVariant()
1694}
1695
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001696func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001697 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001698}
Justin Yun8effde42017-06-23 19:24:43 +09001699
Colin Cross95f1ca02020-10-29 20:47:22 -07001700func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1701 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001702}
1703
Colin Cross127bb8b2020-12-16 16:46:01 -08001704func (ctx *moduleContextImpl) IsLlndk() bool {
1705 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001706}
1707
Colin Cross127bb8b2020-12-16 16:46:01 -08001708func (ctx *moduleContextImpl) IsLlndkPublic() bool {
1709 return ctx.mod.IsLlndkPublic()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001710}
1711
Colin Cross127bb8b2020-12-16 16:46:01 -08001712func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1713 return ctx.mod.isImplementationForLLNDKPublic()
1714}
1715
1716func (ctx *moduleContextImpl) IsVndkPrivate() bool {
1717 return ctx.mod.IsVndkPrivate()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001718}
1719
Logan Chienf3511742017-10-31 18:04:35 +08001720func (ctx *moduleContextImpl) isVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001721 return ctx.mod.IsVndk()
Logan Chienf3511742017-10-31 18:04:35 +08001722}
1723
Yi Kong4ef54592022-02-14 20:00:10 +08001724func (ctx *moduleContextImpl) isAfdoCompile() bool {
1725 return ctx.mod.isAfdoCompile()
1726}
1727
Yi Kong7e53c572018-02-14 18:16:12 +08001728func (ctx *moduleContextImpl) isPgoCompile() bool {
1729 return ctx.mod.isPgoCompile()
1730}
1731
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001732func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1733 return ctx.mod.isOrderfileCompile()
1734}
1735
Yi Kongc702ebd2022-08-19 16:02:45 +08001736func (ctx *moduleContextImpl) isCfi() bool {
1737 return ctx.mod.isCfi()
1738}
1739
Yi Konged79fa32023-06-04 17:15:42 +09001740func (ctx *moduleContextImpl) isFuzzer() bool {
1741 return ctx.mod.isFuzzer()
1742}
1743
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001744func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1745 return ctx.mod.isNDKStubLibrary()
1746}
1747
Justin Yun8effde42017-06-23 19:24:43 +09001748func (ctx *moduleContextImpl) isVndkSp() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001749 return ctx.mod.IsVndkSp()
Logan Chienf3511742017-10-31 18:04:35 +08001750}
1751
Ivan Lozanof9e21722020-12-02 09:00:51 -05001752func (ctx *moduleContextImpl) IsVndkExt() bool {
1753 return ctx.mod.IsVndkExt()
Justin Yun8effde42017-06-23 19:24:43 +09001754}
1755
Colin Cross5271fea2021-04-27 13:06:04 -07001756func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1757 return ctx.mod.IsVendorPublicLibrary()
1758}
1759
Vic Yangefd249e2018-11-12 20:19:56 -08001760func (ctx *moduleContextImpl) mustUseVendorVariant() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001761 return ctx.mod.MustUseVendorVariant()
Vic Yangefd249e2018-11-12 20:19:56 -08001762}
1763
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001764func (ctx *moduleContextImpl) selectedStl() string {
1765 if stl := ctx.mod.stl; stl != nil {
1766 return stl.Properties.SelectedStl
1767 }
1768 return ""
1769}
1770
Ivan Lozanobd721262018-11-27 14:33:03 -08001771func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1772 return ctx.mod.linker.useClangLld(actx)
1773}
1774
Colin Crossce75d2c2016-10-06 16:12:58 -07001775func (ctx *moduleContextImpl) baseModuleName() string {
1776 return ctx.mod.ModuleBase.BaseModuleName()
1777}
1778
Logan Chienf3511742017-10-31 18:04:35 +08001779func (ctx *moduleContextImpl) getVndkExtendsModuleName() string {
1780 return ctx.mod.getVndkExtendsModuleName()
1781}
1782
Logan Chiene274fc92019-12-03 11:18:32 -08001783func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Cross56a83212020-09-15 18:30:11 -07001784 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001785}
1786
Colin Crosse07f2312020-08-13 11:24:56 -07001787func (ctx *moduleContextImpl) apexVariationName() string {
Colin Cross56a83212020-09-15 18:30:11 -07001788 return ctx.ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001789}
1790
Dan Albertc8060532020-07-22 22:32:17 -07001791func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001792 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001793}
1794
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001795func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001796 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001797}
1798
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001799func (ctx *moduleContextImpl) nativeCoverage() bool {
1800 return ctx.mod.nativeCoverage()
1801}
1802
Colin Cross56a83212020-09-15 18:30:11 -07001803func (ctx *moduleContextImpl) directlyInAnyApex() bool {
1804 return ctx.mod.DirectlyInAnyApex()
1805}
1806
Colin Cross95b07f22020-12-16 11:06:50 -08001807func (ctx *moduleContextImpl) isPreventInstall() bool {
1808 return ctx.mod.Properties.PreventInstall
1809}
1810
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001811func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1812 shared := &ctx.mod.sharedFlags
1813 if shared.flagsMap == nil {
1814 shared.numSharedFlags = 0
1815 shared.flagsMap = make(map[string]string)
1816 }
1817 return shared
1818}
1819
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001820func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1821 return ctx.mod.isCfiAssemblySupportEnabled()
1822}
1823
Colin Cross635c3b02016-05-18 15:37:25 -07001824func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001825 return &Module{
1826 hod: hod,
1827 multilib: multilib,
1828 }
1829}
1830
Colin Cross635c3b02016-05-18 15:37:25 -07001831func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001832 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001833 module.features = []feature{
1834 &tidyFeature{},
1835 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001836 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001837 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001838 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001839 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001840 module.sabi = &sabi{}
Justin Yun8effde42017-06-23 19:24:43 +09001841 module.vndkdep = &vndkdep{}
Stephen Craneba090d12017-05-09 15:44:35 -07001842 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001843 module.afdo = &afdo{}
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07001844 module.pgo = &pgo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001845 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001846 return module
1847}
1848
Colin Crossce75d2c2016-10-06 16:12:58 -07001849func (c *Module) Prebuilt() *android.Prebuilt {
1850 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1851 return p.prebuilt()
1852 }
1853 return nil
1854}
1855
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001856func (c *Module) IsPrebuilt() bool {
1857 return c.Prebuilt() != nil
1858}
1859
Colin Crossce75d2c2016-10-06 16:12:58 -07001860func (c *Module) Name() string {
1861 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001862 if p, ok := c.linker.(interface {
1863 Name(string) string
1864 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001865 name = p.Name(name)
1866 }
1867 return name
1868}
1869
Alex Light3d673592019-01-18 14:37:31 -08001870func (c *Module) Symlinks() []string {
1871 if p, ok := c.installer.(interface {
1872 symlinkList() []string
1873 }); ok {
1874 return p.symlinkList()
1875 }
1876 return nil
1877}
1878
Roland Levillainf89cd092019-07-29 16:22:59 +01001879func (c *Module) IsTestPerSrcAllTestsVariation() bool {
1880 test, ok := c.linker.(testPerSrc)
1881 return ok && test.isAllTestsVariation()
1882}
1883
Chris Parsons216e10a2020-07-09 17:12:52 -04001884func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001885 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001886 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001887 }); ok {
1888 return p.dataPaths()
1889 }
1890 return nil
1891}
1892
Ivan Lozanof1868af2022-04-12 13:08:36 -04001893func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001894 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1895 // "current", it will append the VNDK version to the name suffix.
1896 var vndkVersion string
1897 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001898 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001899 if c.ProductSpecific() {
1900 // If the module is product specific with 'product_specific: true',
1901 // do not add a name suffix because it is a base module.
1902 return ""
1903 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001904 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001905 } else {
1906 vndkVersion = ctx.DeviceConfig().VndkVersion()
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001907 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001908 }
1909 if vndkVersion == "current" {
1910 vndkVersion = ctx.DeviceConfig().PlatformVndkVersion()
1911 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001912 if c.VndkVersion() != vndkVersion && c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001913 // add version suffix only if the module is using different vndk version than the
1914 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001915 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001916 }
1917 return nameSuffix
1918}
1919
Ivan Lozanof1868af2022-04-12 13:08:36 -04001920func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1921 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001922
1923 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001924 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001925 }
1926
Colin Cross127bb8b2020-12-16 16:46:01 -08001927 llndk := c.IsLlndk()
Colin Cross627280f2021-04-26 16:53:58 -07001928 if llndk || (c.UseVndk() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001929 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1930 // added for product variant only when we have vendor and product variants with core
1931 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001932 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001933 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001934 subName += vendorPublicLibrarySuffix
1935 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001936 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1937 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001938 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001939 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001940 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001941 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001942 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001943 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001944 subName += RecoverySuffix
1945 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1946 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001947 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001948 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001949 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001950 } else if c.IsStubs() && c.IsSdkVariant() {
1951 // Public API surface (NDK)
1952 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1953 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001954 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001955
1956 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001957}
1958
Chris Parsonsf874e462022-05-10 13:50:12 -04001959var _ android.MixedBuildBuildable = (*Module)(nil)
1960
1961func (c *Module) getBazelModuleLabel(ctx android.BaseModuleContext) string {
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001962 var bazelModuleLabel string
Liz Kammer35ca77e2021-12-22 15:31:40 -05001963 if c.typ() == fullLibrary && c.static() {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001964 // cc_library is a special case in bp2build; two targets are generated -- one for each
1965 // of the shared and static variants. The shared variant keeps the module name, but the
1966 // static variant uses a different suffixed name.
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001967 bazelModuleLabel = bazelLabelForStaticModule(ctx, c)
1968 } else {
1969 bazelModuleLabel = c.GetBazelLabel(ctx, c)
Chris Parsonsf874e462022-05-10 13:50:12 -04001970 }
Trevor Radcliffe5d6fa4d2022-05-17 21:59:36 +00001971 labelNoPrebuilt := bazelModuleLabel
1972 if c.IsPrebuilt() {
1973 labelNoPrebuilt = android.RemoveOptionalPrebuiltPrefixFromBazelLabel(bazelModuleLabel)
1974 }
1975 return labelNoPrebuilt
Chris Parsonsf874e462022-05-10 13:50:12 -04001976}
1977
1978func (c *Module) QueueBazelCall(ctx android.BaseModuleContext) {
1979 c.bazelHandler.QueueBazelCall(ctx, c.getBazelModuleLabel(ctx))
1980}
1981
Jingwen Chen3952a902022-12-12 12:20:58 +00001982// IsMixedBuildSupported returns true if the module should be analyzed by Bazel
Jingwen Chena485d092023-04-20 12:34:08 +00001983// in any of the --bazel-mode(s).
Chris Parsonsf874e462022-05-10 13:50:12 -04001984func (c *Module) IsMixedBuildSupported(ctx android.BaseModuleContext) bool {
Yu Liu8860c6c2023-06-07 12:43:26 -07001985 if !allEnabledSanitizersSupportedByBazel(ctx, c) {
Sam Delmericoef69d472023-04-18 17:32:43 -04001986 //TODO(b/278772861) support sanitizers in Bazel rules
Yu Liue4312402023-01-18 09:15:31 -08001987 return false
1988 }
Liz Kammer1cec9d12023-06-22 10:09:47 -04001989 if !imageVariantSupportedByBazel(c) {
1990 return false
1991 }
1992 if c.IsSdkVariant() {
1993 return false
1994 }
Sam Delmericoef69d472023-04-18 17:32:43 -04001995 return c.bazelHandler != nil
1996}
1997
Liz Kammer1cec9d12023-06-22 10:09:47 -04001998func imageVariantSupportedByBazel(c *Module) bool {
1999 if c.IsLlndk() {
2000 return false
2001 }
2002 if c.InVendor() {
2003 return false
2004 }
2005 if c.InProduct() {
2006 return false
2007 }
2008 if c.InRamdisk() {
2009 return false
2010 }
2011 if c.InVendorRamdisk() {
2012 return false
2013 }
2014 if c.InRecovery() {
2015 return false
2016 }
2017 return true
2018}
2019
Yu Liu8860c6c2023-06-07 12:43:26 -07002020func allEnabledSanitizersSupportedByBazel(ctx android.BaseModuleContext, c *Module) bool {
Sam Delmericoef69d472023-04-18 17:32:43 -04002021 if c.sanitize == nil {
2022 return true
2023 }
Yu Liue4312402023-01-18 09:15:31 -08002024 sanitizeProps := &c.sanitize.Properties.SanitizeMutated
Sam Delmericoef69d472023-04-18 17:32:43 -04002025
2026 unsupportedSanitizers := []*bool{
2027 sanitizeProps.Safestack,
Sam Delmericoef69d472023-04-18 17:32:43 -04002028 sanitizeProps.Scudo,
2029 BoolPtr(len(c.sanitize.Properties.Sanitize.Recover) > 0),
Sam Delmericoef69d472023-04-18 17:32:43 -04002030 }
2031 for _, san := range unsupportedSanitizers {
2032 if Bool(san) {
2033 return false
2034 }
2035 }
2036
2037 for _, san := range Sanitizers {
2038 if san == intOverflow {
2039 // TODO(b/261058727): enable mixed builds for all modules with UBSan
2040 // Currently we can only support ubsan when minimum runtime is used.
2041 ubsanEnabled := Bool(sanitizeProps.Integer_overflow) || len(sanitizeProps.Misc_undefined) > 0
Yu Liu8860c6c2023-06-07 12:43:26 -07002042 if !ubsanEnabled || c.MinimalRuntimeNeeded() {
2043 continue
Sam Delmericoef69d472023-04-18 17:32:43 -04002044 }
Yu Liu95497dc2023-05-25 11:15:07 -07002045 } else if san == cfi {
Yu Liu8860c6c2023-06-07 12:43:26 -07002046 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2047 // Only allow cfi if this is an apex variant
2048 if !apexInfo.IsForPlatform() {
2049 continue
2050 }
2051 }
2052 if c.sanitize.isSanitizerEnabled(san) {
Sam Delmericoef69d472023-04-18 17:32:43 -04002053 return false
2054 }
2055 }
2056
2057 return true
Yu Liue4312402023-01-18 09:15:31 -08002058}
2059
2060func GetApexConfigKey(ctx android.BaseModuleContext) *android.ApexConfigKey {
2061 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2062 if !apexInfo.IsForPlatform() {
2063 apexKey := android.ApexConfigKey{
2064 WithinApex: true,
2065 ApexSdkVersion: findApexSdkVersion(ctx, apexInfo).String(),
Spandan Das40b79f82023-06-25 20:56:06 +00002066 ApiDomain: findApiDomain(apexInfo),
Yu Liue4312402023-01-18 09:15:31 -08002067 }
2068 return &apexKey
2069 }
2070
2071 return nil
Chris Parsonsf874e462022-05-10 13:50:12 -04002072}
2073
Spandan Das40b79f82023-06-25 20:56:06 +00002074// Returns the api domain of a module for an apexInfo group
2075// Input:
2076// ai.InApexModules: [com.android.foo, test_com.android.foo, com.google.android.foo]
2077// Return:
2078// com.android.foo
2079
2080// If a module is included in multiple api domains (collated by min_sdk_version), it will return
2081// the first match. The other matches have the same build actions since they share a min_sdk_version, so returning
2082// the first match is fine.
2083func findApiDomain(ai android.ApexInfo) string {
2084 // Remove any test apexes
2085 matches, _ := android.FilterList(ai.InApexModules, ai.TestApexes)
2086 // Remove any google apexes. Rely on naming convention.
2087 pred := func(s string) bool { return !strings.HasPrefix(s, "com.google") }
2088 matches = android.FilterListPred(matches, pred)
2089 if len(matches) > 0 {
2090 // Return the first match
2091 return android.SortedUniqueStrings(matches)[0]
2092 } else {
2093 // No apex in the tree has a dependency on this module
2094 return ""
2095 }
2096}
2097
Chris Parsonsf874e462022-05-10 13:50:12 -04002098func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) {
2099 bazelModuleLabel := c.getBazelModuleLabel(ctx)
Chris Parsonsf874e462022-05-10 13:50:12 -04002100 c.bazelHandler.ProcessBazelQueryResponse(ctx, bazelModuleLabel)
2101
2102 c.Properties.SubName = GetSubnameProperty(ctx, c)
2103 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2104 if !apexInfo.IsForPlatform() {
2105 c.hideApexVariantFromMake = true
Chris Parsons77acf2e2021-12-03 17:27:16 -05002106 }
Liz Kammer35ca77e2021-12-22 15:31:40 -05002107
Chris Parsonsf874e462022-05-10 13:50:12 -04002108 c.makeLinkType = GetMakeLinkType(ctx, c)
2109
2110 mctx := &moduleContext{
2111 ModuleContext: ctx,
2112 moduleContextImpl: moduleContextImpl{
2113 mod: c,
2114 },
Chris Parsons8d6e4332021-02-22 16:13:50 -05002115 }
Chris Parsonsf874e462022-05-10 13:50:12 -04002116 mctx.ctx = mctx
2117
Jingwen Chen3952a902022-12-12 12:20:58 +00002118 // TODO(b/244432500): Get the tradefed config from the bazel target instead
2119 // of generating it with Soong.
Chris Parsonsf874e462022-05-10 13:50:12 -04002120 c.maybeInstall(mctx, apexInfo)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002121}
2122
Sam Delmerico75dbca22023-04-20 13:13:25 +00002123func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
2124 ctx := &moduleContext{
2125 ModuleContext: actx,
2126 moduleContextImpl: moduleContextImpl{
2127 mod: c,
2128 },
2129 }
2130 ctx.ctx = ctx
2131 return ctx
2132}
2133
Spandan Das20fce2d2023-04-12 17:21:39 +00002134// TODO (b/277651159): Remove this allowlist
2135var (
2136 skipStubLibraryMultipleApexViolation = map[string]bool{
2137 "libclang_rt.asan": true,
2138 "libclang_rt.hwasan": true,
2139 // runtime apex
2140 "libc": true,
2141 "libc_hwasan": true,
2142 "libdl_android": true,
2143 "libm": true,
2144 "libdl": true,
2145 // art apex
2146 "libandroidio": true,
2147 "libdexfile": true,
2148 "libnativebridge": true,
2149 "libnativehelper": true,
2150 "libnativeloader": true,
2151 "libsigchain": true,
2152 }
2153)
2154
2155// Returns true if a stub library could be installed in multiple apexes
2156func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2157 // If this is not an apex variant, no check necessary
2158 if !c.InAnyApex() {
2159 return false
2160 }
2161 // If this is not a stub library, no check necessary
2162 if !c.HasStubsVariants() {
2163 return false
2164 }
2165 // Skip the allowlist
2166 // Use BaseModuleName so that this matches prebuilts.
2167 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2168 return false
2169 }
2170
2171 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
2172 // Stub libraries should not have more than one apex_available
2173 if len(aaWithoutTestApexes) > 1 {
2174 return true
2175 }
2176 // Stub libraries should not use the wildcard
2177 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
2178 return true
2179 }
2180 // Default: no violation
2181 return false
2182}
2183
Chris Parsons8d6e4332021-02-22 16:13:50 -05002184func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Chris Parsons8d6e4332021-02-22 16:13:50 -05002185 // Handle the case of a test module split by `test_per_src` mutator.
2186 //
2187 // The `test_per_src` mutator adds an extra variation named "", depending on all the other
2188 // `test_per_src` variations of the test module. Set `outputFile` to an empty path for this
2189 // module and return early, as this module does not produce an output file per se.
2190 if c.IsTestPerSrcAllTestsVariation() {
2191 c.outputFile = android.OptionalPath{}
2192 return
2193 }
2194
Ivan Lozanof1868af2022-04-12 13:08:36 -04002195 c.Properties.SubName = GetSubnameProperty(actx, c)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002196 apexInfo := actx.Provider(android.ApexInfoProvider).(android.ApexInfo)
2197 if !apexInfo.IsForPlatform() {
2198 c.hideApexVariantFromMake = true
2199 }
2200
Chris Parsonseefc9e62021-04-02 17:36:47 -04002201 c.makeLinkType = GetMakeLinkType(actx, c)
2202
Sam Delmerico75dbca22023-04-20 13:13:25 +00002203 ctx := moduleContextFromAndroidModuleContext(actx, c)
Colin Crossca860ac2016-01-04 14:34:37 -08002204
Colin Crossf18e1102017-11-16 14:33:08 -08002205 deps := c.depsToPaths(ctx)
2206 if ctx.Failed() {
2207 return
2208 }
2209
Joe Onorato37f900c2023-07-18 16:58:16 -07002210 for _, generator := range c.generators {
2211 gen := generator.GeneratorSources(ctx)
2212 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2213 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2214 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2215 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2216 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2217 if len(deps.Objs.objFiles) == 0 {
2218 // If we are reusuing object files (which happens when we're a shared library and we're
2219 // reusing our static variant's object files), then skip adding the actual source files,
2220 // because we already have the object for it.
2221 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2222 }
2223 }
2224
2225 if ctx.Failed() {
2226 return
2227 }
2228
Spandan Das20fce2d2023-04-12 17:21:39 +00002229 if c.stubLibraryMultipleApexViolation(actx) {
2230 actx.PropertyErrorf("apex_available",
2231 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2232 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002233 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2234 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002235 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2236 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002237 }
2238
Colin Crossca860ac2016-01-04 14:34:37 -08002239 flags := Flags{
2240 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002241 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002242 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002243 for _, generator := range c.generators {
2244 flags = generator.GeneratorFlags(ctx, flags, deps)
2245 }
Colin Crossca860ac2016-01-04 14:34:37 -08002246 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002247 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002248 }
2249 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002250 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002251 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002252 if c.stl != nil {
2253 flags = c.stl.flags(ctx, flags)
2254 }
Colin Cross16b23492016-01-06 14:41:07 -08002255 if c.sanitize != nil {
2256 flags = c.sanitize.flags(ctx, flags)
2257 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002258 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002259 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002260 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002261 if c.fuzzer != nil {
2262 flags = c.fuzzer.flags(ctx, flags)
2263 }
Stephen Craneba090d12017-05-09 15:44:35 -07002264 if c.lto != nil {
2265 flags = c.lto.flags(ctx, flags)
2266 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002267 if c.afdo != nil {
2268 flags = c.afdo.flags(ctx, flags)
2269 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002270 if c.pgo != nil {
2271 flags = c.pgo.flags(ctx, flags)
2272 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002273 if c.orderfile != nil {
2274 flags = c.orderfile.flags(ctx, flags)
2275 }
Colin Crossca860ac2016-01-04 14:34:37 -08002276 for _, feature := range c.features {
2277 flags = feature.flags(ctx, flags)
2278 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002279 if ctx.Failed() {
2280 return
2281 }
2282
Colin Cross4af21ed2019-11-04 09:37:55 -08002283 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2284 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2285 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002286
Colin Cross4af21ed2019-11-04 09:37:55 -08002287 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002288
2289 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002290 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002291 }
2292 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002293 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002294 }
2295
Colin Cross3e5e7782022-06-17 22:17:05 +00002296 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2297
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002298 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002299 // We need access to all the flags seen by a source file.
2300 if c.sabi != nil {
2301 flags = c.sabi.flags(ctx, flags)
2302 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002303
Colin Cross4af21ed2019-11-04 09:37:55 -08002304 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002305
Joe Onorato37f900c2023-07-18 16:58:16 -07002306 for _, generator := range c.generators {
2307 generator.GeneratorBuildActions(ctx, flags, deps)
2308 }
2309
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002310 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002311 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002312 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002313 if ctx.Failed() {
2314 return
2315 }
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002316 c.kytheFiles = objs.kytheFiles
Chih-Hung Hsieh80783772021-10-11 16:46:56 -07002317 c.objFiles = objs.objFiles
2318 c.tidyFiles = objs.tidyFiles
Colin Cross3f40fa42015-01-30 17:27:36 -08002319 }
2320
Colin Crossca860ac2016-01-04 14:34:37 -08002321 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002322 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002323 if ctx.Failed() {
2324 return
2325 }
Colin Cross635c3b02016-05-18 15:37:25 -07002326 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002327
Chris Parsons94a0bba2021-06-04 15:03:47 -04002328 c.maybeUnhideFromMake()
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002329
Jose Galmes6f843bc2020-12-11 13:36:29 -08002330 // glob exported headers for snapshot, if BOARD_VNDK_VERSION is current or
2331 // RECOVERY_SNAPSHOT_VERSION is current.
2332 if i, ok := c.linker.(snapshotLibraryInterface); ok {
Ivan Lozanod7586b62021-04-01 09:49:36 -04002333 if ShouldCollectHeadersForSnapshot(ctx, c, apexInfo) {
Inseob Kimeda2e9c2020-03-03 22:06:32 +09002334 i.collectHeadersForSnapshot(ctx)
2335 }
2336 }
Colin Crossce75d2c2016-10-06 16:12:58 -07002337 }
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002338 if c.testModule {
2339 ctx.SetProvider(testing.TestModuleProviderKey, testing.TestModuleProviderData{})
2340 }
Colin Cross5049f022015-03-18 13:28:46 -07002341
Yu Liueae7b362023-11-16 17:05:47 -08002342 aconfig.CollectTransitiveAconfigFiles(ctx, &c.transitiveAconfigFiles)
2343
Chris Parsons94a0bba2021-06-04 15:03:47 -04002344 c.maybeInstall(ctx, apexInfo)
2345}
2346
2347func (c *Module) maybeUnhideFromMake() {
2348 // If a lib is directly included in any of the APEXes or is not available to the
2349 // platform (which is often the case when the stub is provided as a prebuilt),
2350 // unhide the stubs variant having the latest version gets visible to make. In
2351 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2352 // force anything in the make world to link against the stubs library. (unless it
2353 // is explicitly referenced via .bootstrap suffix or the module is marked with
2354 // 'bootstrap: true').
2355 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
2356 !c.InRecovery() && !c.UseVndk() && !c.static() && !c.isCoverageVariant() &&
2357 c.IsStubs() && !c.InVendorRamdisk() {
2358 c.Properties.HideFromMake = false // unhide
2359 // Note: this is still non-installable
2360 }
2361}
2362
Jingwen Chen3952a902022-12-12 12:20:58 +00002363// maybeInstall is called at the end of both GenerateAndroidBuildActions and
2364// ProcessBazelQueryResponse to run the install hooks for installable modules,
2365// like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002366func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002367 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002368 // If the module has been specifically configure to not be installed then
2369 // hide from make as otherwise it will break when running inside make
2370 // as the output path to install will not be specified. Not all uninstallable
2371 // modules can be hidden from make as some are needed for resolving make side
2372 // dependencies.
2373 c.HideFromMake()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002374 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002375 c.SkipInstall()
2376 }
2377
2378 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2379 // to allow using the outputs in a genrule.
2380 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002381 c.installer.install(ctx, c.outputFile.Path())
2382 if ctx.Failed() {
2383 return
Colin Crossca860ac2016-01-04 14:34:37 -08002384 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002385 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002386}
2387
Sam Delmerico5fb794a2023-01-27 16:01:37 -05002388func (c *Module) setAndroidMkVariablesFromCquery(info cquery.CcAndroidMkInfo) {
2389 c.Properties.AndroidMkSharedLibs = info.LocalSharedLibs
2390 c.Properties.AndroidMkStaticLibs = info.LocalStaticLibs
2391 c.Properties.AndroidMkWholeStaticLibs = info.LocalWholeStaticLibs
2392}
2393
Colin Cross0ea8ba82019-06-06 14:33:29 -07002394func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002395 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002396 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002397 }
Colin Crossca860ac2016-01-04 14:34:37 -08002398 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002399}
2400
Colin Crossca860ac2016-01-04 14:34:37 -08002401func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002402 for _, generator := range c.generators {
2403 generator.GeneratorInit(ctx)
2404 }
Colin Crossca860ac2016-01-04 14:34:37 -08002405 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002406 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002407 }
Colin Crossca860ac2016-01-04 14:34:37 -08002408 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002409 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002410 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002411 if c.stl != nil {
2412 c.stl.begin(ctx)
2413 }
Colin Cross16b23492016-01-06 14:41:07 -08002414 if c.sanitize != nil {
2415 c.sanitize.begin(ctx)
2416 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002417 if c.coverage != nil {
2418 c.coverage.begin(ctx)
2419 }
Stephen Craneba090d12017-05-09 15:44:35 -07002420 if c.lto != nil {
2421 c.lto.begin(ctx)
2422 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002423 if c.orderfile != nil {
2424 c.orderfile.begin(ctx)
2425 }
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07002426 if c.pgo != nil {
2427 c.pgo.begin(ctx)
2428 }
Dan Albert92fe7402020-07-15 13:33:30 -07002429 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002430 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002431 if err != nil {
2432 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002433 c.Properties.Sdk_version = nil
2434 } else {
2435 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002436 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002437 }
Colin Crossca860ac2016-01-04 14:34:37 -08002438}
2439
Colin Cross37047f12016-12-13 17:06:13 -08002440func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002441 deps := Deps{}
2442
Joe Onorato37f900c2023-07-18 16:58:16 -07002443 for _, generator := range c.generators {
2444 deps = generator.GeneratorDeps(ctx, deps)
2445 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002446 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002447 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002448 }
2449 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002450 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002451 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002452 if c.stl != nil {
2453 deps = c.stl.deps(ctx, deps)
2454 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002455 if c.coverage != nil {
2456 deps = c.coverage.deps(ctx, deps)
2457 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002458
Colin Crossb6715442017-10-24 11:13:31 -07002459 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2460 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2461 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2462 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2463 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2464 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002465 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002466
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002467 for _, lib := range deps.ReexportSharedLibHeaders {
2468 if !inList(lib, deps.SharedLibs) {
2469 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2470 }
2471 }
2472
2473 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002474 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2475 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 -07002476 }
2477 }
2478
Colin Cross5950f382016-12-13 12:50:57 -08002479 for _, lib := range deps.ReexportHeaderLibHeaders {
2480 if !inList(lib, deps.HeaderLibs) {
2481 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2482 }
2483 }
2484
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002485 for _, gen := range deps.ReexportGeneratedHeaders {
2486 if !inList(gen, deps.GeneratedHeaders) {
2487 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2488 }
2489 }
2490
Colin Crossc99deeb2016-04-11 15:06:20 -07002491 return deps
2492}
2493
Dan Albert7e9d2952016-08-04 13:02:36 -07002494func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002495 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002496 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002497 moduleContextImpl: moduleContextImpl{
2498 mod: c,
2499 },
2500 }
2501 ctx.ctx = ctx
2502
Vinh Tran44cb78c2023-03-09 22:07:19 -05002503 if !actx.Host() || !ctx.static() || ctx.staticBinary() {
2504 c.afdo.addDep(ctx, actx)
2505 }
2506
Colin Crossca860ac2016-01-04 14:34:37 -08002507 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002508}
2509
Jiyong Park7ed9de32018-10-15 22:25:07 +09002510// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002511func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002512 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2513 version := name[sharp+1:]
2514 libname := name[:sharp]
2515 return libname, version
2516 }
2517 return name, ""
2518}
2519
Dan Albert92fe7402020-07-15 13:33:30 -07002520func GetCrtVariations(ctx android.BottomUpMutatorContext,
2521 m LinkableInterface) []blueprint.Variation {
2522 if ctx.Os() != android.Android {
2523 return nil
2524 }
2525 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002526 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2527 minSdkVersion := m.MinSdkVersion()
2528 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2529 minSdkVersion = m.SdkVersion()
2530 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002531 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2532 if err != nil {
2533 ctx.PropertyErrorf("min_sdk_version", err.Error())
2534 }
Colin Cross363ec762023-01-13 13:45:14 -08002535
2536 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002537 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002538 if apiLevel.LessThan(minApiForArch) {
2539 apiLevel = minApiForArch
2540 }
2541
Dan Albert92fe7402020-07-15 13:33:30 -07002542 return []blueprint.Variation{
2543 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002544 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002545 }
2546 }
2547 return []blueprint.Variation{
2548 {Mutator: "sdk", Variation: ""},
2549 }
2550}
2551
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002552func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2553 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002554
2555 variations = append([]blueprint.Variation(nil), variations...)
2556
Liz Kammer23942242022-04-08 15:41:00 -04002557 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002558 // Version is explicitly specified. i.e. libFoo#30
2559 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002560 if tag, ok := depTag.(libraryDependencyTag); ok {
2561 tag.explicitlyVersioned = true
2562 } else {
2563 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2564 }
Colin Crosse7257d22020-09-24 09:56:18 -07002565 }
Colin Crosse7257d22020-09-24 09:56:18 -07002566
Colin Cross0de8a1e2020-09-18 14:15:30 -07002567 if far {
2568 ctx.AddFarVariationDependencies(variations, depTag, name)
2569 } else {
2570 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002571 }
2572}
2573
Kiyoung Kim487689e2022-07-26 09:48:22 +09002574func GetApiImports(c LinkableInterface, actx android.BottomUpMutatorContext) multitree.ApiImportInfo {
2575 apiImportInfo := multitree.ApiImportInfo{}
2576
2577 if c.Device() {
2578 var apiImportModule []blueprint.Module
2579 if actx.OtherModuleExists("api_imports") {
2580 apiImportModule = actx.AddDependency(c, nil, "api_imports")
2581 if len(apiImportModule) > 0 && apiImportModule[0] != nil {
2582 apiInfo := actx.OtherModuleProvider(apiImportModule[0], multitree.ApiImportsProvider).(multitree.ApiImportInfo)
2583 apiImportInfo = apiInfo
2584 actx.SetProvider(multitree.ApiImportsProvider, apiInfo)
2585 }
2586 }
2587 }
2588
2589 return apiImportInfo
2590}
2591
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002592func GetSnapshot(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext) SnapshotInfo {
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002593 // Only device modules with BOARD_VNDK_VERSION uses snapshot. Others use the zero value of
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002594 // SnapshotInfo, which provides no mappings.
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002595 if *snapshotInfo == nil && c.Device() {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002596 // Only retrieve the snapshot on demand in order to avoid circular dependencies
2597 // between the modules in the snapshot and the snapshot itself.
2598 var snapshotModule []blueprint.Module
2599 if c.InVendor() && c.VndkVersion() == actx.DeviceConfig().VndkVersion() {
2600 snapshotModule = actx.AddVariationDependencies(nil, nil, "vendor_snapshot")
2601 } else if recoverySnapshotVersion := actx.DeviceConfig().RecoverySnapshotVersion(); recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" && c.InRecovery() {
2602 snapshotModule = actx.AddVariationDependencies(nil, nil, "recovery_snapshot")
2603 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002604 if len(snapshotModule) > 0 && snapshotModule[0] != nil {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002605 snapshot := actx.OtherModuleProvider(snapshotModule[0], SnapshotInfoProvider).(SnapshotInfo)
2606 *snapshotInfo = &snapshot
2607 // republish the snapshot for use in later mutators on this module
2608 actx.SetProvider(SnapshotInfoProvider, snapshot)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002609 }
2610 }
Yi-Yo Chiangec14a4d2021-07-02 21:26:00 +08002611 if *snapshotInfo == nil {
2612 *snapshotInfo = &SnapshotInfo{}
2613 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002614 return **snapshotInfo
2615}
2616
Kiyoung Kim487689e2022-07-26 09:48:22 +09002617func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2618 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002619 return snapshot
2620 }
2621
2622 return lib
2623}
2624
2625// RewriteLibs takes a list of names of shared libraries and scans it for three types
2626// of names:
2627//
2628// 1. Name of an NDK library that refers to a prebuilt module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002629//
2630// For each of these, it adds the name of the prebuilt module (which will be in
2631// prebuilts/ndk) to the list of nonvariant libs.
2632//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002633// 2. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002634//
2635// For each of these, it adds the name of the ndk_library module to the list of
2636// variant libs.
2637//
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002638// 3. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002639//
2640// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002641//
2642// The caller can then know to add the variantLibs dependencies differently from the
2643// nonvariantLibs
2644func RewriteLibs(c LinkableInterface, snapshotInfo **SnapshotInfo, actx android.BottomUpMutatorContext, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
2645 variantLibs = []string{}
2646
2647 nonvariantLibs = []string{}
2648 for _, entry := range list {
2649 // strip #version suffix out
2650 name, _ := StubsLibNameAndVersion(entry)
2651 if c.InRecovery() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002652 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002653 } else if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
2654 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
2655 } else if c.UseVndk() {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002656 nonvariantLibs = append(nonvariantLibs, GetReplaceModuleName(entry, GetSnapshot(c, snapshotInfo, actx).SharedLibs))
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002657 } else {
2658 // put name#version back
2659 nonvariantLibs = append(nonvariantLibs, entry)
2660 }
2661 }
2662 return nonvariantLibs, variantLibs
2663}
2664
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002665func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2666 nonVariantLibs := []string{}
2667 variantLibs := []string{}
2668
2669 for _, lib := range libs {
2670 replaceLibName := GetReplaceModuleName(lib, replaceList)
2671 if replaceLibName == lib {
2672 // Do not handle any libs which are not in API imports
2673 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2674 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2675 variantLibs = append(variantLibs, replaceLibName)
2676 } else {
2677 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2678 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002679 }
2680
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002681 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002682}
2683
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002684func (c *Module) shouldUseApiSurface() bool {
2685 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2686 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2687 // LLNDK Variant
2688 return true
2689 }
2690
2691 if c.Properties.IsSdkVariant {
2692 // NDK Variant
2693 return true
2694 }
2695
2696 if c.isImportedApiLibrary() {
2697 // API Library should depend on API headers
2698 return true
2699 }
2700 }
2701
2702 return false
2703}
2704
Colin Cross1e676be2016-10-12 14:38:15 -07002705func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002706 if !c.Enabled() {
2707 return
2708 }
2709
Colin Cross37047f12016-12-13 17:06:13 -08002710 ctx := &depsContext{
2711 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002712 moduleContextImpl: moduleContextImpl{
2713 mod: c,
2714 },
2715 }
2716 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002717
Colin Crossc99deeb2016-04-11 15:06:20 -07002718 deps := c.deps(ctx)
Kiyoung Kim487689e2022-07-26 09:48:22 +09002719 apiImportInfo := GetApiImports(c, actx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002720
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002721 apiNdkLibs := []string{}
2722 apiLateNdkLibs := []string{}
2723
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002724 if c.shouldUseApiSurface() {
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002725 deps.SharedLibs, apiNdkLibs = rewriteLibsForApiImports(c, deps.SharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2726 deps.LateSharedLibs, apiLateNdkLibs = rewriteLibsForApiImports(c, deps.LateSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2727 deps.SystemSharedLibs, _ = rewriteLibsForApiImports(c, deps.SystemSharedLibs, apiImportInfo.SharedLibs, ctx.Config())
2728 deps.ReexportHeaderLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportHeaderLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
2729 deps.ReexportSharedLibHeaders, _ = rewriteLibsForApiImports(c, deps.ReexportSharedLibHeaders, apiImportInfo.SharedLibs, ctx.Config())
Kiyoung Kim11d91082022-10-19 19:20:57 +09002730 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002731
Yo Chiang219968c2020-09-22 18:45:04 +08002732 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2733
Colin Crosse0edaf92021-01-11 17:31:17 -08002734 var snapshotInfo *SnapshotInfo
Colin Crosse0edaf92021-01-11 17:31:17 -08002735
Dan Albert914449f2016-06-17 16:45:24 -07002736 variantNdkLibs := []string{}
2737 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002738 if ctx.Os() == android.Android {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002739 deps.SharedLibs, variantNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.SharedLibs)
2740 deps.LateSharedLibs, variantLateNdkLibs = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.LateSharedLibs)
2741 deps.ReexportSharedLibHeaders, _ = RewriteLibs(c, &snapshotInfo, actx, ctx.Config(), deps.ReexportSharedLibHeaders)
Colin Crosse0edaf92021-01-11 17:31:17 -08002742
2743 for idx, lib := range deps.RuntimeLibs {
Kiyoung Kim487689e2022-07-26 09:48:22 +09002744 deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).SharedLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002745 }
Dan Willemsen72d39932016-07-08 23:23:48 -07002746 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002747
Colin Cross32ec36c2016-12-15 07:39:51 -08002748 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002749 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002750 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002751 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002752 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002753
Kiyoung Kim51279d32022-08-24 14:10:46 +09002754 // Check header lib replacement from API surface first, and then check again with VSDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002755 if c.shouldUseApiSurface() {
Kiyoung Kim11d91082022-10-19 19:20:57 +09002756 lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
2757 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002758 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002759
Spandan Das73bcafc2022-08-18 23:26:00 +00002760 if c.isNDKStubLibrary() {
2761 // ndk_headers do not have any variations
2762 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
Kiyoung Kim51279d32022-08-24 14:10:46 +09002763 } else if c.IsStubs() && !c.isImportedApiLibrary() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002764 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002765 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002766 } else {
2767 actx.AddVariationDependencies(nil, depTag, lib)
2768 }
2769 }
2770
Dan Albertf1d14c72020-07-30 14:32:55 -07002771 if c.isNDKStubLibrary() {
2772 // NDK stubs depend on their implementation because the ABI dumps are
2773 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002774
Spandan Das8b08aea2023-03-14 19:29:34 +00002775 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2776 c.ImageVariation(),
2777 blueprint.Variation{Mutator: "link", Variation: "shared"},
2778 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002779 }
2780
Jiyong Park5d1598f2019-02-25 22:14:17 +09002781 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002782 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002783
Kiyoung Kim487689e2022-07-26 09:48:22 +09002784 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002785
Jiyong Park5d1598f2019-02-25 22:14:17 +09002786 actx.AddVariationDependencies([]blueprint.Variation{
2787 {Mutator: "link", Variation: "static"},
2788 }, depTag, lib)
2789 }
2790
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002791 for _, lib := range deps.StaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002792 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002793 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002794 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002795 }
Jiyong Parke3867542020-12-03 17:28:25 +09002796 if inList(lib, deps.ExcludeLibsForApex) {
2797 depTag.excludeInApex = true
2798 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002799
Kiyoung Kim487689e2022-07-26 09:48:22 +09002800 lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs)
Inseob Kimeec88e12020-01-22 11:11:29 +09002801
Dan Willemsen59339a22018-07-22 21:18:45 -07002802 actx.AddVariationDependencies([]blueprint.Variation{
2803 {Mutator: "link", Variation: "static"},
2804 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002805 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002806
Jooyung Han75568392020-03-20 04:29:24 +09002807 // staticUnwinderDep is treated as staticDep for Q apexes
2808 // so that native libraries/binaries are linked with static unwinder
2809 // because Q libc doesn't have unwinder APIs
2810 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07002811 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002812 actx.AddVariationDependencies([]blueprint.Variation{
2813 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002814 }, depTag, GetReplaceModuleName(staticUnwinder(actx), GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002815 }
2816
Jiyong Park7ed9de32018-10-15 22:25:07 +09002817 // shared lib names without the #version suffix
2818 var sharedLibNames []string
2819
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002820 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002821 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002822 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002823 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002824 }
Jiyong Parke3867542020-12-03 17:28:25 +09002825 if inList(lib, deps.ExcludeLibsForApex) {
2826 depTag.excludeInApex = true
2827 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002828
Jiyong Park73c54ee2019-10-22 20:31:18 +09002829 name, version := StubsLibNameAndVersion(lib)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002830 if apiLibraryName, ok := apiImportInfo.SharedLibs[name]; ok && !ctx.OtherModuleExists(name) {
2831 name = apiLibraryName
2832 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002833 sharedLibNames = append(sharedLibNames, name)
2834
Colin Crosse7257d22020-09-24 09:56:18 -07002835 variations := []blueprint.Variation{
2836 {Mutator: "link", Variation: "shared"},
2837 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002838
2839 if _, ok := apiImportInfo.ApexSharedLibs[name]; !ok || ctx.OtherModuleExists(name) {
2840 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
2841 }
2842
2843 if apiLibraryName, ok := apiImportInfo.ApexSharedLibs[name]; ok {
2844 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, apiLibraryName, version, false)
2845 }
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002846 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002847
Colin Crossfe9acfe2021-06-14 16:13:03 -07002848 for _, lib := range deps.LateStaticLibs {
2849 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
2850 actx.AddVariationDependencies([]blueprint.Variation{
2851 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002852 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Crossfe9acfe2021-06-14 16:13:03 -07002853 }
2854
Colin Cross3e5e7782022-06-17 22:17:05 +00002855 for _, lib := range deps.UnexportedStaticLibs {
2856 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
2857 actx.AddVariationDependencies([]blueprint.Variation{
2858 {Mutator: "link", Variation: "static"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002859 }, depTag, GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).StaticLibs))
Colin Cross3e5e7782022-06-17 22:17:05 +00002860 }
2861
Jiyong Park7ed9de32018-10-15 22:25:07 +09002862 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002863 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002864 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2865 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2866 // linking against both the stubs lib and the non-stubs lib at the same time.
2867 continue
2868 }
Colin Cross6e511a92020-07-27 21:26:48 -07002869 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002870 variations := []blueprint.Variation{
2871 {Mutator: "link", Variation: "shared"},
2872 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002873 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002874 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002875
Dan Willemsen59339a22018-07-22 21:18:45 -07002876 actx.AddVariationDependencies([]blueprint.Variation{
2877 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002878 }, dataLibDepTag, deps.DataLibs...)
2879
Colin Crossc8caa062021-09-24 16:50:14 -07002880 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2881
Chris Parsons79d66a52020-06-05 17:26:16 -04002882 actx.AddVariationDependencies([]blueprint.Variation{
2883 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002884 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002885
Colin Cross68861832016-07-08 10:41:41 -07002886 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002887
2888 for _, gen := range deps.GeneratedHeaders {
2889 depTag := genHeaderDepTag
2890 if inList(gen, deps.ReexportGeneratedHeaders) {
2891 depTag = genHeaderExportDepTag
2892 }
2893 actx.AddDependency(c, depTag, gen)
2894 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002895
Dan Albert92fe7402020-07-15 13:33:30 -07002896 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002897 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002898 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002899 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002900 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Crossca860ac2016-01-04 14:34:37 -08002901 }
Colin Crossc465efd2021-06-11 18:00:04 -07002902 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002903 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim487689e2022-07-26 09:48:22 +09002904 GetReplaceModuleName(crt, GetSnapshot(c, &snapshotInfo, actx).Objects))
Colin Cross21b9a242015-03-24 14:15:58 -07002905 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002906 if deps.DynamicLinker != "" {
2907 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002908 }
Dan Albert914449f2016-06-17 16:45:24 -07002909
2910 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002911
2912 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002913 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002914 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002915 {Mutator: "link", Variation: "shared"},
2916 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002917 actx.AddVariationDependencies([]blueprint.Variation{
2918 {Mutator: "version", Variation: version},
2919 {Mutator: "link", Variation: "shared"},
2920 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002921
2922 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002923 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002924 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002925 {Mutator: "link", Variation: "shared"},
2926 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002927 actx.AddVariationDependencies([]blueprint.Variation{
2928 {Mutator: "version", Variation: version},
2929 {Mutator: "link", Variation: "shared"},
2930 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002931
2932 if vndkdep := c.vndkdep; vndkdep != nil {
2933 if vndkdep.isVndkExt() {
Logan Chienf3511742017-10-31 18:04:35 +08002934 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross7228ecd2019-11-18 16:00:16 -08002935 c.ImageVariation(),
Dan Willemsen59339a22018-07-22 21:18:45 -07002936 {Mutator: "link", Variation: "shared"},
Kiyoung Kim487689e2022-07-26 09:48:22 +09002937 }, vndkExtDepTag, GetReplaceModuleName(vndkdep.getVndkExtendsModuleName(), GetSnapshot(c, &snapshotInfo, actx).SharedLibs))
Logan Chienf3511742017-10-31 18:04:35 +08002938 }
2939 }
Kiyoung Kimee58c932022-10-25 22:59:41 +09002940
Vinh Tran367d89d2023-04-28 11:21:25 -04002941 if len(deps.AidlLibs) > 0 {
2942 actx.AddDependency(
2943 c,
2944 aidlLibraryTag,
2945 deps.AidlLibs...,
2946 )
2947 }
2948
Kiyoung Kimee58c932022-10-25 22:59:41 +09002949 updateImportedLibraryDependency(ctx)
Colin Cross6362e272015-10-29 15:25:03 -07002950}
Colin Cross21b9a242015-03-24 14:15:58 -07002951
Colin Crosse40b4ea2018-10-02 22:25:58 -07002952func BeginMutator(ctx android.BottomUpMutatorContext) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002953 if c, ok := ctx.Module().(*Module); ok && c.Enabled() {
2954 c.beginMutator(ctx)
2955 }
2956}
2957
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002958// Whether a module can link to another module, taking into
2959// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002960func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002961 tag blueprint.DependencyTag) {
2962
2963 switch t := tag.(type) {
2964 case dependencyTag:
2965 if t != vndkExtDepTag {
2966 return
2967 }
2968 case libraryDependencyTag:
2969 default:
2970 return
2971 }
2972
Ivan Lozanof9e21722020-12-02 09:00:51 -05002973 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002974 // Host code is not restricted
2975 return
2976 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002977
2978 // VNDK is cc.Module supported only for now.
2979 if ccFrom, ok := from.(*Module); ok && from.UseVndk() {
Justin Yun63e9ec72020-10-29 16:49:43 +09002980 // Though allowed dependency is limited by the image mutator,
2981 // each vendor and product module needs to check link-type
2982 // for VNDK.
Ivan Lozano52767be2019-10-18 14:49:46 -07002983 if ccTo, ok := to.(*Module); ok {
2984 if ccFrom.vndkdep != nil {
2985 ccFrom.vndkdep.vndkCheckLinkType(ctx, ccTo, tag)
2986 }
Ivan Lozanoc08897c2021-04-02 12:41:32 -04002987 } else if _, ok := to.(LinkableInterface); !ok {
Ivan Lozano52767be2019-10-18 14:49:46 -07002988 ctx.ModuleErrorf("Attempting to link VNDK cc.Module with unsupported module type")
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002989 }
2990 return
2991 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002992 // TODO(b/244244438) : Remove this once all variants are implemented
2993 if ccFrom, ok := from.(*Module); ok && ccFrom.isImportedApiLibrary() {
2994 return
2995 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002996 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002997 // Platform code can link to anything
2998 return
2999 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08003000 if from.InRamdisk() {
3001 // Ramdisk code is not NDK
3002 return
3003 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003004 if from.InVendorRamdisk() {
3005 // Vendor ramdisk code is not NDK
3006 return
3007 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003008 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09003009 // Recovery code is not NDK
3010 return
3011 }
Colin Cross31076b32020-10-23 17:22:06 -07003012 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003013 if c.NdkPrebuiltStl() {
3014 // These are allowed, but they don't set sdk_version
3015 return
3016 }
3017 if c.StubDecorator() {
3018 // These aren't real libraries, but are the stub shared libraries that are included in
3019 // the NDK.
3020 return
3021 }
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003022 if c.isImportedApiLibrary() {
3023 // Imported library from the API surface is a stub library built against interface definition.
3024 return
3025 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003026 }
Logan Chien834b9a62019-01-14 15:39:03 +08003027
Ivan Lozano52767be2019-10-18 14:49:46 -07003028 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003029 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3030 // to link to libc++ (non-NDK and without sdk_version).
3031 return
3032 }
3033
Ivan Lozano52767be2019-10-18 14:49:46 -07003034 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003035 // NDK code linking to platform code is never okay.
3036 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003037 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003038 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003039 }
3040
3041 // At this point we know we have two NDK libraries, but we need to
3042 // check that we're not linking against anything built against a higher
3043 // API level, as it is only valid to link against older or equivalent
3044 // APIs.
3045
Inseob Kim01a28722018-04-11 09:48:45 +09003046 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003047 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003048 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003049 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003050 // Current can't be linked against by anything else.
3051 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003052 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003053 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003054 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003055 if err != nil {
3056 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003057 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003058 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003059 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003060 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003061 if err != nil {
3062 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003063 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003064 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003065 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003066
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003067 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003068 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003069 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003070 }
3071 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003072 }
Dan Albert202fe492017-12-15 13:56:59 -08003073
3074 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003075 fromStl := from.SelectedStl()
3076 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003077 if fromStl == "" || toStl == "" {
3078 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003079 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003080 // We can be permissive with the system "STL" since it is only the C++
3081 // ABI layer, but in the future we should make sure that everyone is
3082 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003083 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003084 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003085 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3086 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003087 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003088}
3089
Jooyung Han479ca172020-10-19 18:51:07 +09003090func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3091 if c, ok := ctx.Module().(*Module); ok {
3092 ctx.VisitDirectDeps(func(dep android.Module) {
3093 depTag := ctx.OtherModuleDependencyTag(dep)
3094 ccDep, ok := dep.(LinkableInterface)
3095 if ok {
3096 checkLinkType(ctx, c, ccDep, depTag)
3097 }
3098 })
3099 }
3100}
3101
Jiyong Park5fb8c102018-04-09 12:03:06 +09003102// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003103// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3104// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003105// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Jooyung Hana70f0672019-01-18 15:20:43 +09003106func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) {
3107 check := func(child, parent android.Module) bool {
3108 to, ok := child.(*Module)
3109 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003110 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003111 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003112
Jooyung Hana70f0672019-01-18 15:20:43 +09003113 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3114 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003115 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003116
Jiyong Park0474e1f2021-01-14 14:26:06 +09003117 // These dependencies are not excercised at runtime. Tracking these will give us
3118 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003119 depTag := ctx.OtherModuleDependencyTag(child)
3120 if IsHeaderDepTag(depTag) {
3121 return false
3122 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003123 if depTag == staticVariantTag {
3124 return false
3125 }
3126 if depTag == stubImplDepTag {
3127 return false
3128 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003129
Justin Yun63e9ec72020-10-29 16:49:43 +09003130 // Even if target lib has no vendor variant, keep checking dependency
3131 // graph in case it depends on vendor_available or product_available
3132 // but not double_loadable transtively.
3133 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003134 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003135 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003136
Jiyong Park0474e1f2021-01-14 14:26:06 +09003137 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3138 // one.
3139 if Bool(to.VendorProperties.Double_loadable) {
3140 return true
3141 }
3142
Ivan Lozanod7586b62021-04-01 09:49:36 -04003143 if to.IsVndkSp() || to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003144 return false
3145 }
3146
Jooyung Hana70f0672019-01-18 15:20:43 +09003147 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3148 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003149 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003150 return false
3151 }
3152 if module, ok := ctx.Module().(*Module); ok {
3153 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003154 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003155 ctx.WalkDeps(check)
3156 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003157 }
3158 }
3159}
3160
Yu Liue4312402023-01-18 09:15:31 -08003161func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3162 // For the dependency from platform to apex, use the latest stubs
3163 apexSdkVersion := android.FutureApiLevel
3164 if !apexInfo.IsForPlatform() {
3165 apexSdkVersion = apexInfo.MinSdkVersion
3166 }
3167
3168 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3169 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3170 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3171 // (b/144430859)
3172 apexSdkVersion = android.FutureApiLevel
3173 }
3174
3175 return apexSdkVersion
3176}
3177
Colin Crossc99deeb2016-04-11 15:06:20 -07003178// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003179func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003180 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003181
Colin Cross0de8a1e2020-09-18 14:15:30 -07003182 var directStaticDeps []StaticLibraryInfo
3183 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003184
Colin Cross0de8a1e2020-09-18 14:15:30 -07003185 reexportExporter := func(exporter FlagExporterInfo) {
3186 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3187 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3188 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3189 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3190 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003191 }
3192
Colin Cross56a83212020-09-15 18:30:11 -07003193 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
Yu Liue4312402023-01-18 09:15:31 -08003194 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003195
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003196 skipModuleList := map[string]bool{}
3197
3198 var apiImportInfo multitree.ApiImportInfo
3199 hasApiImportInfo := false
3200
3201 ctx.VisitDirectDeps(func(dep android.Module) {
3202 if dep.Name() == "api_imports" {
3203 apiImportInfo = ctx.OtherModuleProvider(dep, multitree.ApiImportsProvider).(multitree.ApiImportInfo)
3204 hasApiImportInfo = true
3205 }
3206 })
3207
3208 if hasApiImportInfo {
3209 targetStubModuleList := map[string]string{}
3210 targetOrigModuleList := map[string]string{}
3211
3212 // Search for dependency which both original module and API imported library with APEX stub exists
3213 ctx.VisitDirectDeps(func(dep android.Module) {
3214 depName := ctx.OtherModuleName(dep)
3215 if apiLibrary, ok := apiImportInfo.ApexSharedLibs[depName]; ok {
3216 targetStubModuleList[apiLibrary] = depName
3217 }
3218 })
3219 ctx.VisitDirectDeps(func(dep android.Module) {
3220 depName := ctx.OtherModuleName(dep)
3221 if origLibrary, ok := targetStubModuleList[depName]; ok {
3222 targetOrigModuleList[origLibrary] = depName
3223 }
3224 })
3225
3226 // Decide which library should be used between original and API imported library
3227 ctx.VisitDirectDeps(func(dep android.Module) {
3228 depName := ctx.OtherModuleName(dep)
3229 if apiLibrary, ok := targetOrigModuleList[depName]; ok {
Spandan Das604f3762023-03-16 22:51:40 +00003230 if ShouldUseStubForApex(ctx, dep) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003231 skipModuleList[depName] = true
3232 } else {
3233 skipModuleList[apiLibrary] = true
3234 }
3235 }
3236 })
3237 }
3238
Colin Crossd11fcda2017-10-23 17:59:01 -07003239 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003240 depName := ctx.OtherModuleName(dep)
3241 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003242
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003243 if _, ok := skipModuleList[depName]; ok {
3244 // skip this module because original module or API imported module matching with this should be used instead.
3245 return
3246 }
3247
Dan Willemsen47450072021-10-19 20:24:49 -07003248 if depTag == android.DarwinUniversalVariantTag {
3249 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
3250 return
3251 }
3252
Vinh Tran367d89d2023-04-28 11:21:25 -04003253 if depTag == aidlLibraryTag {
3254 if ctx.OtherModuleHasProvider(dep, aidl_library.AidlLibraryProvider) {
3255 depPaths.AidlLibraryInfos = append(
3256 depPaths.AidlLibraryInfos,
3257 ctx.OtherModuleProvider(
3258 dep,
3259 aidl_library.AidlLibraryProvider).(aidl_library.AidlLibraryInfo),
3260 )
3261 }
3262 }
3263
Ivan Lozano52767be2019-10-18 14:49:46 -07003264 ccDep, ok := dep.(LinkableInterface)
3265 if !ok {
3266
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003267 // handling for a few module types that aren't cc Module but that are also supported
3268 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003269 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003270 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003271 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3272 genRule.GeneratedSourceFiles()...)
3273 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003274 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003275 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003276 // Support exported headers from a generated_sources dependency
3277 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003278 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003279 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003280 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003281 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003282 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003283 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003284 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003285 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003286 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3287 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003288 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003289 // 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 +09003290 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003291
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003292 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003293 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003294 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003295 }
Colin Crosscef792e2021-06-11 18:01:26 -07003296 case CrtBeginDepTag:
3297 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3298 case CrtEndDepTag:
3299 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003300 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003301 return
3302 }
3303
Colin Crossfe17f6f2019-03-28 19:30:56 -07003304 if depTag == android.ProtoPluginDepTag {
3305 return
3306 }
3307
Colin Crossd11fcda2017-10-23 17:59:01 -07003308 if dep.Target().Os != ctx.Os() {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003309 ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName)
3310 return
3311 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003312 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003313 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3314 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003315 return
3316 }
3317
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003318 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003319 // Skip reused objects for stub libraries, they use their own stub object file instead.
3320 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3321 // version mutator, so the stubs variant is created from the shared variant that
3322 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003323 if !c.library.buildStubs() {
Colin Crossa717db72020-10-23 14:53:06 -07003324 staticAnalogue := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3325 objs := staticAnalogue.ReuseObjects
3326 depPaths.Objs = depPaths.Objs.Append(objs)
3327 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3328 reexportExporter(depExporterInfo)
3329 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003330 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003331 }
3332
Colin Cross6e511a92020-07-27 21:26:48 -07003333 linkFile := ccDep.OutputFile()
3334
3335 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3336 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003337 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003338 return
3339 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003340
Jiyong Parke3867542020-12-03 17:28:25 +09003341 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3342 return
3343 }
3344
Colin Cross0de8a1e2020-09-18 14:15:30 -07003345 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
Colin Crossc99deeb2016-04-11 15:06:20 -07003346
Colin Cross6e511a92020-07-27 21:26:48 -07003347 var ptr *android.Paths
3348 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003349
Colin Cross6e511a92020-07-27 21:26:48 -07003350 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003351
Colin Cross6e511a92020-07-27 21:26:48 -07003352 switch {
3353 case libDepTag.header():
Colin Cross649d8172020-12-10 12:30:21 -08003354 if !ctx.OtherModuleHasProvider(dep, HeaderLibraryInfoProvider) {
3355 if !ctx.Config().AllowMissingDependencies() {
3356 ctx.ModuleErrorf("module %q is not a header library", depName)
3357 } else {
3358 ctx.AddMissingDependencies([]string{depName})
3359 }
3360 return
3361 }
Colin Cross6e511a92020-07-27 21:26:48 -07003362 case libDepTag.shared():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003363 if !ctx.OtherModuleHasProvider(dep, SharedLibraryInfoProvider) {
3364 if !ctx.Config().AllowMissingDependencies() {
3365 ctx.ModuleErrorf("module %q is not a shared library", depName)
3366 } else {
3367 ctx.AddMissingDependencies([]string{depName})
3368 }
3369 return
3370 }
Jiyong Parke3867542020-12-03 17:28:25 +09003371
Jiyong Park7d55b612021-06-11 17:22:09 +09003372 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3373 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003374
Jiyong Park1ad8e162020-12-01 23:40:09 +09003375 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3376 // linkFile, depFile, and ptr.
3377 if c.IsStubs() {
3378 break
3379 }
3380
Colin Cross0de8a1e2020-09-18 14:15:30 -07003381 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3382 depFile = sharedLibraryInfo.TableOfContents
3383
Colin Cross6e511a92020-07-27 21:26:48 -07003384 ptr = &depPaths.SharedLibs
3385 switch libDepTag.Order {
3386 case earlyLibraryDependency:
3387 ptr = &depPaths.EarlySharedLibs
3388 depPtr = &depPaths.EarlySharedLibsDeps
3389 case normalLibraryDependency:
3390 ptr = &depPaths.SharedLibs
3391 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003392 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003393 case lateLibraryDependency:
3394 ptr = &depPaths.LateSharedLibs
3395 depPtr = &depPaths.LateSharedLibsDeps
3396 default:
3397 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003398 }
Colin Cross6e511a92020-07-27 21:26:48 -07003399 case libDepTag.static():
Colin Cross0de8a1e2020-09-18 14:15:30 -07003400 if !ctx.OtherModuleHasProvider(dep, StaticLibraryInfoProvider) {
3401 if !ctx.Config().AllowMissingDependencies() {
3402 ctx.ModuleErrorf("module %q is not a static library", depName)
3403 } else {
3404 ctx.AddMissingDependencies([]string{depName})
3405 }
3406 return
3407 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003408
3409 // Stubs lib doesn't link to the static lib dependencies. Don't set
3410 // linkFile, depFile, and ptr.
3411 if c.IsStubs() {
3412 break
3413 }
3414
Colin Cross0de8a1e2020-09-18 14:15:30 -07003415 staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo)
3416 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
Colin Cross6e511a92020-07-27 21:26:48 -07003417 if libDepTag.wholeStatic {
3418 ptr = &depPaths.WholeStaticLibs
Colin Cross0de8a1e2020-09-18 14:15:30 -07003419 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3420 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
Inseob Kimeec88e12020-01-22 11:11:29 +09003421 } else {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003422 // This case normally catches prebuilt static
3423 // libraries, but it can also occur when
3424 // AllowMissingDependencies is on and the
3425 // dependencies has no sources of its own
3426 // but has a whole_static_libs dependency
3427 // on a missing library. We want to depend
3428 // on the .a file so that there is something
3429 // in the dependency tree that contains the
3430 // error rule for the missing transitive
3431 // dependency.
3432 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003433 }
Colin Crossa2bcf2c2022-02-11 13:11:55 -08003434 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3435 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
Colin Cross6e511a92020-07-27 21:26:48 -07003436 } else {
3437 switch libDepTag.Order {
3438 case earlyLibraryDependency:
3439 panic(fmt.Errorf("early static libs not suppported"))
3440 case normalLibraryDependency:
3441 // static dependencies will be handled separately so they can be ordered
3442 // using transitive dependencies.
3443 ptr = nil
Colin Cross0de8a1e2020-09-18 14:15:30 -07003444 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003445 case lateLibraryDependency:
3446 ptr = &depPaths.LateStaticLibs
3447 default:
3448 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Inseob Kimeec88e12020-01-22 11:11:29 +09003449 }
3450 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003451 if libDepTag.unexportedSymbols {
3452 depPaths.LdFlags = append(depPaths.LdFlags,
3453 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3454 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003455 }
3456
Colin Cross6e511a92020-07-27 21:26:48 -07003457 if libDepTag.static() && !libDepTag.wholeStatic {
3458 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3459 ctx.ModuleErrorf("module %q not a static library", depName)
3460 return
3461 }
Logan Chien43d34c32017-12-20 01:17:32 +08003462
Colin Cross6e511a92020-07-27 21:26:48 -07003463 // When combining coverage files for shared libraries and executables, coverage files
3464 // in static libraries act as if they were whole static libraries. The same goes for
3465 // source based Abi dump files.
3466 if c, ok := ccDep.(*Module); ok {
3467 staticLib := c.linker.(libraryInterface)
3468 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3469 staticLib.objs().coverageFiles...)
3470 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3471 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003472 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003473 // Handle non-CC modules here
3474 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003475 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003476 }
3477 }
3478
Colin Cross6e511a92020-07-27 21:26:48 -07003479 if ptr != nil {
3480 if !linkFile.Valid() {
3481 if !ctx.Config().AllowMissingDependencies() {
3482 ctx.ModuleErrorf("module %q missing output file", depName)
3483 } else {
3484 ctx.AddMissingDependencies([]string{depName})
3485 }
3486 return
3487 }
3488 *ptr = append(*ptr, linkFile.Path())
3489 }
3490
3491 if depPtr != nil {
3492 dep := depFile
3493 if !dep.Valid() {
3494 dep = linkFile
3495 }
3496 *depPtr = append(*depPtr, dep.Path())
3497 }
3498
Colin Cross0de8a1e2020-09-18 14:15:30 -07003499 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3500 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3501 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3502 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
3503
3504 if libDepTag.reexportFlags {
3505 reexportExporter(depExporterInfo)
3506 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3507 // Re-exported shared library headers must be included as well since they can help us with type information
3508 // about template instantiations (instantiated from their headers).
3509 // -isystem headers are not included since for bionic libraries, abi-filtering is taken care of by version
3510 // scripts.
3511 c.sabi.Properties.ReexportedIncludes = append(
3512 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
3513 }
3514
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003515 makeLibName := MakeLibName(ctx, c, ccDep, depName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003516 switch {
3517 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003518 c.Properties.AndroidMkHeaderLibs = append(
3519 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003520 case libDepTag.shared():
Colin Cross31076b32020-10-23 17:22:06 -07003521 if lib := moduleLibraryInterface(dep); lib != nil {
3522 if lib.buildStubs() && dep.(android.ApexModule).InAnyApex() {
Colin Cross6e511a92020-07-27 21:26:48 -07003523 // Add the dependency to the APEX(es) providing the library so that
3524 // m <module> can trigger building the APEXes as well.
Colin Cross56a83212020-09-15 18:30:11 -07003525 depApexInfo := ctx.OtherModuleProvider(dep, android.ApexInfoProvider).(android.ApexInfo)
Jiyong Parkab50b072021-05-12 17:13:56 +09003526 for _, an := range depApexInfo.InApexVariants {
Colin Cross6e511a92020-07-27 21:26:48 -07003527 c.Properties.ApexesProvidingSharedLibs = append(
3528 c.Properties.ApexesProvidingSharedLibs, an)
3529 }
3530 }
3531 }
3532
3533 // Note: the order of libs in this list is not important because
3534 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003535 c.Properties.AndroidMkSharedLibs = append(
3536 c.Properties.AndroidMkSharedLibs, makeLibName)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003537 // Record BaseLibName for snapshots.
3538 c.Properties.SnapshotSharedLibs = append(c.Properties.SnapshotSharedLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003539 case libDepTag.static():
3540 if libDepTag.wholeStatic {
3541 c.Properties.AndroidMkWholeStaticLibs = append(
3542 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3543 } else {
3544 c.Properties.AndroidMkStaticLibs = append(
3545 c.Properties.AndroidMkStaticLibs, makeLibName)
3546 }
Justin Yun5e035862021-06-29 20:50:37 +09003547 // Record BaseLibName for snapshots.
3548 c.Properties.SnapshotStaticLibs = append(c.Properties.SnapshotStaticLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003549 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003550 } else if !c.IsStubs() {
3551 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3552
Colin Cross6e511a92020-07-27 21:26:48 -07003553 switch depTag {
3554 case runtimeDepTag:
3555 c.Properties.AndroidMkRuntimeLibs = append(
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003556 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, depName)+libDepTag.makeSuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003557 // Record BaseLibName for snapshots.
3558 c.Properties.SnapshotRuntimeLibs = append(c.Properties.SnapshotRuntimeLibs, BaseLibName(depName))
Colin Cross6e511a92020-07-27 21:26:48 -07003559 case objDepTag:
3560 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3561 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003562 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003563 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003564 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003565 case dynamicLinkerDepTag:
3566 depPaths.DynamicLinker = linkFile
3567 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003568 }
Colin Crossca860ac2016-01-04 14:34:37 -08003569 })
3570
Jeff Gaston294356f2017-09-27 17:05:30 -07003571 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003572 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3573 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3574 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003575
Colin Crossdd84e052017-05-17 13:44:16 -07003576 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003577 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003578 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3579 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003580 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Jiyong Park74955042019-10-22 20:19:51 +09003581 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3582 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003583 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003584 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003585 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003586
3587 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003588 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003589 }
Colin Crossdd84e052017-05-17 13:44:16 -07003590
Colin Crossca860ac2016-01-04 14:34:37 -08003591 return depPaths
3592}
3593
Spandan Das604f3762023-03-16 22:51:40 +00003594func ShouldUseStubForApex(ctx android.ModuleContext, dep android.Module) bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09003595 depName := ctx.OtherModuleName(dep)
Jiyong Park7d55b612021-06-11 17:22:09 +09003596 thisModule, ok := ctx.Module().(android.ApexModule)
3597 if !ok {
3598 panic(fmt.Errorf("Not an APEX module: %q", ctx.ModuleName()))
3599 }
3600
3601 useVndk := false
3602 bootstrap := false
3603 if linkable, ok := ctx.Module().(LinkableInterface); !ok {
3604 panic(fmt.Errorf("Not a Linkable module: %q", ctx.ModuleName()))
3605 } else {
3606 useVndk = linkable.UseVndk()
3607 bootstrap = linkable.Bootstrap()
3608 }
3609
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003610 apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)
3611
3612 useStubs := false
3613
3614 if lib := moduleLibraryInterface(dep); lib.buildStubs() && useVndk { // LLNDK
3615 if !apexInfo.IsForPlatform() {
3616 // For platform libraries, use current version of LLNDK
3617 // If this is for use_vendor apex we will apply the same rules
3618 // of apex sdk enforcement below to choose right version.
3619 useStubs = true
3620 }
3621 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3622 // If not building for APEX or the containing APEX allows the use of
3623 // platform APIs, use stubs only when it is from an APEX (and not from
3624 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3625 // bootstrap modules, always link to non-stub variant
3626 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3627
3628 isApexImportedApiLibrary := false
3629
3630 if cc, ok := dep.(*Module); ok {
3631 if apiLibrary, ok := cc.linker.(*apiLibraryDecorator); ok {
3632 if apiLibrary.hasApexStubs() {
3633 isApexImportedApiLibrary = true
3634 }
3635 }
3636 }
3637
3638 useStubs = (isNotInPlatform || isApexImportedApiLibrary) && !bootstrap
3639
3640 if useStubs {
3641 // Another exception: if this module is a test for an APEX, then
3642 // it is linked with the non-stub variant of a module in the APEX
3643 // as if this is part of the APEX.
3644 testFor := ctx.Provider(android.ApexTestForInfoProvider).(android.ApexTestForInfo)
3645 for _, apexContents := range testFor.ApexContents {
3646 if apexContents.DirectlyInApex(depName) {
3647 useStubs = false
3648 break
3649 }
3650 }
3651 }
3652 if useStubs {
3653 // Yet another exception: If this module and the dependency are
3654 // available to the same APEXes then skip stubs between their
3655 // platform variants. This complements the test_for case above,
3656 // which avoids the stubs on a direct APEX library dependency, by
3657 // avoiding stubs for indirect test dependencies as well.
3658 //
3659 // TODO(b/183882457): This doesn't work if the two libraries have
3660 // only partially overlapping apex_available. For that test_for
3661 // modules would need to be split into APEX variants and resolved
3662 // separately for each APEX they have access to.
3663 if !isApexImportedApiLibrary && android.AvailableToSameApexes(thisModule, dep.(android.ApexModule)) {
3664 useStubs = false
3665 }
3666 }
3667 } else {
3668 // If building for APEX, use stubs when the parent is in any APEX that
3669 // the child is not in.
3670 useStubs = !android.DirectlyInAllApexes(apexInfo, depName)
3671 }
3672
3673 return useStubs
3674}
3675
3676// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3677// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3678// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3679// has different level of updatability. For example, if a library foo in an APEX depends on a
3680// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3681// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3682// same APEX as foo, the non-stub variant of bar is used.
3683func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3684 depTag := ctx.OtherModuleDependencyTag(dep)
3685 libDepTag, ok := depTag.(libraryDependencyTag)
3686 if !ok || !libDepTag.shared() {
3687 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3688 }
3689
Jiyong Park7d55b612021-06-11 17:22:09 +09003690 sharedLibraryInfo := ctx.OtherModuleProvider(dep, SharedLibraryInfoProvider).(SharedLibraryInfo)
3691 depExporterInfo := ctx.OtherModuleProvider(dep, FlagExporterInfoProvider).(FlagExporterInfo)
3692 sharedLibraryStubsInfo := ctx.OtherModuleProvider(dep, SharedLibraryStubsProvider).(SharedLibraryStubsInfo)
Jiyong Park7d55b612021-06-11 17:22:09 +09003693
3694 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003695 // when to use (unspecified) stubs, use the latest one.
Spandan Das604f3762023-03-16 22:51:40 +00003696 if ShouldUseStubForApex(ctx, dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003697 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3698 toUse := stubs[len(stubs)-1]
3699 sharedLibraryInfo = toUse.SharedLibraryInfo
3700 depExporterInfo = toUse.FlagExporterInfo
3701 }
3702 }
3703 return sharedLibraryInfo, depExporterInfo
3704}
3705
Colin Cross0de8a1e2020-09-18 14:15:30 -07003706// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3707// to match the topological order of the dependency tree, including any static analogues of
3708// direct shared libraries. It returns the ordered static dependencies, and an android.DepSet
3709// of the transitive dependencies.
Colin Crossc85750b2022-04-21 12:50:51 -07003710func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive *android.DepSet[android.Path]) {
3711 transitiveStaticLibsBuilder := android.NewDepSetBuilder[android.Path](android.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003712 var staticPaths android.Paths
3713 for _, staticDep := range staticDeps {
3714 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3715 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3716 }
3717 for _, sharedDep := range sharedDeps {
Liz Kammeref6dfea2021-06-08 15:37:09 -04003718 if sharedDep.TransitiveStaticLibrariesForOrdering != nil {
3719 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003720 }
3721 }
3722 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3723
3724 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3725
3726 // reorder the dependencies based on transitive dependencies
3727 staticPaths = android.FirstUniquePaths(staticPaths)
3728 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3729
3730 if len(orderedStaticPaths) != len(staticPaths) {
3731 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3732 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3733 }
3734
3735 return orderedStaticPaths, transitiveStaticLibs
3736}
3737
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003738// BaseLibName trims known prefixes and suffixes
3739func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003740 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3741 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003742 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003743 return libName
3744}
3745
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003746func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003747 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003748 ccDepModule, _ := ccDep.(*Module)
3749 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003750 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003751
Justin Yuncbca3732021-02-03 19:24:13 +09003752 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003753 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003754 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003755 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003756
Ivan Lozanod1dec542021-05-26 15:33:11 -04003757 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003758 }
3759 }
3760
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003761 if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
3762 !c.InRamdisk() && !c.InVendorRamdisk() && !c.InRecovery() {
Colin Cross6e511a92020-07-27 21:26:48 -07003763 // The vendor module is a no-vendor-variant VNDK library. Depend on the
3764 // core module instead.
3765 return libName
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003766 } else if ccDep.UseVndk() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003767 // The vendor and product modules in Make will have been renamed to not conflict with the
3768 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003769 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003770 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003771 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003772 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003773 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003774 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003775 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003776 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003777 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003778 } else {
3779 return libName
3780 }
3781}
3782
Colin Crossca860ac2016-01-04 14:34:37 -08003783func (c *Module) InstallInData() bool {
3784 if c.installer == nil {
3785 return false
3786 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003787 return c.installer.inData()
3788}
3789
3790func (c *Module) InstallInSanitizerDir() bool {
3791 if c.installer == nil {
3792 return false
3793 }
3794 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003795 return true
3796 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003797 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003798}
3799
Yifan Hong1b3348d2020-01-21 15:53:22 -08003800func (c *Module) InstallInRamdisk() bool {
3801 return c.InRamdisk()
3802}
3803
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003804func (c *Module) InstallInVendorRamdisk() bool {
3805 return c.InVendorRamdisk()
3806}
3807
Jiyong Parkf9332f12018-02-01 00:54:12 +09003808func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003809 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003810}
3811
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003812func (c *Module) MakeUninstallable() {
3813 if c.installer == nil {
3814 c.ModuleBase.MakeUninstallable()
3815 return
3816 }
3817 c.installer.makeUninstallable(c)
3818}
3819
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003820func (c *Module) HostToolPath() android.OptionalPath {
3821 if c.installer == nil {
3822 return android.OptionalPath{}
3823 }
3824 return c.installer.hostToolPath()
3825}
3826
Nan Zhangd4e641b2017-07-12 12:55:28 -07003827func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3828 return c.outputFile
3829}
3830
Colin Cross41955e82019-05-29 14:40:35 -07003831func (c *Module) OutputFiles(tag string) (android.Paths, error) {
3832 switch tag {
3833 case "":
3834 if c.outputFile.Valid() {
3835 return android.Paths{c.outputFile.Path()}, nil
3836 }
3837 return android.Paths{}, nil
Colin Cross31d89b42022-10-04 16:35:39 -07003838 case "unstripped":
3839 if c.linker != nil {
3840 return android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), nil
3841 }
3842 return nil, nil
Colin Cross41955e82019-05-29 14:40:35 -07003843 default:
3844 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003845 }
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003846}
3847
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003848func (c *Module) static() bool {
3849 if static, ok := c.linker.(interface {
3850 static() bool
3851 }); ok {
3852 return static.static()
3853 }
3854 return false
3855}
3856
Jiyong Park379de2f2018-12-19 02:47:14 +09003857func (c *Module) staticBinary() bool {
3858 if static, ok := c.linker.(interface {
3859 staticBinary() bool
3860 }); ok {
3861 return static.staticBinary()
3862 }
3863 return false
3864}
3865
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003866func (c *Module) testBinary() bool {
3867 if test, ok := c.linker.(interface {
3868 testBinary() bool
3869 }); ok {
3870 return test.testBinary()
3871 }
3872 return false
3873}
3874
Jingwen Chen537242c2022-08-24 11:53:27 +00003875func (c *Module) testLibrary() bool {
3876 if test, ok := c.linker.(interface {
3877 testLibrary() bool
3878 }); ok {
3879 return test.testLibrary()
3880 }
3881 return false
3882}
3883
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003884func (c *Module) benchmarkBinary() bool {
3885 if b, ok := c.linker.(interface {
3886 benchmarkBinary() bool
3887 }); ok {
3888 return b.benchmarkBinary()
3889 }
3890 return false
3891}
3892
3893func (c *Module) fuzzBinary() bool {
3894 if f, ok := c.linker.(interface {
3895 fuzzBinary() bool
3896 }); ok {
3897 return f.fuzzBinary()
3898 }
3899 return false
3900}
3901
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003902// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3903func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003904 if h, ok := c.linker.(interface {
3905 header() bool
3906 }); ok {
3907 return h.header()
3908 }
3909 return false
3910}
3911
Ivan Lozanod7586b62021-04-01 09:49:36 -04003912func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003913 if b, ok := c.linker.(interface {
3914 binary() bool
3915 }); ok {
3916 return b.binary()
3917 }
3918 return false
3919}
3920
Justin Yun5e035862021-06-29 20:50:37 +09003921func (c *Module) StaticExecutable() bool {
3922 if b, ok := c.linker.(*binaryDecorator); ok {
3923 return b.static()
3924 }
3925 return false
3926}
3927
Ivan Lozanod7586b62021-04-01 09:49:36 -04003928func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003929 if o, ok := c.linker.(interface {
3930 object() bool
3931 }); ok {
3932 return o.object()
3933 }
3934 return false
3935}
3936
Ivan Lozanof9e21722020-12-02 09:00:51 -05003937func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Ivan Lozano52767be2019-10-18 14:49:46 -07003938 if c.UseVndk() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003939 if c.IsLlndk() {
3940 if !c.IsLlndkPublic() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003941 return "native:vndk_private"
Colin Crossb60190a2018-09-04 16:28:17 -07003942 }
Colin Cross127bb8b2020-12-16 16:46:01 -08003943 return "native:vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003944 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003945 if c.IsVndk() && !c.IsVndkExt() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003946 if c.IsVndkPrivate() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003947 return "native:vndk_private"
Jooyung Han38002912019-05-16 04:01:54 +09003948 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003949 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003950 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003951 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003952 return "native:product"
3953 }
Jooyung Han38002912019-05-16 04:01:54 +09003954 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003955 } else if c.InRamdisk() {
3956 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003957 } else if c.InVendorRamdisk() {
3958 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003959 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003960 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003961 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003962 return "native:ndk:none:none"
3963 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3964 //family, link := getNdkStlFamilyAndLinkType(c)
3965 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
Ivan Lozano52767be2019-10-18 14:49:46 -07003966 } else if actx.DeviceConfig().VndkUseCoreVariant() && !c.MustUseVendorVariant() {
Vic Yangefd249e2018-11-12 20:19:56 -08003967 return "native:platform_vndk"
Colin Crossb60190a2018-09-04 16:28:17 -07003968 } else {
3969 return "native:platform"
3970 }
3971}
3972
Jiyong Park9d452992018-10-03 00:38:19 +09003973// Overrides ApexModule.IsInstallabeToApex()
Roland Levillainf89cd092019-07-29 16:22:59 +01003974// Only shared/runtime libraries and "test_per_src" tests are installable to APEX.
Jiyong Park9d452992018-10-03 00:38:19 +09003975func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003976 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003977 // Stub libs and prebuilt libs in a versioned SDK are not
3978 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003979 return lib.shared() && !lib.buildStubs()
Roland Levillainf89cd092019-07-29 16:22:59 +01003980 } else if _, ok := c.linker.(testPerSrc); ok {
3981 return true
Jiyong Park9d452992018-10-03 00:38:19 +09003982 }
3983 return false
3984}
3985
Jiyong Parka90ca002019-10-07 15:47:24 +09003986func (c *Module) AvailableFor(what string) bool {
3987 if linker, ok := c.linker.(interface {
3988 availableFor(string) bool
3989 }); ok {
3990 return c.ApexModuleBase.AvailableFor(what) || linker.availableFor(what)
3991 } else {
3992 return c.ApexModuleBase.AvailableFor(what)
3993 }
3994}
3995
Jiyong Park62304bb2020-04-13 16:19:48 +09003996func (c *Module) TestFor() []string {
Jiyong Park46a512f2020-12-04 18:02:13 +09003997 return c.Properties.Test_for
Jiyong Park62304bb2020-04-13 16:19:48 +09003998}
3999
Paul Duffin0cb37b92020-03-04 14:52:46 +00004000func (c *Module) EverInstallable() bool {
4001 return c.installer != nil &&
4002 // Check to see whether the module is actually ever installable.
4003 c.installer.everInstallable()
4004}
4005
Ivan Lozanod7586b62021-04-01 09:49:36 -04004006func (c *Module) PreventInstall() bool {
4007 return c.Properties.PreventInstall
4008}
4009
4010func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07004011 if c.library != nil {
4012 if i := c.library.installable(); i != nil {
4013 return i
4014 }
4015 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04004016 return c.Properties.Installable
4017}
4018
4019func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00004020 ret := c.EverInstallable() &&
4021 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04004022 proptools.BoolDefault(c.Installable(), true) &&
4023 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004024
4025 // The platform variant doesn't need further condition. Apex variants however might not
4026 // be installable because it will likely to be included in the APEX and won't appear
4027 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07004028 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004029 return ret
4030 }
4031
4032 // Special case for modules that are configured to be installed to /data, which includes
4033 // test modules. For these modules, both APEX and non-APEX variants are considered as
4034 // installable. This is because even the APEX variants won't be included in the APEX, but
4035 // will anyway be installed to /data/*.
4036 // See b/146995717
4037 if c.InstallInData() {
4038 return ret
4039 }
4040
4041 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09004042}
4043
Logan Chien41eabe62019-04-10 13:33:58 +08004044func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
4045 if c.linker != nil {
4046 if library, ok := c.linker.(*libraryDecorator); ok {
4047 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
4048 }
4049 }
4050}
4051
Jiyong Park45bf82e2020-12-15 22:29:02 +09004052var _ android.ApexModule = (*Module)(nil)
4053
4054// Implements android.ApexModule
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004055func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Colin Cross6e511a92020-07-27 21:26:48 -07004056 depTag := ctx.OtherModuleDependencyTag(dep)
4057 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
4058
4059 if cc, ok := dep.(*Module); ok {
4060 if cc.HasStubsVariants() {
4061 if isLibDepTag && libDepTag.shared() {
4062 // dynamic dep to a stubs lib crosses APEX boundary
4063 return false
Jiyong Parkd7536ba2020-01-16 17:14:23 +09004064 }
Colin Cross6e511a92020-07-27 21:26:48 -07004065 if IsRuntimeDepTag(depTag) {
4066 // runtime dep to a stubs lib also crosses APEX boundary
Jiyong Parkd7536ba2020-01-16 17:14:23 +09004067 return false
4068 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004069 }
Zhijun Heec285872021-04-24 10:47:08 -07004070 if cc.IsLlndk() {
4071 return false
4072 }
Colin Crossaac32222020-07-29 12:51:56 -07004073 if isLibDepTag && c.static() && libDepTag.shared() {
Colin Cross6e511a92020-07-27 21:26:48 -07004074 // shared_lib dependency from a static lib is considered as crossing
4075 // the APEX boundary because the dependency doesn't actually is
4076 // linked; the dependency is used only during the compilation phase.
4077 return false
4078 }
Jiyong Parke3867542020-12-03 17:28:25 +09004079
4080 if isLibDepTag && libDepTag.excludeInApex {
4081 return false
4082 }
Colin Cross6e511a92020-07-27 21:26:48 -07004083 }
Colin Crossc1b36442021-05-06 13:42:48 -07004084 if depTag == stubImplDepTag {
4085 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004086 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004087 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004088 if depTag == staticVariantTag {
4089 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4090 // actually mean that the static lib (and its dependencies) are copied into the
4091 // APEX.
4092 return false
4093 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004094 return true
4095}
4096
Jiyong Park45bf82e2020-12-15 22:29:02 +09004097// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07004098func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
4099 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09004100 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4101 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
4102 return nil
4103 }
Jooyung Han749dc692020-04-15 11:03:39 +09004104 // We don't check for prebuilt modules
4105 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4106 return nil
4107 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004108
Jooyung Han749dc692020-04-15 11:03:39 +09004109 minSdkVersion := c.MinSdkVersion()
4110 if minSdkVersion == "apex_inherit" {
4111 return nil
4112 }
4113 if minSdkVersion == "" {
4114 // JNI libs within APK-in-APEX fall into here
4115 // Those are okay to set sdk_version instead
4116 // We don't have to check if this is a SDK variant because
4117 // non-SDK variant resets sdk_version, which works too.
4118 minSdkVersion = c.SdkVersion()
4119 }
Dan Albertc8060532020-07-22 22:32:17 -07004120 if minSdkVersion == "" {
4121 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4122 }
4123 // Not using nativeApiLevelFromUser because the context here is not
4124 // necessarily a native context.
4125 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004126 if err != nil {
4127 return err
4128 }
Dan Albertc8060532020-07-22 22:32:17 -07004129
Colin Cross8ca61c12022-10-06 21:00:14 -07004130 // A dependency only needs to support a min_sdk_version at least
4131 // as high as the api level that the architecture was introduced in.
4132 // This allows introducing new architectures in the platform that
4133 // need to be included in apexes that normally require an older
4134 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004135 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004136 if sdkVersion.LessThan(minApiForArch) {
4137 sdkVersion = minApiForArch
4138 }
4139
Dan Albertc8060532020-07-22 22:32:17 -07004140 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004141 return fmt.Errorf("newer SDK(%v)", ver)
4142 }
4143 return nil
4144}
4145
Paul Duffinb5769c12021-05-12 16:16:51 +01004146// Implements android.ApexModule
4147func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4148 // stub libraries and native bridge libraries are always available to platform
4149 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4150}
4151
Jooyung Han91f92032022-02-04 12:36:33 +09004152// Overrides android.ApexModuleBase.UniqueApexVariations
4153func (c *Module) UniqueApexVariations() bool {
4154 // When a vendor APEX needs a VNDK lib in it (use_vndk_as_stable: false), it should be a unique
4155 // APEX variation. Otherwise, another vendor APEX with use_vndk_as_stable:true may use a wrong
4156 // variation of the VNDK lib because APEX variations are merged/grouped.
Jooyung Handfc864c2023-03-20 18:19:07 +09004157 // TODO(b/274401041) Find a way to merge APEX variations for vendor apexes.
Jooyung Han91f92032022-02-04 12:36:33 +09004158 return c.UseVndk() && c.IsVndk()
4159}
4160
Inseob Kima1888ce2022-10-04 14:42:02 +09004161func (c *Module) overriddenModules() []string {
4162 if o, ok := c.linker.(overridable); ok {
4163 return o.overriddenModules()
4164 }
4165 return nil
4166}
4167
Rob Seymour925aa092021-08-10 20:42:03 +00004168var _ snapshot.RelativeInstallPath = (*Module)(nil)
4169
Liz Kammer35ca77e2021-12-22 15:31:40 -05004170type moduleType int
4171
4172const (
4173 unknownType moduleType = iota
4174 binary
4175 object
4176 fullLibrary
4177 staticLibrary
4178 sharedLibrary
4179 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004180 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004181 ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004182 ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004183)
4184
4185func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004186 if c.testBinary() {
4187 // testBinary is also a binary, so this comes before the c.Binary()
4188 // conditional. A testBinary has additional implicit dependencies and
4189 // other test-only semantics.
4190 return testBin
4191 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004192 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004193 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004194 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004195 } else if c.testLibrary() {
4196 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4197 // will let them add implicit compile deps on gtest, for example.
4198 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004199 // For now, treat them as regular libraries.
4200 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004201 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004202 static := false
4203 shared := false
4204 if library, ok := c.linker.(*libraryDecorator); ok {
4205 static = library.MutatedProperties.BuildStatic
4206 shared = library.MutatedProperties.BuildShared
4207 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4208 static = library.MutatedProperties.BuildStatic
4209 shared = library.MutatedProperties.BuildShared
4210 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004211 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004212 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004213 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004214 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004215 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004216 return staticLibrary
4217 }
4218 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004219 } else if c.isNDKStubLibrary() {
4220 return ndkLibrary
Spandan Dase12d2522023-09-12 21:42:31 +00004221 } else if c.IsNdkPrebuiltStl() {
4222 return ndkPrebuiltStl
Liz Kammer35ca77e2021-12-22 15:31:40 -05004223 }
4224 return unknownType
4225}
4226
4227// ConvertWithBp2build converts Module to Bazel for bp2build.
Chris Parsons637458d2023-09-19 20:09:00 +00004228func (c *Module) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) {
Yu Liu855cfc22023-09-14 15:10:03 -07004229 if len(c.generators) > 0 {
4230 allConverted := true
4231 for _, generator := range c.generators {
Yu Liuf11b7c32023-10-20 19:15:51 +00004232 allConverted = allConverted && generator.GeneratorBp2build(ctx, c)
Yu Liu855cfc22023-09-14 15:10:03 -07004233 }
4234 if allConverted {
4235 return
4236 }
4237 }
4238
Liz Kammer35ca77e2021-12-22 15:31:40 -05004239 prebuilt := c.IsPrebuilt()
4240 switch c.typ() {
4241 case binary:
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxb12ff592022-09-01 15:04:04 +00004242 if prebuilt {
4243 prebuiltBinaryBp2Build(ctx, c)
4244 } else {
Jingwen Chen537242c2022-08-24 11:53:27 +00004245 binaryBp2build(ctx, c)
4246 }
4247 case testBin:
4248 if !prebuilt {
4249 testBinaryBp2build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004250 }
4251 case object:
Colin Crossc5075e92022-12-05 16:46:39 -08004252 if prebuilt {
4253 prebuiltObjectBp2Build(ctx, c)
4254 } else {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004255 objectBp2Build(ctx, c)
4256 }
4257 case fullLibrary:
4258 if !prebuilt {
4259 libraryBp2Build(ctx, c)
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004260 } else {
4261 prebuiltLibraryBp2Build(ctx, c)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004262 }
4263 case headerLibrary:
4264 libraryHeadersBp2Build(ctx, c)
4265 case staticLibrary:
Liz Kammer35ca77e2021-12-22 15:31:40 -05004266 if prebuilt {
Trevor Radcliffe58ea4512022-04-07 20:36:39 +00004267 prebuiltLibraryStaticBp2Build(ctx, c, false)
Liz Kammer35ca77e2021-12-22 15:31:40 -05004268 } else {
4269 sharedOrStaticLibraryBp2Build(ctx, c, true)
4270 }
4271 case sharedLibrary:
4272 if prebuilt {
4273 prebuiltLibrarySharedBp2Build(ctx, c)
4274 } else {
4275 sharedOrStaticLibraryBp2Build(ctx, c, false)
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004276 }
Spandan Dase12d2522023-09-12 21:42:31 +00004277 case ndkPrebuiltStl:
4278 ndkPrebuiltStlBp2build(ctx, c)
Spandan Das63acae92023-09-14 22:34:34 +00004279 case ndkLibrary:
4280 ndkLibraryBp2build(ctx, c)
Chris Parsons39a16972023-06-08 14:28:51 +00004281 default:
4282 ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_TYPE_UNSUPPORTED, "")
Spandan Das8b4a5f32022-09-29 00:28:24 +00004283 }
4284}
4285
Colin Crosscfad1192015-11-02 16:43:11 -08004286// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004287type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004288 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004289 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004290 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004291}
4292
Patrice Arrudac249c712019-03-19 17:00:29 -07004293// cc_defaults provides a set of properties that can be inherited by other cc
4294// modules. A module can use the properties from a cc_defaults using
4295// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4296// merged (when possible) by prepending the default module's values to the
4297// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004298func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004299 return DefaultsFactory()
4300}
4301
Colin Cross36242852017-06-23 15:06:31 -07004302func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004303 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004304
Colin Cross36242852017-06-23 15:06:31 -07004305 module.AddProperties(props...)
4306 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004307 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004308 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004309 &BaseCompilerProperties{},
4310 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004311 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004312 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004313 &StaticProperties{},
4314 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004315 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004316 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004317 &TestLinkerProperties{},
4318 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004319 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004320 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004321 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004322 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004323 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004324 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004325 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004326 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004327 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004328 &SAbiProperties{},
Justin Yun4b2382f2017-07-26 14:22:10 +09004329 &VndkProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004330 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004331 &AfdoProperties{},
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -07004332 &PgoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004333 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004334 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004335 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4336 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004337 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004338 )
Colin Crosscfad1192015-11-02 16:43:11 -08004339
Jooyung Hancc372c52019-09-25 15:18:44 +09004340 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004341
4342 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004343}
4344
Jiyong Park2286afd2020-06-16 21:58:53 +09004345func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004346 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004347}
4348
Kiyoung Kim51279d32022-08-24 14:10:46 +09004349func (c *Module) isImportedApiLibrary() bool {
4350 _, ok := c.linker.(*apiLibraryDecorator)
4351 return ok
4352}
4353
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004354func kytheExtractAllFactory() android.Singleton {
4355 return &kytheExtractAllSingleton{}
4356}
4357
4358type kytheExtractAllSingleton struct {
4359}
4360
4361func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4362 var xrefTargets android.Paths
4363 ctx.VisitAllModules(func(module android.Module) {
4364 if ccModule, ok := module.(xref); ok {
4365 xrefTargets = append(xrefTargets, ccModule.XrefCcFiles()...)
4366 }
4367 })
4368 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4369 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004370 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004371 }
4372}
4373
Jihoon Kangf78a8902022-09-01 22:47:07 +00004374func (c *Module) Partition() string {
4375 if p, ok := c.installer.(interface {
4376 getPartition() string
4377 }); ok {
4378 return p.getPartition()
4379 }
4380 return ""
4381}
4382
Colin Cross06a931b2015-10-28 17:23:31 -07004383var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004384var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004385var BoolPtr = proptools.BoolPtr
4386var String = proptools.String
4387var StringPtr = proptools.StringPtr