blob: 04b66d47979389f0e44eb183aa24f8b15d5c72fb [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 Cross516c5452024-10-28 13:45:21 -070022 "errors"
Colin Cross41955e82019-05-29 14:40:35 -070023 "fmt"
Logan Chien41eabe62019-04-10 13:33:58 +080024 "io"
Colin Cross516c5452024-10-28 13:45:21 -070025 "slices"
Dan Albert9e10cd42016-08-03 14:12:14 -070026 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "strings"
28
Colin Cross97ba0732015-03-23 17:50:24 -070029 "github.com/google/blueprint"
Colin Crossa14fb6a2024-10-23 16:57:06 -070030 "github.com/google/blueprint/depset"
Colin Cross06a931b2015-10-28 17:23:31 -070031 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070032
Vinh Tran367d89d2023-04-28 11:21:25 -040033 "android/soong/aidl_library"
Colin Cross635c3b02016-05-18 15:37:25 -070034 "android/soong/android"
Colin Crossb98c8b02016-07-29 13:44:28 -070035 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070036 "android/soong/fuzz"
Colin Cross5049f022015-03-18 13:28:46 -070037 "android/soong/genrule"
Colin Cross3f40fa42015-01-30 17:27:36 -080038)
39
Yu Liu76d94462024-10-31 23:32:36 +000040type CcMakeVarsInfo struct {
41 WarningsAllowed string
42 UsingWnoError string
43 MissingProfile string
44}
45
46var CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]()
47
Yu Liuec7043d2024-11-05 18:22:20 +000048type CcObjectInfo struct {
49 objFiles android.Paths
50 tidyFiles android.Paths
51 kytheFiles android.Paths
52}
53
54var CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]()
55
Yu Liub1bfa9d2024-12-05 18:57:51 +000056// Common info about the cc module.
57type CcInfo struct {
58 HasStubsVariants bool
59}
60
61var CcInfoProvider = blueprint.NewProvider[CcInfo]()
62
Yu Liu986d98c2024-11-12 00:28:11 +000063type LinkableInfo struct {
64 // StaticExecutable returns true if this is a binary module with "static_executable: true".
65 StaticExecutable bool
66}
67
68var LinkableInfoKey = blueprint.NewProvider[LinkableInfo]()
69
Colin Cross463a90e2015-06-17 14:20:06 -070070func init() {
Paul Duffin036e7002019-12-19 19:16:28 +000071 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -070072
Inseob Kim3b244062023-07-11 13:31:36 +090073 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +000074 pctx.Import("android/soong/cc/config")
75}
76
77func RegisterCCBuildComponents(ctx android.RegistrationContext) {
78 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
79
80 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -070081 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -070082 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -070083 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -070084 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -070085 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -070086 })
Colin Cross16b23492016-01-06 14:41:07 -080087
Paul Duffin036e7002019-12-19 19:16:28 +000088 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -040089 for _, san := range Sanitizers {
90 san.registerMutators(ctx)
91 }
Dan Willemsen581341d2017-02-09 16:16:31 -080092
Colin Cross8a962802024-10-09 15:29:27 -070093 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
94 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -080095
Colin Cross597bad62024-10-08 15:10:55 -070096 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +000097
Colin Crossf5f4ad32024-01-19 15:41:48 -080098 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -070099
Colin Crossd38feb02024-01-23 16:38:06 -0800100 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800101
Colin Cross33e0c812024-01-23 16:36:07 -0800102 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000103
Colin Cross6ac83a82024-01-23 11:23:10 -0800104 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900105
Colin Cross8a962802024-10-09 15:29:27 -0700106 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
107 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700108 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700109
Colin Cross91ae5ec2024-10-01 14:03:40 -0700110 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800111 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700112 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800113 })
114
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000115 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700116}
117
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500118// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
119// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
120// edges to these modules.
121// This object is constructed in DepsMutator, by calling to various module delegates to set
122// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
123// dependencies.
124// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
125// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800126type Deps struct {
127 SharedLibs, LateSharedLibs []string
128 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800129 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800130 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700131
Colin Cross3e5e7782022-06-17 22:17:05 +0000132 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
133 // prevent automatically exporting symbols.
134 UnexportedStaticLibs []string
135
Chris Parsons79d66a52020-06-05 17:26:16 -0400136 // Used for data dependencies adjacent to tests
137 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700138 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400139
Yo Chiang219968c2020-09-22 18:45:04 +0800140 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
141 SystemSharedLibs []string
142
Vinh Tran367d89d2023-04-28 11:21:25 -0400143 // Used by DepMutator to pass aidl_library modules to aidl compiler
144 AidlLibs []string
145
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500146 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800147 StaticUnwinderIfLegacy bool
148
Colin Cross5950f382016-12-13 12:50:57 -0800149 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700150
Colin Cross81413472016-04-11 14:37:39 -0700151 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700152
Cole Faust65cb40a2024-10-21 15:41:42 -0700153 GeneratedSources []string
154 GeneratedHeaders []string
155 DeviceFirstGeneratedHeaders []string
156 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700157
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700158 ReexportGeneratedHeaders []string
159
Colin Crossc465efd2021-06-11 18:00:04 -0700160 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700161
162 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700163 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900164
165 // List of libs that need to be excluded for APEX variant
166 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900167 // List of libs that need to be excluded for non-APEX variant
168 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800169
170 // LLNDK headers for the ABI checker to check LLNDK implementation library.
171 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700172 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800173 // Instead, the LLNDK implementation depends on the LLNDK header libs.
174 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700175}
176
Ivan Lozano0a468a42024-05-13 21:03:34 -0400177// A struct which to collect flags for rlib dependencies
178type RustRlibDep struct {
179 LibPath android.Path // path to the rlib
180 LinkDirs []string // flags required for dependency (e.g. -L flags)
181 CrateName string // crateNames associated with rlibDeps
182}
183
184func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
185 return a.LibPath == b.LibPath
186}
187
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500188// PathDeps is a struct containing file paths to dependencies of a module.
189// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
190// It's used to construct flags for various build statements (such as for compiling and linking).
191// It is then passed to module decorator functions responsible for registering build statements
192// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800193type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700194 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900195 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700196 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900197 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700198 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700199 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400200 // Paths and crateNames for RustStaticLib dependencies
201 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700202
Colin Cross0de8a1e2020-09-18 14:15:30 -0700203 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700204 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700205
Colin Cross26c34ed2016-09-30 17:10:16 -0700206 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100207 Objs Objects
208 // Paths to .o files in dependencies that provide them. Note that these lists
209 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800210 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700211 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700212
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100213 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
214 // the libs from all whole_static_lib dependencies.
215 WholeStaticLibsFromPrebuilts android.Paths
216
Colin Cross26c34ed2016-09-30 17:10:16 -0700217 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700218 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900219 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700220
Inseob Kimd110f872019-12-06 13:15:38 +0900221 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000222 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900223 IncludeDirs android.Paths
224 SystemIncludeDirs android.Paths
225 ReexportedDirs android.Paths
226 ReexportedSystemDirs android.Paths
227 ReexportedFlags []string
228 ReexportedGeneratedHeaders android.Paths
229 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400230 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700231
Colin Cross26c34ed2016-09-30 17:10:16 -0700232 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700233 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700234
Dan Willemsena0790e32018-10-12 00:24:23 -0700235 // Path to the dynamic linker binary
236 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700237
238 // For Darwin builds, the path to the second architecture's output that should
239 // be combined with this architectures's output into a FAT MachO file.
240 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400241
242 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
243 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800244
245 // LLNDK headers for the ABI checker to check LLNDK implementation library.
246 LlndkIncludeDirs android.Paths
247 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700248
249 directImplementationDeps android.Paths
250 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700251}
252
Colin Cross4af21ed2019-11-04 09:37:55 -0800253// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
254// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
255// command line so they can be overridden by the local module flags).
256type LocalOrGlobalFlags struct {
257 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700258 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800259 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700260 CFlags []string // Flags that apply to C and C++ source files
261 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
262 ConlyFlags []string // Flags that apply to C source files
263 CppFlags []string // Flags that apply to C++ source files
264 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700265 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800266}
267
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500268// Flags contains various types of command line flags (and settings) for use in building build
269// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800270type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500271 // Local flags (which individual modules are responsible for). These may override global flags.
272 Local LocalOrGlobalFlags
273 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700274 Global LocalOrGlobalFlags
275 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800276
277 aidlFlags []string // Flags that apply to aidl source files
278 rsFlags []string // Flags that apply to renderscript source files
279 libFlags []string // Flags to add libraries early to the link order
280 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
281 TidyFlags []string // Flags that apply to clang-tidy
282 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700283
Colin Crossc3199482017-03-30 15:03:04 -0700284 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800285 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700286 SystemIncludeFlags []string
287
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800288 Toolchain config.Toolchain
289 Tidy bool // True if ninja .tidy rules should be generated.
290 NeedTidyFiles bool // True if module link should depend on .tidy files
291 GcovCoverage bool // True if coverage files should be generated.
292 SAbiDump bool // True if header abi dumps should be generated.
293 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800294 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800295
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500296 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800297 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500298 // The target-device system path to the dynamic linker.
299 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800300
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700301 CFlagsDeps android.Paths // Files depended on by compiler flags
302 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800303
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500304 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700305 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800306
Colin Cross19878da2019-03-28 14:45:07 -0700307 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700308 protoC bool // Whether to use C instead of C++
309 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700310
311 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200312 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700313}
314
Colin Crossca860ac2016-01-04 14:34:37 -0800315// Properties used to compile all C or C++ modules
316type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700317 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800318 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700319
Yi Kong5786f5c2024-05-28 02:22:34 +0900320 // Aggresively trade performance for smaller binary size.
321 // This should only be used for on-device binaries that are rarely executed and not
322 // performance critical.
323 Optimize_for_size *bool `android:"arch_variant"`
324
Jiyong Parkb35a8192020-08-10 15:59:36 +0900325 // The API level that this module is built against. The APIs of this API level will be
326 // visible at build time, but use of any APIs newer than min_sdk_version will render the
327 // module unloadable on older devices. In the future it will be possible to weakly-link new
328 // APIs, making the behavior match Java: such modules will load on older devices, but
329 // calling new APIs on devices that do not support them will result in a crash.
330 //
331 // This property has the same behavior as sdk_version does for Java modules. For those
332 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
333 // does for Java code.
334 //
335 // In addition, setting this property causes two variants to be built, one for the platform
336 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800337 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700338
Jiyong Parkb35a8192020-08-10 15:59:36 +0900339 // Minimum OS API level supported by this C or C++ module. This property becomes the value
340 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
341 // this property is also used to ensure that the min_sdk_version of the containing module is
342 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
343 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
344 // min_sdk_version of the containing APEX. When the module
345 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900346 Min_sdk_version *string
347
Colin Crossc511bc52020-04-07 16:50:32 +0000348 // If true, always create an sdk variant and don't create a platform variant.
349 Sdk_variant_only *bool
350
Colin Cross4297f402024-11-20 15:20:09 -0800351 AndroidMkSharedLibs []string `blueprint:"mutated"`
352 AndroidMkStaticLibs []string `blueprint:"mutated"`
353 AndroidMkRlibs []string `blueprint:"mutated"`
354 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
355 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
356 AndroidMkHeaderLibs []string `blueprint:"mutated"`
357 HideFromMake bool `blueprint:"mutated"`
358 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700359
Yo Chiang219968c2020-09-22 18:45:04 +0800360 // Set by DepsMutator.
361 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
362
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900363 // The name of the image this module is built for
364 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200365
366 // The VNDK version this module is built against. If empty, the module is not
367 // build against the VNDK.
368 VndkVersion string `blueprint:"mutated"`
369
370 // Suffix for the name of Android.mk entries generated by this module
371 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800372
373 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
374 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900375 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900376
Yifan Hong39143a92020-10-26 12:43:12 -0700377 // Make this module available when building for ramdisk.
378 // On device without a dedicated recovery partition, the module is only
379 // available after switching root into
380 // /first_stage_ramdisk. To expose the module before switching root, install
381 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800382 Ramdisk_available *bool
383
Yifan Hong39143a92020-10-26 12:43:12 -0700384 // Make this module available when building for vendor ramdisk.
385 // On device without a dedicated recovery partition, the module is only
386 // available after switching root into
387 // /first_stage_ramdisk. To expose the module before switching root, install
388 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700389 Vendor_ramdisk_available *bool
390
Jiyong Parkf9332f12018-02-01 00:54:12 +0900391 // Make this module available when building for recovery
392 Recovery_available *bool
393
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200394 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000395 VendorVariantNeeded bool `blueprint:"mutated"`
396 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200397 CoreVariantNeeded bool `blueprint:"mutated"`
398 RamdiskVariantNeeded bool `blueprint:"mutated"`
399 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
400 RecoveryVariantNeeded bool `blueprint:"mutated"`
401
402 // A list of variations for the "image" mutator of the form
403 //<image name> '.' <version char>, for example, 'vendor.S'
404 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900405
406 // Allows this module to use non-APEX version of libraries. Useful
407 // for building binaries that are started before APEXes are activated.
408 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900409
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000410 // Allows this module to be included in CMake release snapshots to be built outside of Android
411 // build system and source tree.
412 Cmake_snapshot_supported *bool
413
Colin Cross1bc94122021-10-28 13:25:54 -0700414 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000415
416 // Set by factories of module types that can only be referenced from variants compiled against
417 // the SDK.
418 AlwaysSdk bool `blueprint:"mutated"`
419
420 // Variant is an SDK variant created by sdkMutator
421 IsSdkVariant bool `blueprint:"mutated"`
422 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
423 // variant to have a ".sdk" suffix.
424 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700425
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800426 Target struct {
427 Platform struct {
428 // List of modules required by the core variant.
429 Required []string `android:"arch_variant"`
430
431 // List of modules not required by the core variant.
432 Exclude_required []string `android:"arch_variant"`
433 } `android:"arch_variant"`
434
435 Recovery struct {
436 // List of modules required by the recovery variant.
437 Required []string `android:"arch_variant"`
438
439 // List of modules not required by the recovery variant.
440 Exclude_required []string `android:"arch_variant"`
441 } `android:"arch_variant"`
442 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700443}
444
445type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900446 // whether this module should be allowed to be directly depended by other
447 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900448 // If set to true, two variants will be built separately, one like
449 // normal, and the other limited to the set of libraries and headers
450 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700451 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900452 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700453 // so it shouldn't have any unversioned runtime dependencies, or
454 // make assumptions about the system that may not be true in the
455 // future.
456 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900457 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900458 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900459 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900460 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900461 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700462 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
463 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900464
Justin Yunebcf0c52021-01-08 18:00:19 +0900465 // This is the same as the "vendor_available" except that the install path
466 // of the vendor variant is /odm or /vendor/odm.
467 // By replacing "vendor_available: true" with "odm_available: true", the
468 // module will install its vendor variant to the /odm partition or /vendor/odm.
469 // As the modules with "odm_available: true" still create the vendor variants,
470 // they can link to the other vendor modules as the vendor_available modules do.
471 // Also, the vendor modules can link to odm_available modules.
472 //
473 // It may not be used for VNDK modules.
474 Odm_available *bool
475
Justin Yun63e9ec72020-10-29 16:49:43 +0900476 // whether this module should be allowed to be directly depended by other
477 // modules with `product_specific: true` or `product_available: true`.
478 // If set to true, an additional product variant will be built separately
479 // that is limited to the set of libraries and headers that are exposed to
480 // /product modules.
481 //
482 // The product variant may be used with a different (newer) /system,
483 // so it shouldn't have any unversioned runtime dependencies, or
484 // make assumptions about the system that may not be true in the
485 // future.
486 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900487 // If set to false, this module becomes inaccessible from /product modules.
488 //
489 // Different from the 'vendor_available' property, the modules with
490 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
491 // library without 'product_available' may not be depended on by any other
492 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900493 //
494 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
495 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
496 Product_available *bool
497
Jiyong Park5fb8c102018-04-09 12:03:06 +0900498 // whether this module is capable of being loaded with other instance
499 // (possibly an older version) of the same module in the same process.
500 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
501 // can be double loaded in a vendor process if the library is also a
502 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
503 // explicitly marked as `double_loadable: true` by the owner, or the dependency
504 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
505 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800506
507 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
508 IsLLNDK bool `blueprint:"mutated"`
509
Colin Cross5271fea2021-04-27 13:06:04 -0700510 // IsVendorPublicLibrary is set for the core and product variants of a library that has
511 // vendor_public_library stubs.
512 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800513}
514
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500515// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
516// to understanding details about the type of the current module.
517// For example, one might call these functions to determine whether the current module is a static
518// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800519type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800520 static() bool
521 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800522 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700523 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800524 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900525 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900526 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900527 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700528 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900529 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700530 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800531 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900532 minSdkVersion() string
533 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700534 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700535 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800536 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800537 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700538 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900539 inProduct() bool
540 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800541 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700542 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900543 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900544 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700545 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700546 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800547 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000548 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800549 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900550 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800551 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800552 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800553 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700554 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700555 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900556 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700557 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800558 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800559 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800560 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800561 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900562 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000563 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800564}
565
566type SharedFlags struct {
567 numSharedFlags int
568 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800569}
570
571type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700572 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800573 ModuleContextIntf
574}
575
576type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700577 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800578 ModuleContextIntf
579}
580
Colin Cross37047f12016-12-13 17:06:13 -0800581type DepsContext interface {
582 android.BottomUpMutatorContext
583 ModuleContextIntf
584}
585
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500586// feature represents additional (optional) steps to building cc-related modules, such as invocation
587// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800588type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800589 flags(ctx ModuleContext, flags Flags) Flags
590 props() []interface{}
591}
592
Joe Onorato37f900c2023-07-18 16:58:16 -0700593// Information returned from Generator about the source code it's generating
594type GeneratedSource struct {
595 IncludeDirs android.Paths
596 Sources android.Paths
597 Headers android.Paths
598 ReexportedDirs android.Paths
599}
600
601// generator allows injection of generated code
602type Generator interface {
603 GeneratorProps() []interface{}
604 GeneratorInit(ctx BaseModuleContext)
605 GeneratorDeps(ctx DepsContext, deps Deps) Deps
606 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
607 GeneratorSources(ctx ModuleContext) GeneratedSource
608 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
609}
610
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500611// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500612// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800613type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700614 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800615 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800616 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700617 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000618 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700619
Colin Cross76fada02016-07-27 10:31:13 -0700620 appendCflags([]string)
621 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700622 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800623}
624
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500625// linker is the interface for a linker decorator object. Individual module types can provide
626// their own implementation for this decorator, and thus specify custom logic regarding build
627// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800628type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700629 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800630 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700631 linkerFlags(ctx ModuleContext, flags Flags) Flags
632 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000633 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800634 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700635
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700636 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700637 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900638 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800639 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700640
641 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900642 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000643
644 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700645 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800646
647 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000648}
649
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500650// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000651type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500652 sharedLibs []string
653 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
654 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700655 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800656}
657
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500658// installer is the interface for an installer helper object. This helper is responsible for
659// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800660type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700661 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700662 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000663 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800664 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700665 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700666 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900667 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000668 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900669 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800670}
671
Inseob Kima1888ce2022-10-04 14:42:02 +0900672type overridable interface {
673 overriddenModules() []string
674}
675
Colin Cross6e511a92020-07-27 21:26:48 -0700676type libraryDependencyKind int
677
678const (
679 headerLibraryDependency = iota
680 sharedLibraryDependency
681 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400682 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700683)
684
685func (k libraryDependencyKind) String() string {
686 switch k {
687 case headerLibraryDependency:
688 return "headerLibraryDependency"
689 case sharedLibraryDependency:
690 return "sharedLibraryDependency"
691 case staticLibraryDependency:
692 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400693 case rlibLibraryDependency:
694 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700695 default:
696 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
697 }
698}
699
700type libraryDependencyOrder int
701
702const (
703 earlyLibraryDependency = -1
704 normalLibraryDependency = 0
705 lateLibraryDependency = 1
706)
707
708func (o libraryDependencyOrder) String() string {
709 switch o {
710 case earlyLibraryDependency:
711 return "earlyLibraryDependency"
712 case normalLibraryDependency:
713 return "normalLibraryDependency"
714 case lateLibraryDependency:
715 return "lateLibraryDependency"
716 default:
717 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
718 }
719}
720
721// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
722// tags that have a set of predefined tag objects that are reused for each dependency, a
723// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
724// That means that comparing a libraryDependencyTag for equality will only be equal if all
725// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
726// then check individual metadata fields instead.
727type libraryDependencyTag struct {
728 blueprint.BaseDependencyTag
729
730 // These are exported so that fmt.Printf("%#v") can call their String methods.
731 Kind libraryDependencyKind
732 Order libraryDependencyOrder
733
Colin Cross190a66a2024-12-05 14:06:17 -0800734 // fromStatic is true when the parent module is a static library or binary
735 fromStatic bool
736
Colin Cross6e511a92020-07-27 21:26:48 -0700737 wholeStatic bool
738
739 reexportFlags bool
740 explicitlyVersioned bool
741 dataLib bool
742 ndk bool
743
744 staticUnwinder bool
745
746 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900747
Cindy Zhou18417cb2020-12-10 07:12:38 -0800748 // Whether or not this dependency should skip the apex dependency check
749 skipApexAllowedDependenciesCheck bool
750
Jiyong Parke3867542020-12-03 17:28:25 +0900751 // Whether or not this dependency has to be followed for the apex variants
752 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900753 // Whether or not this dependency has to be followed for the non-apex variants
754 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000755
756 // If true, don't automatically export symbols from the static library into a shared library.
757 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700758}
759
760// header returns true if the libraryDependencyTag is tagging a header lib dependency.
761func (d libraryDependencyTag) header() bool {
762 return d.Kind == headerLibraryDependency
763}
764
765// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
766func (d libraryDependencyTag) shared() bool {
767 return d.Kind == sharedLibraryDependency
768}
769
770// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
771func (d libraryDependencyTag) static() bool {
772 return d.Kind == staticLibraryDependency
773}
774
Colin Cross65cb3142021-12-10 23:05:02 +0000775func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
776 if d.shared() {
777 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
778 }
779 return nil
780}
781
782var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
783
Colin Crosse9fe2942020-11-10 18:12:15 -0800784// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
785// binaries or other shared libraries are installed as dependencies.
786func (d libraryDependencyTag) InstallDepNeeded() bool {
787 return d.shared()
788}
789
790var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
791
Yu Liu67a28422024-03-05 00:36:31 +0000792func (d libraryDependencyTag) PropagateAconfigValidation() bool {
793 return d.static()
794}
795
796var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
797
Colin Crosse9fe2942020-11-10 18:12:15 -0800798// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700799// libraryDependencyTag. Each tag object is created globally and reused for multiple
800// dependencies (although since the object contains no references, assigning a tag to a
801// variable and modifying it will not modify the original). Users can compare the tag
802// returned by ctx.OtherModuleDependencyTag against the global original
803type dependencyTag struct {
804 blueprint.BaseDependencyTag
805 name string
806}
807
Colin Crosse9fe2942020-11-10 18:12:15 -0800808// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
809// libraryDependencyTag, but where the dependency needs to be installed when the parent is
810// installed.
811type installDependencyTag struct {
812 blueprint.BaseDependencyTag
813 android.InstallAlwaysNeededDependencyTag
814 name string
815}
816
Colin Crossc99deeb2016-04-11 15:06:20 -0700817var (
Colin Cross6e511a92020-07-27 21:26:48 -0700818 genSourceDepTag = dependencyTag{name: "gen source"}
819 genHeaderDepTag = dependencyTag{name: "gen header"}
820 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
821 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900822 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700823 reuseObjTag = dependencyTag{name: "reuse objects"}
824 staticVariantTag = dependencyTag{name: "static variant"}
825 vndkExtDepTag = dependencyTag{name: "vndk extends"}
826 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700827 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800828 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700829 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000830 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500831 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400832 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800833 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700834)
835
Roland Levillainf89cd092019-07-29 16:22:59 +0100836func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700837 ccLibDepTag, ok := depTag.(libraryDependencyTag)
838 return ok && ccLibDepTag.shared()
839}
840
841func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
842 ccLibDepTag, ok := depTag.(libraryDependencyTag)
843 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100844}
845
Zach Johnson3df4e632020-11-06 11:56:27 -0800846func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
847 ccLibDepTag, ok := depTag.(libraryDependencyTag)
848 return ok && ccLibDepTag.header()
849}
850
Roland Levillainf89cd092019-07-29 16:22:59 +0100851func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800852 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100853}
854
Colin Crossca860ac2016-01-04 14:34:37 -0800855// Module contains the properties and members used by all C/C++ module types, and implements
856// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500857// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
858// interface.
859//
860// To define a C/C++ related module, construct a new Module object and point its delegates to
861// type-specific structs. These delegates will be invoked to register module-specific build
862// statements which may be unique to the module type. For example, module.compiler.compile() should
863// be defined so as to register build statements which are responsible for compiling the module.
864//
865// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
866// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
867// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
868// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800869type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700870 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700871
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700872 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700873 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700874 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700875
Colin Crossca860ac2016-01-04 14:34:37 -0800876 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +0000877 hod android.HostOrDeviceSupported
878 multilib android.Multilib
879 testModule bool
880 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -0700881
Paul Duffina0843f62019-12-13 19:50:38 +0000882 // Allowable SdkMemberTypes of this module type.
883 sdkMemberTypes []android.SdkMemberType
884
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500885 // decorator delegates, initialize before calling Init
886 // these may contain module-specific implementations, and effectively allow for custom
887 // type-specific logic. These members may reference different objects or the same object.
888 // Functions of these decorators will be invoked to initialize and register type-specific
889 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800890 generators []Generator
891 compiler compiler
892 linker linker
893 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500894
Spandan Dase12d2522023-09-12 21:42:31 +0000895 features []feature
896 stl *stl
897 sanitize *sanitize
898 coverage *coverage
899 fuzzer *fuzzer
900 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +0000901 lto *lto
902 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000903 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800904
Colin Cross31076b32020-10-23 17:22:06 -0700905 library libraryInterface
906
Colin Cross635c3b02016-05-18 15:37:25 -0700907 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -0800908
Colin Crossb98c8b02016-07-29 13:44:28 -0700909 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -0700910
Yu Liue70976d2024-10-15 20:45:35 +0000911 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -0800912
913 // Flags used to compile this module
914 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -0700915
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800916 // Shared flags among build rules of this module
917 sharedFlags SharedFlags
918
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -0800919 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -0700920 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +0900921
922 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +0900923
924 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -0700925 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -0700926
927 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -0800928
Inseob Kim37e0bb02024-04-29 15:54:44 +0900929 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -0400930
931 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -0700932
933 hasAidl bool
934 hasLex bool
935 hasProto bool
936 hasRenderscript bool
937 hasSysprop bool
938 hasWinMsg bool
939 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +0000940
941 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -0700942}
943
Yu Liu76d94462024-10-31 23:32:36 +0000944func (c *Module) IncrementalSupported() bool {
945 return c.incremental
946}
947
948var _ blueprint.Incremental = (*Module)(nil)
949
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200950func (c *Module) AddJSONData(d *map[string]interface{}) {
951 c.AndroidModuleBase().AddJSONData(d)
952 (*d)["Cc"] = map[string]interface{}{
953 "SdkVersion": c.SdkVersion(),
954 "MinSdkVersion": c.MinSdkVersion(),
955 "VndkVersion": c.VndkVersion(),
956 "ProductSpecific": c.ProductSpecific(),
957 "SocSpecific": c.SocSpecific(),
958 "DeviceSpecific": c.DeviceSpecific(),
959 "InProduct": c.InProduct(),
960 "InVendor": c.InVendor(),
961 "InRamdisk": c.InRamdisk(),
962 "InVendorRamdisk": c.InVendorRamdisk(),
963 "InRecovery": c.InRecovery(),
964 "VendorAvailable": c.VendorAvailable(),
965 "ProductAvailable": c.ProductAvailable(),
966 "RamdiskAvailable": c.RamdiskAvailable(),
967 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
968 "RecoveryAvailable": c.RecoveryAvailable(),
969 "OdmAvailable": c.OdmAvailable(),
970 "InstallInData": c.InstallInData(),
971 "InstallInRamdisk": c.InstallInRamdisk(),
972 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
973 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
974 "InstallInRecovery": c.InstallInRecovery(),
975 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200976 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200977 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
978 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -0700979 "AidlSrcs": c.hasAidl,
980 "LexSrcs": c.hasLex,
981 "ProtoSrcs": c.hasProto,
982 "RenderscriptSrcs": c.hasRenderscript,
983 "SyspropSrcs": c.hasSysprop,
984 "WinMsgSrcs": c.hasWinMsg,
985 "YaccSrsc": c.hasYacc,
986 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +0900987 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +0200988 }
989}
990
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500991func (c *Module) SetPreventInstall() {
992 c.Properties.PreventInstall = true
993}
994
995func (c *Module) SetHideFromMake() {
996 c.Properties.HideFromMake = true
997}
998
Ivan Lozanod7586b62021-04-01 09:49:36 -0400999func (c *Module) HiddenFromMake() bool {
1000 return c.Properties.HideFromMake
1001}
1002
Cole Fauste8a87832024-09-11 11:35:46 -07001003func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001004 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001005 if c.ImageVariation().Variation == android.CoreVariation {
1006 required = append(required, c.Properties.Target.Platform.Required...)
1007 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1008 } else if c.InRecovery() {
1009 required = append(required, c.Properties.Target.Recovery.Required...)
1010 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1011 }
1012 return android.FirstUniqueStrings(required)
1013}
1014
Ivan Lozano52767be2019-10-18 14:49:46 -07001015func (c *Module) Toc() android.OptionalPath {
1016 if c.linker != nil {
1017 if library, ok := c.linker.(libraryInterface); ok {
1018 return library.toc()
1019 }
1020 }
1021 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1022}
1023
1024func (c *Module) ApiLevel() string {
1025 if c.linker != nil {
1026 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001027 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001028 }
1029 }
1030 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1031}
1032
1033func (c *Module) Static() bool {
1034 if c.linker != nil {
1035 if library, ok := c.linker.(libraryInterface); ok {
1036 return library.static()
1037 }
1038 }
1039 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1040}
1041
1042func (c *Module) Shared() bool {
1043 if c.linker != nil {
1044 if library, ok := c.linker.(libraryInterface); ok {
1045 return library.shared()
1046 }
1047 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001048
Ivan Lozano52767be2019-10-18 14:49:46 -07001049 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1050}
1051
1052func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001053 if c.stl != nil {
1054 return c.stl.Properties.SelectedStl
1055 }
1056 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001057}
1058
Ivan Lozano52767be2019-10-18 14:49:46 -07001059func (c *Module) StubDecorator() bool {
1060 if _, ok := c.linker.(*stubDecorator); ok {
1061 return true
1062 }
1063 return false
1064}
1065
Yi Kong5786f5c2024-05-28 02:22:34 +09001066func (c *Module) OptimizeForSize() bool {
1067 return Bool(c.Properties.Optimize_for_size)
1068}
1069
Ivan Lozano52767be2019-10-18 14:49:46 -07001070func (c *Module) SdkVersion() string {
1071 return String(c.Properties.Sdk_version)
1072}
1073
Artur Satayev480e25b2020-04-27 18:53:18 +01001074func (c *Module) MinSdkVersion() string {
1075 return String(c.Properties.Min_sdk_version)
1076}
1077
Jiyong Park5df7bd32021-08-25 16:18:46 +09001078func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001079 if linker, ok := c.linker.(*objectLinker); ok {
1080 return linker.isCrt()
1081 }
1082 return false
1083}
1084
Jiyong Park5df7bd32021-08-25 16:18:46 +09001085func (c *Module) SplitPerApiLevel() bool {
1086 return c.canUseSdk() && c.isCrt()
1087}
1088
Colin Crossc511bc52020-04-07 16:50:32 +00001089func (c *Module) AlwaysSdk() bool {
1090 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1091}
1092
Ivan Lozano183a3212019-10-18 14:18:45 -07001093func (c *Module) CcLibrary() bool {
1094 if c.linker != nil {
1095 if _, ok := c.linker.(*libraryDecorator); ok {
1096 return true
1097 }
Colin Crossd48fe732020-09-23 20:37:24 -07001098 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1099 return true
1100 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001101 }
1102 return false
1103}
1104
1105func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001106 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001107 return true
1108 }
1109 return false
1110}
1111
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001112func (c *Module) RlibStd() bool {
1113 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1114}
1115
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001116func (c *Module) RustLibraryInterface() bool {
1117 return false
1118}
1119
Ivan Lozano0a468a42024-05-13 21:03:34 -04001120func (c *Module) CrateName() string {
1121 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1122}
1123
1124func (c *Module) ExportedCrateLinkDirs() []string {
1125 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1126}
1127
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001128func (c *Module) IsFuzzModule() bool {
1129 if _, ok := c.compiler.(*fuzzBinary); ok {
1130 return true
1131 }
1132 return false
1133}
1134
1135func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1136 return c.FuzzModule
1137}
1138
1139func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1140 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1141 return fuzzer.fuzzPackagedModule
1142 }
1143 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1144}
1145
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001146func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001147 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1148 return fuzzer.sharedLibraries
1149 }
1150 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1151}
1152
Ivan Lozano2b262972019-11-21 12:30:50 -08001153func (c *Module) NonCcVariants() bool {
1154 return false
1155}
1156
Ivan Lozano183a3212019-10-18 14:18:45 -07001157func (c *Module) SetStatic() {
1158 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001159 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001160 library.setStatic()
1161 return
1162 }
1163 }
1164 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1165}
1166
1167func (c *Module) SetShared() {
1168 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001169 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001170 library.setShared()
1171 return
1172 }
1173 }
1174 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1175}
1176
1177func (c *Module) BuildStaticVariant() bool {
1178 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001179 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001180 return library.buildStatic()
1181 }
1182 }
1183 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1184}
1185
1186func (c *Module) BuildSharedVariant() bool {
1187 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001188 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001189 return library.buildShared()
1190 }
1191 }
1192 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1193}
1194
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001195func (c *Module) BuildRlibVariant() bool {
1196 // cc modules can never build rlib variants
1197 return false
1198}
1199
1200func (c *Module) IsRustFFI() bool {
1201 // cc modules are not Rust modules
1202 return false
1203}
1204
Ivan Lozano183a3212019-10-18 14:18:45 -07001205func (c *Module) Module() android.Module {
1206 return c
1207}
1208
Jiyong Parkc20eee32018-09-05 22:36:17 +09001209func (c *Module) OutputFile() android.OptionalPath {
1210 return c.outputFile
1211}
1212
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001213func (c *Module) CoverageFiles() android.Paths {
1214 if c.linker != nil {
1215 if library, ok := c.linker.(libraryInterface); ok {
1216 return library.objs().coverageFiles
1217 }
1218 }
1219 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1220}
1221
Ivan Lozano183a3212019-10-18 14:18:45 -07001222var _ LinkableInterface = (*Module)(nil)
1223
Jiyong Park719b4462019-01-13 00:39:51 +09001224func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001225 if c.linker != nil {
1226 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001227 }
1228 return nil
1229}
1230
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001231func (c *Module) CoverageOutputFile() android.OptionalPath {
1232 if c.linker != nil {
1233 return c.linker.coverageOutputFilePath()
1234 }
1235 return android.OptionalPath{}
1236}
1237
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001238func (c *Module) RelativeInstallPath() string {
1239 if c.installer != nil {
1240 return c.installer.relativeInstallPath()
1241 }
1242 return ""
1243}
1244
Jooyung Han344d5432019-08-23 11:17:39 +09001245func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001246 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001247}
1248
Colin Cross36242852017-06-23 15:06:31 -07001249func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001250 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001251 for _, generator := range c.generators {
1252 c.AddProperties(generator.GeneratorProps()...)
1253 }
Colin Crossca860ac2016-01-04 14:34:37 -08001254 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001255 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001256 }
1257 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001258 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001259 }
1260 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001261 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001262 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001263 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001264 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001265 }
Colin Cross16b23492016-01-06 14:41:07 -08001266 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001267 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001268 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001269 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001270 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001271 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001272 if c.fuzzer != nil {
1273 c.AddProperties(c.fuzzer.props()...)
1274 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001275 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001276 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001277 }
Stephen Craneba090d12017-05-09 15:44:35 -07001278 if c.lto != nil {
1279 c.AddProperties(c.lto.props()...)
1280 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001281 if c.afdo != nil {
1282 c.AddProperties(c.afdo.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 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001290 // Allow test-only on libraries that are not cc_test_library
1291 if c.library != nil && !c.testLibrary() {
1292 c.AddProperties(&c.sourceProperties)
1293 }
Colin Crossc472d572015-03-17 15:06:21 -07001294
Colin Cross36242852017-06-23 15:06:31 -07001295 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001296 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001297 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001298
Colin Cross36242852017-06-23 15:06:31 -07001299 return c
Colin Crossc472d572015-03-17 15:06:21 -07001300}
1301
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001302// UseVndk() returns true if this module is built against VNDK.
1303// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001304func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001305 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001306}
1307
Colin Crossc511bc52020-04-07 16:50:32 +00001308func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001309 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001310 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001311}
1312
1313func (c *Module) UseSdk() bool {
1314 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001315 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001316 }
1317 return false
1318}
1319
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001320func (c *Module) isCoverageVariant() bool {
1321 return c.coverage.Properties.IsCoverageVariant
1322}
1323
Colin Cross95f1ca02020-10-29 20:47:22 -07001324func (c *Module) IsNdk(config android.Config) bool {
1325 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001326}
1327
Colin Cross127bb8b2020-12-16 16:46:01 -08001328func (c *Module) IsLlndk() bool {
1329 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001330}
1331
Colin Cross1f3f1302021-04-26 18:37:44 -07001332func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001333 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001334 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001335}
1336
Colin Cross5271fea2021-04-27 13:06:04 -07001337func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1338 lib := moduleLibraryInterface(m)
1339 return lib != nil && (lib.hasVendorPublicLibrary())
1340}
1341
1342// IsVendorPublicLibrary returns true for vendor public libraries.
1343func (c *Module) IsVendorPublicLibrary() bool {
1344 return c.VendorProperties.IsVendorPublicLibrary
1345}
1346
Ivan Lozanof1868af2022-04-12 13:08:36 -04001347func (c *Module) IsVndkPrebuiltLibrary() bool {
1348 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1349 return true
1350 }
1351 return false
1352}
1353
1354func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1355 return c.Properties.SdkAndPlatformVariantVisibleToMake
1356}
1357
Ivan Lozanod7586b62021-04-01 09:49:36 -04001358func (c *Module) HasLlndkStubs() bool {
1359 lib := moduleLibraryInterface(c)
1360 return lib != nil && lib.hasLLNDKStubs()
1361}
1362
1363func (c *Module) StubsVersion() string {
1364 if lib, ok := c.linker.(versionedInterface); ok {
1365 return lib.stubsVersion()
1366 }
1367 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1368}
1369
Colin Cross127bb8b2020-12-16 16:46:01 -08001370// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1371// and does not set llndk.vendor_available: false.
1372func (c *Module) isImplementationForLLNDKPublic() bool {
1373 library, _ := c.library.(*libraryDecorator)
1374 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001375 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001376}
1377
Colin Cross3513fb12024-01-24 14:44:47 -08001378func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001379 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001380 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001381 }
1382 return false
1383}
1384
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001385func (c *Module) isOrderfileCompile() bool {
1386 if orderfile := c.orderfile; orderfile != nil {
1387 return orderfile.Properties.OrderfileLoad
1388 }
1389 return false
1390}
1391
Yi Kongc702ebd2022-08-19 16:02:45 +08001392func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001393 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001394}
1395
Yi Konged79fa32023-06-04 17:15:42 +09001396func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001397 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001398}
1399
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001400func (c *Module) isNDKStubLibrary() bool {
1401 if _, ok := c.compiler.(*stubDecorator); ok {
1402 return true
1403 }
1404 return false
1405}
1406
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001407func (c *Module) SubName() string {
1408 return c.Properties.SubName
1409}
1410
Jiyong Park25fc6a92018-11-18 18:02:45 +09001411func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001412 if lib := c.library; lib != nil {
1413 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001414 }
1415 return false
1416}
1417
1418func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001419 if lib := c.library; lib != nil {
1420 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001421 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001422 return false
1423}
1424
Alan Stokes73feba32022-11-14 12:21:24 +00001425func (c *Module) IsStubsImplementationRequired() bool {
1426 if lib := c.library; lib != nil {
1427 return lib.isStubsImplementationRequired()
1428 }
1429 return false
1430}
1431
Colin Cross0477b422020-10-13 18:43:54 -07001432// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1433// the implementation. If it is an implementation library it returns its own name.
1434func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1435 name := ctx.OtherModuleName(c)
1436 if versioned, ok := c.linker.(versionedInterface); ok {
1437 name = versioned.implementationModuleName(name)
1438 }
1439 return name
1440}
1441
Martin Stjernholm2856c662020-12-02 15:03:42 +00001442// Similar to ImplementationModuleName, but uses the Make variant of the module
1443// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1444// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1445// under the premise that the prebuilt module overrides its source counterpart
1446// if it is exposed to Make).
1447func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1448 name := c.BaseModuleName()
1449 if versioned, ok := c.linker.(versionedInterface); ok {
1450 name = versioned.implementationModuleName(name)
1451 }
1452 return name
1453}
1454
Jiyong Park7d55b612021-06-11 17:22:09 +09001455func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001456 return Bool(c.Properties.Bootstrap)
1457}
1458
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001459func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001460 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1461 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1462 return false
1463 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001464 return c.linker != nil && c.linker.nativeCoverage()
1465}
1466
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001467func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001468 if p, ok := c.linker.(SnapshotInterface); ok {
1469 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001470 }
1471 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001472}
1473
Jiyong Parkf1194352019-02-25 11:05:47 +09001474func isBionic(name string) bool {
1475 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001476 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001477 return true
1478 }
1479 return false
1480}
1481
Martin Stjernholm279de572019-09-10 23:18:20 +01001482func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001483 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001484 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001485 }
1486 return isBionic(name)
1487}
1488
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001489func (c *Module) isCfiAssemblySupportEnabled() bool {
1490 return c.sanitize != nil &&
1491 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1492}
1493
Inseob Kim800d1142021-06-14 12:03:51 +09001494func (c *Module) InstallInRoot() bool {
1495 return c.installer != nil && c.installer.installInRoot()
1496}
1497
Colin Crossca860ac2016-01-04 14:34:37 -08001498type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001499 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001500 moduleContextImpl
1501}
1502
Colin Cross37047f12016-12-13 17:06:13 -08001503type depsContext struct {
1504 android.BottomUpMutatorContext
1505 moduleContextImpl
1506}
1507
Colin Crossca860ac2016-01-04 14:34:37 -08001508type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001509 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001510 moduleContextImpl
1511}
1512
1513type moduleContextImpl struct {
1514 mod *Module
1515 ctx BaseModuleContext
1516}
1517
Colin Crossb98c8b02016-07-29 13:44:28 -07001518func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001519 return ctx.mod.toolchain(ctx.ctx)
1520}
1521
1522func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001523 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001524}
1525
1526func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001527 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001528}
1529
Colin Cross6a730042024-12-05 13:53:43 -08001530func (ctx *moduleContextImpl) staticLibrary() bool {
1531 return ctx.mod.staticLibrary()
1532}
1533
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001534func (ctx *moduleContextImpl) testBinary() bool {
1535 return ctx.mod.testBinary()
1536}
1537
Yi Kong56fc1b62022-09-06 16:24:00 +08001538func (ctx *moduleContextImpl) testLibrary() bool {
1539 return ctx.mod.testLibrary()
1540}
1541
Jiyong Park1d1119f2019-07-29 21:27:18 +09001542func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001543 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001544}
1545
Inseob Kim7f283f42020-06-01 21:53:49 +09001546func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001547 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001548}
1549
Inseob Kim1042d292020-06-01 23:23:05 +09001550func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001551 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001552}
1553
Yi Kong5786f5c2024-05-28 02:22:34 +09001554func (ctx *moduleContextImpl) optimizeForSize() bool {
1555 return ctx.mod.OptimizeForSize()
1556}
1557
Jooyung Hanccce2f22020-03-07 03:45:53 +09001558func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001559 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001560}
1561
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001562func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001563 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001564}
1565
1566func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001567 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001568 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001569 }
1570 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001571}
1572
Jiyong Parkb35a8192020-08-10 15:59:36 +09001573func (ctx *moduleContextImpl) minSdkVersion() string {
1574 ver := ctx.mod.MinSdkVersion()
1575 if ver == "apex_inherit" && !ctx.isForPlatform() {
1576 ver = ctx.apexSdkVersion().String()
1577 }
1578 if ver == "apex_inherit" || ver == "" {
1579 ver = ctx.sdkVersion()
1580 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001581
1582 if ctx.ctx.Device() {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001583 // When building for vendor/product, use the latest _stable_ API as "current".
1584 // This is passed to clang/aidl compilers so that compiled/generated code works
1585 // with the system.
1586 if (ctx.inVendor() || ctx.inProduct()) && (ver == "" || ver == "current") {
1587 ver = ctx.ctx.Config().PlatformSdkVersion().String()
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001588 }
1589 }
1590
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001591 // For crt objects, the meaning of min_sdk_version is very different from other types of
1592 // module. For them, min_sdk_version defines the oldest version that the build system will
1593 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1594 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1595 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001596 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1597 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1598 // support such an old version. The version is set to the later version in case when the
1599 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1600 // it's for an APEX.
1601 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1602 if ctx.isForPlatform() {
1603 ver = strconv.Itoa(android.FutureApiLevelInt)
1604 } else { // for apex
1605 ver = ctx.apexSdkVersion().String()
1606 if ver == "" { // in case when min_sdk_version was not set by the APEX
1607 ver = ctx.sdkVersion()
1608 }
1609 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001610 }
1611
Jiyong Parkb35a8192020-08-10 15:59:36 +09001612 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1613 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1614 minSdkVersionInt, err2 := strconv.Atoi(ver)
1615 if err == nil && err2 == nil {
1616 if sdkVersionInt < minSdkVersionInt {
1617 return strconv.Itoa(sdkVersionInt)
1618 }
1619 }
1620 return ver
1621}
1622
1623func (ctx *moduleContextImpl) isSdkVariant() bool {
1624 return ctx.mod.IsSdkVariant()
1625}
1626
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001627func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001628 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001629}
Justin Yun8effde42017-06-23 19:24:43 +09001630
Kiyoung Kimaa394802024-01-08 12:55:45 +09001631func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1632 return ctx.mod.InVendorOrProduct()
1633}
1634
Colin Cross95f1ca02020-10-29 20:47:22 -07001635func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1636 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001637}
1638
Colin Cross127bb8b2020-12-16 16:46:01 -08001639func (ctx *moduleContextImpl) IsLlndk() bool {
1640 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001641}
1642
Colin Cross127bb8b2020-12-16 16:46:01 -08001643func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1644 return ctx.mod.isImplementationForLLNDKPublic()
1645}
1646
Colin Cross3513fb12024-01-24 14:44:47 -08001647func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1648 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001649}
1650
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001651func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1652 return ctx.mod.isOrderfileCompile()
1653}
1654
Yi Kongc702ebd2022-08-19 16:02:45 +08001655func (ctx *moduleContextImpl) isCfi() bool {
1656 return ctx.mod.isCfi()
1657}
1658
Yi Konged79fa32023-06-04 17:15:42 +09001659func (ctx *moduleContextImpl) isFuzzer() bool {
1660 return ctx.mod.isFuzzer()
1661}
1662
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001663func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1664 return ctx.mod.isNDKStubLibrary()
1665}
1666
Colin Cross5271fea2021-04-27 13:06:04 -07001667func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1668 return ctx.mod.IsVendorPublicLibrary()
1669}
1670
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001671func (ctx *moduleContextImpl) selectedStl() string {
1672 if stl := ctx.mod.stl; stl != nil {
1673 return stl.Properties.SelectedStl
1674 }
1675 return ""
1676}
1677
Ivan Lozanobd721262018-11-27 14:33:03 -08001678func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1679 return ctx.mod.linker.useClangLld(actx)
1680}
1681
Colin Crossce75d2c2016-10-06 16:12:58 -07001682func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001683 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001684}
1685
Logan Chiene274fc92019-12-03 11:18:32 -08001686func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Crossff694a82023-12-13 15:54:49 -08001687 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1688 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001689}
1690
Colin Crosse07f2312020-08-13 11:24:56 -07001691func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001692 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1693 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001694}
1695
Dan Albertc8060532020-07-22 22:32:17 -07001696func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001697 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001698}
1699
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001700func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001701 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001702}
1703
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001704func (ctx *moduleContextImpl) nativeCoverage() bool {
1705 return ctx.mod.nativeCoverage()
1706}
1707
Colin Cross95b07f22020-12-16 11:06:50 -08001708func (ctx *moduleContextImpl) isPreventInstall() bool {
1709 return ctx.mod.Properties.PreventInstall
1710}
1711
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001712func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1713 shared := &ctx.mod.sharedFlags
1714 if shared.flagsMap == nil {
1715 shared.numSharedFlags = 0
1716 shared.flagsMap = make(map[string]string)
1717 }
1718 return shared
1719}
1720
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001721func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1722 return ctx.mod.isCfiAssemblySupportEnabled()
1723}
1724
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001725func (ctx *moduleContextImpl) notInPlatform() bool {
1726 return ctx.mod.NotInPlatform()
1727}
1728
Yu Liu76d94462024-10-31 23:32:36 +00001729func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1730 if ctx.mod.makeVarsInfo == nil {
1731 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1732 }
1733 return ctx.mod.makeVarsInfo
1734}
1735
Colin Cross635c3b02016-05-18 15:37:25 -07001736func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001737 return &Module{
1738 hod: hod,
1739 multilib: multilib,
1740 }
1741}
1742
Colin Cross635c3b02016-05-18 15:37:25 -07001743func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001744 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001745 module.features = []feature{
1746 &tidyFeature{},
1747 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001748 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001749 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001750 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001751 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001752 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001753 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001754 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001755 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001756 return module
1757}
1758
Colin Crossce75d2c2016-10-06 16:12:58 -07001759func (c *Module) Prebuilt() *android.Prebuilt {
1760 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1761 return p.prebuilt()
1762 }
1763 return nil
1764}
1765
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001766func (c *Module) IsPrebuilt() bool {
1767 return c.Prebuilt() != nil
1768}
1769
Colin Crossce75d2c2016-10-06 16:12:58 -07001770func (c *Module) Name() string {
1771 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001772 if p, ok := c.linker.(interface {
1773 Name(string) string
1774 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001775 name = p.Name(name)
1776 }
1777 return name
1778}
1779
Alex Light3d673592019-01-18 14:37:31 -08001780func (c *Module) Symlinks() []string {
1781 if p, ok := c.installer.(interface {
1782 symlinkList() []string
1783 }); ok {
1784 return p.symlinkList()
1785 }
1786 return nil
1787}
1788
Chris Parsons216e10a2020-07-09 17:12:52 -04001789func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001790 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001791 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001792 }); ok {
1793 return p.dataPaths()
1794 }
1795 return nil
1796}
1797
Ivan Lozanof1868af2022-04-12 13:08:36 -04001798func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001799 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1800 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001801 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001802 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001803 if c.ProductSpecific() {
1804 // If the module is product specific with 'product_specific: true',
1805 // do not add a name suffix because it is a base module.
1806 return ""
1807 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001808 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001809 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001810 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001811 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001812 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001813 // add version suffix only if the module is using different vndk version than the
1814 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001815 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001816 }
1817 return nameSuffix
1818}
1819
Ivan Lozanof1868af2022-04-12 13:08:36 -04001820func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1821 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001822
1823 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001824 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001825 }
1826
Colin Cross127bb8b2020-12-16 16:46:01 -08001827 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001828 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001829 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1830 // added for product variant only when we have vendor and product variants with core
1831 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001832 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001833 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001834 subName += vendorPublicLibrarySuffix
1835 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001836 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1837 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001838 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001839 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001840 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001841 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001842 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001843 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001844 subName += RecoverySuffix
1845 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1846 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001847 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001848 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001849 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001850 } else if c.IsStubs() && c.IsSdkVariant() {
1851 // Public API surface (NDK)
1852 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1853 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001854 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001855
1856 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001857}
1858
Sam Delmerico75dbca22023-04-20 13:13:25 +00001859func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1860 ctx := &moduleContext{
1861 ModuleContext: actx,
1862 moduleContextImpl: moduleContextImpl{
1863 mod: c,
1864 },
1865 }
1866 ctx.ctx = ctx
1867 return ctx
1868}
1869
Spandan Das20fce2d2023-04-12 17:21:39 +00001870// TODO (b/277651159): Remove this allowlist
1871var (
1872 skipStubLibraryMultipleApexViolation = map[string]bool{
1873 "libclang_rt.asan": true,
1874 "libclang_rt.hwasan": true,
1875 // runtime apex
1876 "libc": true,
1877 "libc_hwasan": true,
1878 "libdl_android": true,
1879 "libm": true,
1880 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00001881 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00001882 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01001883 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00001884 "libandroidio": true,
1885 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01001886 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00001887 "libnativebridge": true,
1888 "libnativehelper": true,
1889 "libnativeloader": true,
1890 "libsigchain": true,
1891 }
1892)
1893
1894// Returns true if a stub library could be installed in multiple apexes
1895func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
1896 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08001897 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00001898 return false
1899 }
1900 // If this is not a stub library, no check necessary
1901 if !c.HasStubsVariants() {
1902 return false
1903 }
1904 // Skip the allowlist
1905 // Use BaseModuleName so that this matches prebuilts.
1906 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
1907 return false
1908 }
1909
1910 _, aaWithoutTestApexes, _ := android.ListSetDifference(c.ApexAvailable(), c.TestApexes())
1911 // Stub libraries should not have more than one apex_available
1912 if len(aaWithoutTestApexes) > 1 {
1913 return true
1914 }
1915 // Stub libraries should not use the wildcard
1916 if aaWithoutTestApexes[0] == android.AvailableToAnyApex {
1917 return true
1918 }
1919 // Default: no violation
1920 return false
1921}
1922
Chris Parsons8d6e4332021-02-22 16:13:50 -05001923func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07001924 ctx := moduleContextFromAndroidModuleContext(actx, c)
1925
Inseob Kim37e0bb02024-04-29 15:54:44 +09001926 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
1927 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
1928 Logtags: c.logtagsPaths,
1929 })
1930
Ronald Braunstein6a08d492024-04-15 12:55:30 -07001931 // If Test_only is set on a module in bp file, respect the setting, otherwise
1932 // see if is a known test module type.
1933 testOnly := c.testModule || c.testLibrary()
1934 if c.sourceProperties.Test_only != nil {
1935 testOnly = Bool(c.sourceProperties.Test_only)
1936 }
1937 // Keep before any early returns.
1938 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
1939 TestOnly: testOnly,
1940 TopLevelTarget: c.testModule,
1941 })
1942
Ivan Lozanof1868af2022-04-12 13:08:36 -04001943 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08001944 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05001945 if !apexInfo.IsForPlatform() {
1946 c.hideApexVariantFromMake = true
1947 }
1948
Chris Parsonseefc9e62021-04-02 17:36:47 -04001949 c.makeLinkType = GetMakeLinkType(actx, c)
1950
Colin Crossf18e1102017-11-16 14:33:08 -08001951 deps := c.depsToPaths(ctx)
1952 if ctx.Failed() {
1953 return
1954 }
1955
Joe Onorato37f900c2023-07-18 16:58:16 -07001956 for _, generator := range c.generators {
1957 gen := generator.GeneratorSources(ctx)
1958 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
1959 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
1960 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
1961 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
1962 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
1963 if len(deps.Objs.objFiles) == 0 {
1964 // If we are reusuing object files (which happens when we're a shared library and we're
1965 // reusing our static variant's object files), then skip adding the actual source files,
1966 // because we already have the object for it.
1967 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
1968 }
1969 }
1970
1971 if ctx.Failed() {
1972 return
1973 }
1974
Spandan Das20fce2d2023-04-12 17:21:39 +00001975 if c.stubLibraryMultipleApexViolation(actx) {
1976 actx.PropertyErrorf("apex_available",
1977 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
1978 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001979 if c.Properties.Clang != nil && *c.Properties.Clang == false {
1980 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00001981 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
1982 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07001983 }
1984
Colin Crossca860ac2016-01-04 14:34:37 -08001985 flags := Flags{
1986 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08001987 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08001988 }
Joe Onorato37f900c2023-07-18 16:58:16 -07001989 for _, generator := range c.generators {
1990 flags = generator.GeneratorFlags(ctx, flags, deps)
1991 }
Colin Crossca860ac2016-01-04 14:34:37 -08001992 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08001993 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08001994 }
1995 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07001996 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08001997 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001998 if c.stl != nil {
1999 flags = c.stl.flags(ctx, flags)
2000 }
Colin Cross16b23492016-01-06 14:41:07 -08002001 if c.sanitize != nil {
2002 flags = c.sanitize.flags(ctx, flags)
2003 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002004 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002005 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002006 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002007 if c.fuzzer != nil {
2008 flags = c.fuzzer.flags(ctx, flags)
2009 }
Stephen Craneba090d12017-05-09 15:44:35 -07002010 if c.lto != nil {
2011 flags = c.lto.flags(ctx, flags)
2012 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002013 if c.afdo != nil {
2014 flags = c.afdo.flags(ctx, flags)
2015 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002016 if c.orderfile != nil {
2017 flags = c.orderfile.flags(ctx, flags)
2018 }
Colin Crossca860ac2016-01-04 14:34:37 -08002019 for _, feature := range c.features {
2020 flags = feature.flags(ctx, flags)
2021 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002022 if ctx.Failed() {
2023 return
2024 }
2025
Colin Cross4af21ed2019-11-04 09:37:55 -08002026 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2027 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2028 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002029
Colin Cross4af21ed2019-11-04 09:37:55 -08002030 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002031
2032 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002033 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002034 }
2035 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002036 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002037 }
2038
Colin Cross3e5e7782022-06-17 22:17:05 +00002039 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2040
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002041 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002042 // We need access to all the flags seen by a source file.
2043 if c.sabi != nil {
2044 flags = c.sabi.flags(ctx, flags)
2045 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002046
Colin Cross4af21ed2019-11-04 09:37:55 -08002047 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002048
Joe Onorato37f900c2023-07-18 16:58:16 -07002049 for _, generator := range c.generators {
2050 generator.GeneratorBuildActions(ctx, flags, deps)
2051 }
2052
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002053 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002054 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002055 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002056 if ctx.Failed() {
2057 return
2058 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002059 }
2060
Colin Crossca860ac2016-01-04 14:34:37 -08002061 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002062 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002063 if ctx.Failed() {
2064 return
2065 }
Colin Cross635c3b02016-05-18 15:37:25 -07002066 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002067
Chris Parsons94a0bba2021-06-04 15:03:47 -04002068 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002069
2070 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2071 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2072 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002073 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002074
Colin Cross40213022023-12-13 15:19:49 -08002075 android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: deps.GeneratedSources.Strings()})
Colin Cross5049f022015-03-18 13:28:46 -07002076
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002077 if Bool(c.Properties.Cmake_snapshot_supported) {
2078 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2079 }
2080
Chris Parsons94a0bba2021-06-04 15:03:47 -04002081 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002082
2083 if c.linker != nil {
2084 moduleInfoJSON := ctx.ModuleInfoJSON()
2085 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2086 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2087 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2088 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2089 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2090
2091 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2092 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2093 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2094 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2095
2096 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2097 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2098 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2099 moduleInfoJSON.SubName += ".cfi"
2100 }
2101 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2102 moduleInfoJSON.SubName += ".hwasan"
2103 }
2104 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2105 moduleInfoJSON.SubName += ".scs"
2106 }
2107 }
2108 moduleInfoJSON.SubName += c.Properties.SubName
2109
2110 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2111 moduleInfoJSON.Uninstallable = true
2112 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002113 }
Wei Lia1aa2972024-06-21 13:08:51 -07002114
2115 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002116
Cole Faust96a692b2024-08-08 14:47:51 -07002117 if b, ok := c.compiler.(*baseCompiler); ok {
2118 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2119 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2120 c.hasProto = b.hasSrcExt(ctx, ".proto")
2121 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2122 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2123 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2124 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2125 }
2126
Yu Liuec7043d2024-11-05 18:22:20 +00002127 ccObjectInfo := CcObjectInfo{
2128 kytheFiles: objs.kytheFiles,
2129 }
2130 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
2131 ccObjectInfo.objFiles = objs.objFiles
2132 ccObjectInfo.tidyFiles = objs.tidyFiles
2133 }
2134 if len(ccObjectInfo.kytheFiles)+len(ccObjectInfo.objFiles)+len(ccObjectInfo.tidyFiles) > 0 {
2135 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2136 }
2137
Yu Liu986d98c2024-11-12 00:28:11 +00002138 android.SetProvider(ctx, LinkableInfoKey, LinkableInfo{
2139 StaticExecutable: c.StaticExecutable(),
2140 })
2141
Yu Liub1bfa9d2024-12-05 18:57:51 +00002142 android.SetProvider(ctx, CcInfoProvider, CcInfo{
2143 HasStubsVariants: c.HasStubsVariants(),
2144 })
2145
mrziwangabdb2932024-06-18 12:43:41 -07002146 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002147
2148 if c.makeVarsInfo != nil {
2149 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2150 }
mrziwangabdb2932024-06-18 12:43:41 -07002151}
2152
Yu Liuec7043d2024-11-05 18:22:20 +00002153func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2154 if len(files) > 0 {
2155 ctx.SetOutputFiles(files, tag)
2156 }
2157}
2158
mrziwangabdb2932024-06-18 12:43:41 -07002159func (c *Module) setOutputFiles(ctx ModuleContext) {
2160 if c.outputFile.Valid() {
2161 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2162 } else {
2163 ctx.SetOutputFiles(android.Paths{}, "")
2164 }
2165 if c.linker != nil {
2166 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2167 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2168 }
Wei Lia1aa2972024-06-21 13:08:51 -07002169}
2170
2171func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2172 // Dump metadata that can not be done in android/compliance-metadata.go
2173 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
2174 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2175 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2176
2177 // Static deps
2178 staticDeps := ctx.GetDirectDepsWithTag(StaticDepTag(false))
2179 staticDepNames := make([]string, 0, len(staticDeps))
2180 for _, dep := range staticDeps {
2181 staticDepNames = append(staticDepNames, dep.Name())
2182 }
2183
2184 staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2185 for _, dep := range deps.StaticLibs {
2186 staticDepPaths = append(staticDepPaths, dep.String())
2187 }
2188 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2189 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2190
2191 // Whole static deps
2192 wholeStaticDeps := ctx.GetDirectDepsWithTag(StaticDepTag(true))
2193 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2194 for _, dep := range wholeStaticDeps {
2195 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2196 }
2197
2198 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2199 for _, dep := range deps.WholeStaticLibs {
2200 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2201 }
2202 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2203 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002204}
2205
2206func (c *Module) maybeUnhideFromMake() {
2207 // If a lib is directly included in any of the APEXes or is not available to the
2208 // platform (which is often the case when the stub is provided as a prebuilt),
2209 // unhide the stubs variant having the latest version gets visible to make. In
2210 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2211 // force anything in the make world to link against the stubs library. (unless it
2212 // is explicitly referenced via .bootstrap suffix or the module is marked with
2213 // 'bootstrap: true').
2214 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002215 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002216 c.IsStubs() && !c.InVendorRamdisk() {
2217 c.Properties.HideFromMake = false // unhide
2218 // Note: this is still non-installable
2219 }
2220}
2221
Colin Cross8ff10582023-12-07 13:10:56 -08002222// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2223// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002224func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002225 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002226 // If the module has been specifically configure to not be installed then
2227 // hide from make as otherwise it will break when running inside make
2228 // as the output path to install will not be specified. Not all uninstallable
2229 // modules can be hidden from make as some are needed for resolving make side
2230 // dependencies.
2231 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002232 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002233 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002234 c.SkipInstall()
2235 }
2236
2237 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2238 // to allow using the outputs in a genrule.
2239 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002240 c.installer.install(ctx, c.outputFile.Path())
2241 if ctx.Failed() {
2242 return
Colin Crossca860ac2016-01-04 14:34:37 -08002243 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002244 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002245}
2246
Colin Cross0ea8ba82019-06-06 14:33:29 -07002247func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002248 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002249 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002250 }
Colin Crossca860ac2016-01-04 14:34:37 -08002251 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002252}
2253
Colin Crossca860ac2016-01-04 14:34:37 -08002254func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002255 for _, generator := range c.generators {
2256 generator.GeneratorInit(ctx)
2257 }
Colin Crossca860ac2016-01-04 14:34:37 -08002258 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002259 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002260 }
Colin Crossca860ac2016-01-04 14:34:37 -08002261 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002262 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002263 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002264 if c.stl != nil {
2265 c.stl.begin(ctx)
2266 }
Colin Cross16b23492016-01-06 14:41:07 -08002267 if c.sanitize != nil {
2268 c.sanitize.begin(ctx)
2269 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002270 if c.coverage != nil {
2271 c.coverage.begin(ctx)
2272 }
Yi Kong9723e332023-12-04 14:52:53 +09002273 if c.afdo != nil {
2274 c.afdo.begin(ctx)
2275 }
Stephen Craneba090d12017-05-09 15:44:35 -07002276 if c.lto != nil {
2277 c.lto.begin(ctx)
2278 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002279 if c.orderfile != nil {
2280 c.orderfile.begin(ctx)
2281 }
Dan Albert92fe7402020-07-15 13:33:30 -07002282 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002283 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002284 if err != nil {
2285 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002286 c.Properties.Sdk_version = nil
2287 } else {
2288 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002289 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002290 }
Colin Crossca860ac2016-01-04 14:34:37 -08002291}
2292
Colin Cross37047f12016-12-13 17:06:13 -08002293func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002294 deps := Deps{}
2295
Joe Onorato37f900c2023-07-18 16:58:16 -07002296 for _, generator := range c.generators {
2297 deps = generator.GeneratorDeps(ctx, deps)
2298 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002299 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002300 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002301 }
2302 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002303 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002304 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002305 if c.stl != nil {
2306 deps = c.stl.deps(ctx, deps)
2307 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002308 if c.coverage != nil {
2309 deps = c.coverage.deps(ctx, deps)
2310 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002311
Colin Crossb6715442017-10-24 11:13:31 -07002312 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2313 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2314 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2315 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2316 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2317 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002318 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002319 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002320
Colin Cross516c5452024-10-28 13:45:21 -07002321 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2322 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2323 }
2324
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002325 for _, lib := range deps.ReexportSharedLibHeaders {
2326 if !inList(lib, deps.SharedLibs) {
2327 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2328 }
2329 }
2330
2331 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002332 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2333 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 -07002334 }
2335 }
2336
Colin Cross5950f382016-12-13 12:50:57 -08002337 for _, lib := range deps.ReexportHeaderLibHeaders {
2338 if !inList(lib, deps.HeaderLibs) {
2339 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2340 }
2341 }
2342
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002343 for _, gen := range deps.ReexportGeneratedHeaders {
2344 if !inList(gen, deps.GeneratedHeaders) {
2345 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2346 }
2347 }
2348
Colin Crossc99deeb2016-04-11 15:06:20 -07002349 return deps
2350}
2351
Colin Cross516c5452024-10-28 13:45:21 -07002352func checkConflictingExplicitVersions(libs []string) error {
2353 withoutVersion := func(s string) string {
2354 name, _ := StubsLibNameAndVersion(s)
2355 return name
2356 }
2357 var errs []error
2358 for i, lib := range libs {
2359 libName := withoutVersion(lib)
2360 libsToCompare := libs[i+1:]
2361 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2362 return withoutVersion(s) == libName
2363 })
2364 if j >= 0 {
2365 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2366 lib, libsToCompare[j]))
2367 }
2368 }
2369 return errors.Join(errs...)
2370}
2371
Dan Albert7e9d2952016-08-04 13:02:36 -07002372func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002373 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002374 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002375 moduleContextImpl: moduleContextImpl{
2376 mod: c,
2377 },
2378 }
2379 ctx.ctx = ctx
2380
Colin Crossca860ac2016-01-04 14:34:37 -08002381 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002382}
2383
Jiyong Park7ed9de32018-10-15 22:25:07 +09002384// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002385func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002386 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2387 version := name[sharp+1:]
2388 libname := name[:sharp]
2389 return libname, version
2390 }
2391 return name, ""
2392}
2393
Dan Albert92fe7402020-07-15 13:33:30 -07002394func GetCrtVariations(ctx android.BottomUpMutatorContext,
2395 m LinkableInterface) []blueprint.Variation {
2396 if ctx.Os() != android.Android {
2397 return nil
2398 }
2399 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002400 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2401 minSdkVersion := m.MinSdkVersion()
2402 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2403 minSdkVersion = m.SdkVersion()
2404 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002405 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2406 if err != nil {
2407 ctx.PropertyErrorf("min_sdk_version", err.Error())
2408 }
Colin Cross363ec762023-01-13 13:45:14 -08002409
2410 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002411 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002412 if apiLevel.LessThan(minApiForArch) {
2413 apiLevel = minApiForArch
2414 }
2415
Dan Albert92fe7402020-07-15 13:33:30 -07002416 return []blueprint.Variation{
2417 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002418 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002419 }
2420 }
2421 return []blueprint.Variation{
2422 {Mutator: "sdk", Variation: ""},
2423 }
2424}
2425
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002426func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2427 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002428
2429 variations = append([]blueprint.Variation(nil), variations...)
2430
Liz Kammer23942242022-04-08 15:41:00 -04002431 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002432 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002433 if version == "impl" {
2434 version = ""
2435 }
Colin Crosse7257d22020-09-24 09:56:18 -07002436 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002437 if tag, ok := depTag.(libraryDependencyTag); ok {
2438 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002439 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2440 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2441 // the modified copy to depTag.
2442 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002443 } else {
2444 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2445 }
Colin Crosse7257d22020-09-24 09:56:18 -07002446 }
Colin Crosse7257d22020-09-24 09:56:18 -07002447
Colin Cross0de8a1e2020-09-18 14:15:30 -07002448 if far {
2449 ctx.AddFarVariationDependencies(variations, depTag, name)
2450 } else {
2451 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002452 }
2453}
2454
Kiyoung Kim487689e2022-07-26 09:48:22 +09002455func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2456 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002457 return snapshot
2458 }
2459
2460 return lib
2461}
2462
Kiyoung Kim37693d02024-04-04 09:56:15 +09002463// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002464// of names:
2465//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002466// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002467//
2468// For each of these, it adds the name of the ndk_library module to the list of
2469// variant libs.
2470//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002471// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002472//
2473// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002474//
2475// The caller can then know to add the variantLibs dependencies differently from the
2476// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002477func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002478 variantLibs = []string{}
2479
2480 nonvariantLibs = []string{}
2481 for _, entry := range list {
2482 // strip #version suffix out
2483 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002484 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002485 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002486 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002487 nonvariantLibs = append(nonvariantLibs, entry)
2488 }
2489 }
2490 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002491
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002492}
2493
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002494func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2495 nonVariantLibs := []string{}
2496 variantLibs := []string{}
2497
2498 for _, lib := range libs {
2499 replaceLibName := GetReplaceModuleName(lib, replaceList)
2500 if replaceLibName == lib {
2501 // Do not handle any libs which are not in API imports
2502 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2503 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2504 variantLibs = append(variantLibs, replaceLibName)
2505 } else {
2506 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2507 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002508 }
2509
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002510 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002511}
2512
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002513func (c *Module) shouldUseApiSurface() bool {
2514 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2515 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2516 // LLNDK Variant
2517 return true
2518 }
2519
2520 if c.Properties.IsSdkVariant {
2521 // NDK Variant
2522 return true
2523 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002524 }
2525
2526 return false
2527}
2528
Colin Cross1e676be2016-10-12 14:38:15 -07002529func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002530 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002531 return
2532 }
2533
Colin Cross37047f12016-12-13 17:06:13 -08002534 ctx := &depsContext{
2535 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002536 moduleContextImpl: moduleContextImpl{
2537 mod: c,
2538 },
2539 }
2540 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002541
Colin Crossc99deeb2016-04-11 15:06:20 -07002542 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002543
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002544 apiNdkLibs := []string{}
2545 apiLateNdkLibs := []string{}
2546
Yo Chiang219968c2020-09-22 18:45:04 +08002547 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2548
Dan Albert914449f2016-06-17 16:45:24 -07002549 variantNdkLibs := []string{}
2550 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002551 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002552 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2553 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2554 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002555 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002556
Colin Cross32ec36c2016-12-15 07:39:51 -08002557 for _, lib := range deps.HeaderLibs {
Colin Cross190a66a2024-12-05 14:06:17 -08002558 depTag := libraryDependencyTag{Kind: headerLibraryDependency, fromStatic: c.static()}
Colin Cross32ec36c2016-12-15 07:39:51 -08002559 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002560 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002561 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002562
Spandan Das73bcafc2022-08-18 23:26:00 +00002563 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002564 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2565 if variationExists {
2566 actx.AddVariationDependencies(nil, depTag, lib)
2567 } else {
2568 // dependencies to ndk_headers fall here as ndk_headers do not have
2569 // any variants.
2570 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2571 }
Spandan Dasff665182024-09-11 18:48:44 +00002572 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002573 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002574 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002575 } else {
2576 actx.AddVariationDependencies(nil, depTag, lib)
2577 }
2578 }
2579
Dan Albertf1d14c72020-07-30 14:32:55 -07002580 if c.isNDKStubLibrary() {
2581 // NDK stubs depend on their implementation because the ABI dumps are
2582 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002583
Spandan Das8b08aea2023-03-14 19:29:34 +00002584 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2585 c.ImageVariation(),
2586 blueprint.Variation{Mutator: "link", Variation: "shared"},
2587 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002588 }
2589
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002590 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2591 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2592 c.Target().NativeBridge == android.NativeBridgeDisabled {
2593 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002594 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002595 llndkHeaderLibTag,
2596 deps.LlndkHeaderLibs...)
2597 }
2598
Jiyong Park5d1598f2019-02-25 22:14:17 +09002599 for _, lib := range deps.WholeStaticLibs {
Colin Cross190a66a2024-12-05 14:06:17 -08002600 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true, fromStatic: c.static()}
Inseob Kimeec88e12020-01-22 11:11:29 +09002601
Jiyong Park5d1598f2019-02-25 22:14:17 +09002602 actx.AddVariationDependencies([]blueprint.Variation{
2603 {Mutator: "link", Variation: "static"},
2604 }, depTag, lib)
2605 }
2606
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002607 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002608 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross190a66a2024-12-05 14:06:17 -08002609 depTag := libraryDependencyTag{Kind: staticLibraryDependency, fromStatic: c.static()}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002610
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002611 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002612 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002613 }
Jiyong Parke3867542020-12-03 17:28:25 +09002614 if inList(lib, deps.ExcludeLibsForApex) {
2615 depTag.excludeInApex = true
2616 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002617 actx.AddVariationDependencies([]blueprint.Variation{
2618 {Mutator: "link", Variation: "static"},
2619 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002620 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002621
Jooyung Han75568392020-03-20 04:29:24 +09002622 // staticUnwinderDep is treated as staticDep for Q apexes
2623 // so that native libraries/binaries are linked with static unwinder
2624 // because Q libc doesn't have unwinder APIs
2625 if deps.StaticUnwinderIfLegacy {
Colin Cross190a66a2024-12-05 14:06:17 -08002626 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true, fromStatic: c.static()}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002627 actx.AddVariationDependencies([]blueprint.Variation{
2628 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002629 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002630 }
2631
Jiyong Park7ed9de32018-10-15 22:25:07 +09002632 // shared lib names without the #version suffix
2633 var sharedLibNames []string
2634
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002635 for _, lib := range deps.SharedLibs {
Colin Cross190a66a2024-12-05 14:06:17 -08002636 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, fromStatic: c.static()}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002637 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002638 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002639 }
Jiyong Parke3867542020-12-03 17:28:25 +09002640 if inList(lib, deps.ExcludeLibsForApex) {
2641 depTag.excludeInApex = true
2642 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002643 if inList(lib, deps.ExcludeLibsForNonApex) {
2644 depTag.excludeInNonApex = true
2645 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002646
Jiyong Park73c54ee2019-10-22 20:31:18 +09002647 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002648 sharedLibNames = append(sharedLibNames, name)
2649
Colin Crosse7257d22020-09-24 09:56:18 -07002650 variations := []blueprint.Variation{
2651 {Mutator: "link", Variation: "shared"},
2652 }
Spandan Dasff665182024-09-11 18:48:44 +00002653 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002654 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002655
Colin Crossfe9acfe2021-06-14 16:13:03 -07002656 for _, lib := range deps.LateStaticLibs {
Colin Cross190a66a2024-12-05 14:06:17 -08002657 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, fromStatic: c.static()}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002658 actx.AddVariationDependencies([]blueprint.Variation{
2659 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002660 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002661 }
2662
Colin Cross3e5e7782022-06-17 22:17:05 +00002663 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross190a66a2024-12-05 14:06:17 -08002664 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true, fromStatic: c.static()}
Colin Cross3e5e7782022-06-17 22:17:05 +00002665 actx.AddVariationDependencies([]blueprint.Variation{
2666 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002667 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002668 }
2669
Jiyong Park7ed9de32018-10-15 22:25:07 +09002670 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002671 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002672 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2673 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2674 // linking against both the stubs lib and the non-stubs lib at the same time.
2675 continue
2676 }
Colin Cross190a66a2024-12-05 14:06:17 -08002677 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, fromStatic: c.static()}
Colin Crosse7257d22020-09-24 09:56:18 -07002678 variations := []blueprint.Variation{
2679 {Mutator: "link", Variation: "shared"},
2680 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002681 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002682 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002683
Dan Willemsen59339a22018-07-22 21:18:45 -07002684 actx.AddVariationDependencies([]blueprint.Variation{
2685 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002686 }, dataLibDepTag, deps.DataLibs...)
2687
Colin Crossc8caa062021-09-24 16:50:14 -07002688 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2689
Chris Parsons79d66a52020-06-05 17:26:16 -04002690 actx.AddVariationDependencies([]blueprint.Variation{
2691 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002692 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002693
Colin Cross68861832016-07-08 10:41:41 -07002694 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002695
2696 for _, gen := range deps.GeneratedHeaders {
2697 depTag := genHeaderDepTag
2698 if inList(gen, deps.ReexportGeneratedHeaders) {
2699 depTag = genHeaderExportDepTag
2700 }
2701 actx.AddDependency(c, depTag, gen)
2702 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002703
Cole Faust65cb40a2024-10-21 15:41:42 -07002704 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2705 depTag := genHeaderDepTag
2706 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2707 }
2708
Dan Albert92fe7402020-07-15 13:33:30 -07002709 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002710 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002711 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002712 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002713 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002714 }
Colin Crossc465efd2021-06-11 18:00:04 -07002715 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002716 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002717 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002718 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002719 if deps.DynamicLinker != "" {
2720 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002721 }
Dan Albert914449f2016-06-17 16:45:24 -07002722
2723 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002724
Colin Cross190a66a2024-12-05 14:06:17 -08002725 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version, fromStatic: c.static()}
Dan Albert914449f2016-06-17 16:45:24 -07002726 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002727 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002728 {Mutator: "link", Variation: "shared"},
2729 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002730 actx.AddVariationDependencies([]blueprint.Variation{
2731 {Mutator: "version", Variation: version},
2732 {Mutator: "link", Variation: "shared"},
2733 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002734
Colin Cross190a66a2024-12-05 14:06:17 -08002735 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version, fromStatic: c.static()}
Dan Albert914449f2016-06-17 16:45:24 -07002736 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002737 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002738 {Mutator: "link", Variation: "shared"},
2739 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002740 actx.AddVariationDependencies([]blueprint.Variation{
2741 {Mutator: "version", Variation: version},
2742 {Mutator: "link", Variation: "shared"},
2743 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002744
Vinh Tran367d89d2023-04-28 11:21:25 -04002745 if len(deps.AidlLibs) > 0 {
2746 actx.AddDependency(
2747 c,
2748 aidlLibraryTag,
2749 deps.AidlLibs...,
2750 )
2751 }
2752
Colin Cross6362e272015-10-29 15:25:03 -07002753}
Colin Cross21b9a242015-03-24 14:15:58 -07002754
Colin Crosse40b4ea2018-10-02 22:25:58 -07002755func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002756 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002757 c.beginMutator(ctx)
2758 }
2759}
2760
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002761// Whether a module can link to another module, taking into
2762// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002763func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002764 tag blueprint.DependencyTag) {
2765
2766 switch t := tag.(type) {
2767 case dependencyTag:
2768 if t != vndkExtDepTag {
2769 return
2770 }
2771 case libraryDependencyTag:
2772 default:
2773 return
2774 }
2775
Ivan Lozanof9e21722020-12-02 09:00:51 -05002776 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002777 // Host code is not restricted
2778 return
2779 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002780
Ivan Lozano52767be2019-10-18 14:49:46 -07002781 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002782 // Platform code can link to anything
2783 return
2784 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002785 if from.InRamdisk() {
2786 // Ramdisk code is not NDK
2787 return
2788 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002789 if from.InVendorRamdisk() {
2790 // Vendor ramdisk code is not NDK
2791 return
2792 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002793 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002794 // Recovery code is not NDK
2795 return
2796 }
Colin Cross31076b32020-10-23 17:22:06 -07002797 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002798 if c.StubDecorator() {
2799 // These aren't real libraries, but are the stub shared libraries that are included in
2800 // the NDK.
2801 return
2802 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002803 }
Logan Chien834b9a62019-01-14 15:39:03 +08002804
Ivan Lozano52767be2019-10-18 14:49:46 -07002805 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002806 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2807 // to link to libc++ (non-NDK and without sdk_version).
2808 return
2809 }
2810
Ivan Lozano52767be2019-10-18 14:49:46 -07002811 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002812 // NDK code linking to platform code is never okay.
2813 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002814 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002815 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002816 }
2817
2818 // At this point we know we have two NDK libraries, but we need to
2819 // check that we're not linking against anything built against a higher
2820 // API level, as it is only valid to link against older or equivalent
2821 // APIs.
2822
Inseob Kim01a28722018-04-11 09:48:45 +09002823 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07002824 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002825 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07002826 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09002827 // Current can't be linked against by anything else.
2828 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002829 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09002830 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002831 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002832 if err != nil {
2833 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002834 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002835 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002836 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002837 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002838 if err != nil {
2839 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002840 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002841 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002842 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002843
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07002844 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09002845 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002846 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09002847 }
2848 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002849 }
Dan Albert202fe492017-12-15 13:56:59 -08002850
2851 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07002852 fromStl := from.SelectedStl()
2853 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08002854 if fromStl == "" || toStl == "" {
2855 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09002856 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08002857 // We can be permissive with the system "STL" since it is only the C++
2858 // ABI layer, but in the future we should make sure that everyone is
2859 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07002860 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08002861 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002862 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
2863 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08002864 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002865}
2866
Jooyung Han479ca172020-10-19 18:51:07 +09002867func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
2868 if c, ok := ctx.Module().(*Module); ok {
2869 ctx.VisitDirectDeps(func(dep android.Module) {
2870 depTag := ctx.OtherModuleDependencyTag(dep)
2871 ccDep, ok := dep.(LinkableInterface)
2872 if ok {
2873 checkLinkType(ctx, c, ccDep, depTag)
2874 }
2875 })
2876 }
2877}
2878
Jiyong Park5fb8c102018-04-09 12:03:06 +09002879// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09002880// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
2881// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002882// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07002883func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09002884 check := func(child, parent android.Module) bool {
2885 to, ok := child.(*Module)
2886 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09002887 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09002888 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002889
Jooyung Hana70f0672019-01-18 15:20:43 +09002890 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
2891 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09002892 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002893
Jiyong Park0474e1f2021-01-14 14:26:06 +09002894 // These dependencies are not excercised at runtime. Tracking these will give us
2895 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09002896 depTag := ctx.OtherModuleDependencyTag(child)
2897 if IsHeaderDepTag(depTag) {
2898 return false
2899 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09002900 if depTag == staticVariantTag {
2901 return false
2902 }
2903 if depTag == stubImplDepTag {
2904 return false
2905 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09002906 if depTag == android.RequiredDepTag {
2907 return false
2908 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09002909
Justin Yun63e9ec72020-10-29 16:49:43 +09002910 // Even if target lib has no vendor variant, keep checking dependency
2911 // graph in case it depends on vendor_available or product_available
2912 // but not double_loadable transtively.
2913 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002914 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09002915 }
Jooyung Hana70f0672019-01-18 15:20:43 +09002916
Jiyong Park0474e1f2021-01-14 14:26:06 +09002917 // The happy path. Keep tracking dependencies until we hit a non double-loadable
2918 // one.
2919 if Bool(to.VendorProperties.Double_loadable) {
2920 return true
2921 }
2922
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09002923 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002924 return false
2925 }
2926
Jooyung Hana70f0672019-01-18 15:20:43 +09002927 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
2928 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09002929 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09002930 return false
2931 }
2932 if module, ok := ctx.Module().(*Module); ok {
2933 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09002934 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09002935 ctx.WalkDeps(check)
2936 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09002937 }
2938 }
2939}
2940
Yu Liue4312402023-01-18 09:15:31 -08002941func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
2942 // For the dependency from platform to apex, use the latest stubs
2943 apexSdkVersion := android.FutureApiLevel
2944 if !apexInfo.IsForPlatform() {
2945 apexSdkVersion = apexInfo.MinSdkVersion
2946 }
2947
2948 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
2949 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
2950 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
2951 // (b/144430859)
2952 apexSdkVersion = android.FutureApiLevel
2953 }
2954
2955 return apexSdkVersion
2956}
2957
Colin Crossc99deeb2016-04-11 15:06:20 -07002958// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07002959func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08002960 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08002961
Colin Cross0de8a1e2020-09-18 14:15:30 -07002962 var directStaticDeps []StaticLibraryInfo
2963 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07002964
Colin Cross0de8a1e2020-09-18 14:15:30 -07002965 reexportExporter := func(exporter FlagExporterInfo) {
2966 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
2967 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
2968 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
2969 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
2970 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09002971 }
2972
Colin Crossff694a82023-12-13 15:54:49 -08002973 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08002974 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09002975
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002976 skipModuleList := map[string]bool{}
2977
Colin Crossd11fcda2017-10-23 17:59:01 -07002978 ctx.VisitDirectDeps(func(dep android.Module) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002979 depName := ctx.OtherModuleName(dep)
2980 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07002981
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002982 if _, ok := skipModuleList[depName]; ok {
2983 // skip this module because original module or API imported module matching with this should be used instead.
2984 return
2985 }
2986
Dan Willemsen47450072021-10-19 20:24:49 -07002987 if depTag == android.DarwinUniversalVariantTag {
2988 depPaths.DarwinSecondArchOutput = dep.(*Module).OutputFile()
2989 return
2990 }
2991
Vinh Tran367d89d2023-04-28 11:21:25 -04002992 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08002993 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04002994 depPaths.AidlLibraryInfos = append(
2995 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08002996 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04002997 )
2998 }
2999 }
3000
Ivan Lozano52767be2019-10-18 14:49:46 -07003001 ccDep, ok := dep.(LinkableInterface)
3002 if !ok {
3003
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003004 // handling for a few module types that aren't cc Module but that are also supported
3005 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003006 case genSourceDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003007 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003008 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
3009 genRule.GeneratedSourceFiles()...)
3010 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003011 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003012 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003013 // Support exported headers from a generated_sources dependency
3014 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003015 case genHeaderDepTag, genHeaderExportDepTag:
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003016 if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003017 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Dan Willemsen9da9d492018-02-21 18:28:18 -08003018 genRule.GeneratedDeps()...)
Jiyong Park74955042019-10-22 20:19:51 +09003019 dirs := genRule.GeneratedHeaderDirs()
Inseob Kim69378442019-06-03 19:10:47 +09003020 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003021 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003022 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003023 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
3024 genRule.GeneratedSourceFiles()...)
Inseob Kim69378442019-06-03 19:10:47 +09003025 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003026 // 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 +09003027 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003028
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003029 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003030 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003031 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003032 }
Colin Crosscef792e2021-06-11 18:01:26 -07003033 case CrtBeginDepTag:
3034 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3035 case CrtEndDepTag:
3036 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003037 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003038 return
3039 }
3040
Colin Crossfe17f6f2019-03-28 19:30:56 -07003041 if depTag == android.ProtoPluginDepTag {
3042 return
3043 }
3044
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003045 if depTag == android.RequiredDepTag {
3046 return
3047 }
3048
Colin Crossd11fcda2017-10-23 17:59:01 -07003049 if dep.Target().Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003050 ctx.ModuleErrorf("OS mismatch between %q (%s) and %q (%s)", ctx.ModuleName(), ctx.Os().Name, depName, dep.Target().Os.Name)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003051 return
3052 }
Colin Crossd11fcda2017-10-23 17:59:01 -07003053 if dep.Target().Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003054 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
3055 ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003056 return
3057 }
3058
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003059 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003060 // Skip reused objects for stub libraries, they use their own stub object file instead.
3061 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3062 // version mutator, so the stubs variant is created from the shared variant that
3063 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003064 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003065 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003066 objs := staticAnalogue.ReuseObjects
3067 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003068 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003069 reexportExporter(depExporterInfo)
3070 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003071 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003072 }
3073
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003074 if depTag == llndkHeaderLibTag {
3075 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3076 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3077 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3078 }
3079
Colin Cross6e511a92020-07-27 21:26:48 -07003080 linkFile := ccDep.OutputFile()
3081
3082 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3083 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003084 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003085 return
3086 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003087
Jiyong Parke3867542020-12-03 17:28:25 +09003088 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3089 return
3090 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003091 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3092 return
3093 }
Jiyong Parke3867542020-12-03 17:28:25 +09003094
Colin Cross313aa542023-12-13 13:47:44 -08003095 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003096
Colin Cross6e511a92020-07-27 21:26:48 -07003097 var ptr *android.Paths
3098 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003099
Colin Cross6e511a92020-07-27 21:26:48 -07003100 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003101
Colin Cross6e511a92020-07-27 21:26:48 -07003102 switch {
3103 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003104 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003105 if !ctx.Config().AllowMissingDependencies() {
3106 ctx.ModuleErrorf("module %q is not a header library", depName)
3107 } else {
3108 ctx.AddMissingDependencies([]string{depName})
3109 }
3110 return
3111 }
Colin Cross6e511a92020-07-27 21:26:48 -07003112 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003113 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003114 if !ctx.Config().AllowMissingDependencies() {
3115 ctx.ModuleErrorf("module %q is not a shared library", depName)
3116 } else {
3117 ctx.AddMissingDependencies([]string{depName})
3118 }
3119 return
3120 }
Jiyong Parke3867542020-12-03 17:28:25 +09003121
Jiyong Park7d55b612021-06-11 17:22:09 +09003122 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3123 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003124
Jiyong Park1ad8e162020-12-01 23:40:09 +09003125 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3126 // linkFile, depFile, and ptr.
3127 if c.IsStubs() {
3128 break
3129 }
3130
Colin Cross0de8a1e2020-09-18 14:15:30 -07003131 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3132 depFile = sharedLibraryInfo.TableOfContents
3133
Colin Crossb614cd42024-10-11 12:52:21 -07003134 if !sharedLibraryInfo.IsStubs {
3135 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3136 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3137 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3138 }
3139 }
3140
Colin Cross6e511a92020-07-27 21:26:48 -07003141 ptr = &depPaths.SharedLibs
3142 switch libDepTag.Order {
3143 case earlyLibraryDependency:
3144 ptr = &depPaths.EarlySharedLibs
3145 depPtr = &depPaths.EarlySharedLibsDeps
3146 case normalLibraryDependency:
3147 ptr = &depPaths.SharedLibs
3148 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003149 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003150 case lateLibraryDependency:
3151 ptr = &depPaths.LateSharedLibs
3152 depPtr = &depPaths.LateSharedLibsDeps
3153 default:
3154 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003155 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003156
Colin Cross6e511a92020-07-27 21:26:48 -07003157 case libDepTag.static():
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003158 if ccDep.RustLibraryInterface() {
3159 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: ccDep.CrateName(), LinkDirs: ccDep.ExportedCrateLinkDirs()}
3160 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3161 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3162 if libDepTag.wholeStatic {
3163 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3164 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003165
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003166 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3167 // exported functions from the rust generated staticlib still exported.
3168 if c.CcLibrary() && c.Shared() {
3169 c.WholeRustStaticlib = true
3170 }
Colin Cross6e511a92020-07-27 21:26:48 -07003171 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003172
Colin Cross6e511a92020-07-27 21:26:48 -07003173 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003174 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3175 if !isStaticLib {
3176 if !ctx.Config().AllowMissingDependencies() {
3177 ctx.ModuleErrorf("module %q is not a static library", depName)
3178 } else {
3179 ctx.AddMissingDependencies([]string{depName})
3180 }
3181 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003182 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003183
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003184 // Stubs lib doesn't link to the static lib dependencies. Don't set
3185 // linkFile, depFile, and ptr.
3186 if c.IsStubs() {
3187 break
3188 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003189
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003190 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3191 if libDepTag.wholeStatic {
3192 ptr = &depPaths.WholeStaticLibs
3193 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3194 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3195 } else {
3196 // This case normally catches prebuilt static
3197 // libraries, but it can also occur when
3198 // AllowMissingDependencies is on and the
3199 // dependencies has no sources of its own
3200 // but has a whole_static_libs dependency
3201 // on a missing library. We want to depend
3202 // on the .a file so that there is something
3203 // in the dependency tree that contains the
3204 // error rule for the missing transitive
3205 // dependency.
3206 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3207 }
3208 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3209 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3210 } else {
3211 switch libDepTag.Order {
3212 case earlyLibraryDependency:
3213 panic(fmt.Errorf("early static libs not supported"))
3214 case normalLibraryDependency:
3215 // static dependencies will be handled separately so they can be ordered
3216 // using transitive dependencies.
3217 ptr = nil
3218 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3219 case lateLibraryDependency:
3220 ptr = &depPaths.LateStaticLibs
3221 default:
3222 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3223 }
3224 }
3225
3226 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3227 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3228
3229 if libDepTag.unexportedSymbols {
3230 depPaths.LdFlags = append(depPaths.LdFlags,
3231 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3232 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003233 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003234 }
3235
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003236 if libDepTag.static() && !libDepTag.wholeStatic && !ccDep.RustLibraryInterface() {
Colin Cross6e511a92020-07-27 21:26:48 -07003237 if !ccDep.CcLibraryInterface() || !ccDep.Static() {
3238 ctx.ModuleErrorf("module %q not a static library", depName)
3239 return
3240 }
Logan Chien43d34c32017-12-20 01:17:32 +08003241
Colin Cross6e511a92020-07-27 21:26:48 -07003242 // When combining coverage files for shared libraries and executables, coverage files
3243 // in static libraries act as if they were whole static libraries. The same goes for
3244 // source based Abi dump files.
3245 if c, ok := ccDep.(*Module); ok {
3246 staticLib := c.linker.(libraryInterface)
3247 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
3248 staticLib.objs().coverageFiles...)
3249 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
3250 staticLib.objs().sAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003251 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003252 // Handle non-CC modules here
3253 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Colin Cross0de8a1e2020-09-18 14:15:30 -07003254 ccDep.CoverageFiles()...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003255 }
3256 }
3257
Colin Cross6e511a92020-07-27 21:26:48 -07003258 if ptr != nil {
3259 if !linkFile.Valid() {
3260 if !ctx.Config().AllowMissingDependencies() {
3261 ctx.ModuleErrorf("module %q missing output file", depName)
3262 } else {
3263 ctx.AddMissingDependencies([]string{depName})
3264 }
3265 return
3266 }
3267 *ptr = append(*ptr, linkFile.Path())
3268 }
3269
3270 if depPtr != nil {
3271 dep := depFile
3272 if !dep.Valid() {
3273 dep = linkFile
3274 }
3275 *depPtr = append(*depPtr, dep.Path())
3276 }
3277
Colin Cross0de8a1e2020-09-18 14:15:30 -07003278 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3279 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3280 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3281 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003282 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3283
3284 // Only re-export RustRlibDeps for cc static libs
3285 if c.static() {
3286 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3287 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003288
3289 if libDepTag.reexportFlags {
3290 reexportExporter(depExporterInfo)
3291 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3292 // Re-exported shared library headers must be included as well since they can help us with type information
3293 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003294 c.sabi.Properties.ReexportedIncludes = append(
3295 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003296 c.sabi.Properties.ReexportedSystemIncludes = append(
3297 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003298 }
3299
Spandan Das3faa7922024-02-26 19:42:32 +00003300 makeLibName := MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName()) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003301 switch {
3302 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003303 c.Properties.AndroidMkHeaderLibs = append(
3304 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003305 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003306 // Note: the order of libs in this list is not important because
3307 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003308 c.Properties.AndroidMkSharedLibs = append(
3309 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003310 case libDepTag.static():
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003311 if !ccDep.RustLibraryInterface() {
3312 if libDepTag.wholeStatic {
3313 c.Properties.AndroidMkWholeStaticLibs = append(
3314 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3315 } else {
3316 c.Properties.AndroidMkStaticLibs = append(
3317 c.Properties.AndroidMkStaticLibs, makeLibName)
3318 }
Colin Cross6e511a92020-07-27 21:26:48 -07003319 }
3320 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003321 } else if !c.IsStubs() {
3322 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3323
Colin Cross6e511a92020-07-27 21:26:48 -07003324 switch depTag {
3325 case runtimeDepTag:
3326 c.Properties.AndroidMkRuntimeLibs = append(
Spandan Das3faa7922024-02-26 19:42:32 +00003327 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ctx, c, ccDep, ccDep.BaseModuleName())+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003328 case objDepTag:
3329 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3330 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003331 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003332 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003333 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003334 case dynamicLinkerDepTag:
3335 depPaths.DynamicLinker = linkFile
3336 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003337 }
Colin Crossca860ac2016-01-04 14:34:37 -08003338 })
3339
Jeff Gaston294356f2017-09-27 17:05:30 -07003340 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003341 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3342 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3343 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003344
Colin Crossdd84e052017-05-17 13:44:16 -07003345 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003346 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003347 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3348 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003349 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003350 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3351
Jiyong Park74955042019-10-22 20:19:51 +09003352 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3353 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003354 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003355 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003356 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003357 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003358
3359 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003360 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003361 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003362 }
Colin Crossdd84e052017-05-17 13:44:16 -07003363
Colin Crossca860ac2016-01-04 14:34:37 -08003364 return depPaths
3365}
3366
Spandan Das10c41362024-12-03 01:33:09 +00003367func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003368 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003369 bootstrap := false
Spandan Das10c41362024-12-03 01:33:09 +00003370 if linkable, ok := parent.(LinkableInterface); !ok {
3371 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
Jiyong Park7d55b612021-06-11 17:22:09 +09003372 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003373 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003374 bootstrap = linkable.Bootstrap()
3375 }
3376
Spandan Das10c41362024-12-03 01:33:09 +00003377 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003378
3379 useStubs := false
3380
Kiyoung Kimaa394802024-01-08 12:55:45 +09003381 if lib := moduleLibraryInterface(dep); lib.buildStubs() && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003382 if !apexInfo.IsForPlatform() {
3383 // For platform libraries, use current version of LLNDK
3384 // If this is for use_vendor apex we will apply the same rules
3385 // of apex sdk enforcement below to choose right version.
3386 useStubs = true
3387 }
3388 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3389 // If not building for APEX or the containing APEX allows the use of
3390 // platform APIs, use stubs only when it is from an APEX (and not from
3391 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3392 // bootstrap modules, always link to non-stub variant
3393 isNotInPlatform := dep.(android.ApexModule).NotInPlatform()
3394
Spandan Dasff665182024-09-11 18:48:44 +00003395 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003396 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003397 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3398 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003399 }
3400
3401 return useStubs
3402}
3403
3404// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3405// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3406// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3407// has different level of updatability. For example, if a library foo in an APEX depends on a
3408// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3409// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3410// same APEX as foo, the non-stub variant of bar is used.
3411func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3412 depTag := ctx.OtherModuleDependencyTag(dep)
3413 libDepTag, ok := depTag.(libraryDependencyTag)
3414 if !ok || !libDepTag.shared() {
3415 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3416 }
3417
Colin Cross313aa542023-12-13 13:47:44 -08003418 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3419 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3420 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003421
3422 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003423 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003424 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003425 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3426 toUse := stubs[len(stubs)-1]
3427 sharedLibraryInfo = toUse.SharedLibraryInfo
3428 depExporterInfo = toUse.FlagExporterInfo
3429 }
3430 }
3431 return sharedLibraryInfo, depExporterInfo
3432}
3433
Colin Cross0de8a1e2020-09-18 14:15:30 -07003434// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3435// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003436// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003437// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003438func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3439 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003440 var staticPaths android.Paths
3441 for _, staticDep := range staticDeps {
3442 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3443 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3444 }
3445 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003446 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003447 }
3448 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3449
3450 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3451
3452 // reorder the dependencies based on transitive dependencies
3453 staticPaths = android.FirstUniquePaths(staticPaths)
3454 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3455
3456 if len(orderedStaticPaths) != len(staticPaths) {
3457 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3458 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3459 }
3460
3461 return orderedStaticPaths, transitiveStaticLibs
3462}
3463
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003464// BaseLibName trims known prefixes and suffixes
3465func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003466 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3467 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003468 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003469 return libName
3470}
3471
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003472func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableInterface, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003473 libName := BaseLibName(depName)
Colin Cross127bb8b2020-12-16 16:46:01 -08003474 ccDepModule, _ := ccDep.(*Module)
3475 isLLndk := ccDepModule != nil && ccDepModule.IsLlndk()
Justin Yuncbca3732021-02-03 19:24:13 +09003476 nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003477
Justin Yuncbca3732021-02-03 19:24:13 +09003478 if ccDepModule != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003479 // Use base module name for snapshots when exporting to Makefile.
Ivan Lozanod1dec542021-05-26 15:33:11 -04003480 if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok {
Justin Yuncbca3732021-02-03 19:24:13 +09003481 baseName := ccDepModule.BaseModuleName()
Colin Cross6e511a92020-07-27 21:26:48 -07003482
Ivan Lozanod1dec542021-05-26 15:33:11 -04003483 return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
Colin Cross6e511a92020-07-27 21:26:48 -07003484 }
3485 }
3486
Kiyoung Kim22152f62024-05-24 10:45:28 +09003487 if ccDep.InVendorOrProduct() && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003488 // The vendor and product modules in Make will have been renamed to not conflict with the
3489 // core module, so update the dependency name here accordingly.
Ivan Lozanoc08897c2021-04-02 12:41:32 -04003490 return libName + ccDep.SubName()
Colin Cross6e511a92020-07-27 21:26:48 -07003491 } else if ccDep.InRamdisk() && !ccDep.OnlyInRamdisk() {
Matthew Maurerc6868382021-07-13 14:12:37 -07003492 return libName + RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003493 } else if ccDep.InVendorRamdisk() && !ccDep.OnlyInVendorRamdisk() {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003494 return libName + VendorRamdiskSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003495 } else if ccDep.InRecovery() && !ccDep.OnlyInRecovery() {
Matthew Maurer460ee942021-02-11 12:31:46 -08003496 return libName + RecoverySuffix
Ivan Lozanof9e21722020-12-02 09:00:51 -05003497 } else if ccDep.Target().NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003498 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003499 } else {
3500 return libName
3501 }
3502}
3503
Colin Crossca860ac2016-01-04 14:34:37 -08003504func (c *Module) InstallInData() bool {
3505 if c.installer == nil {
3506 return false
3507 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003508 return c.installer.inData()
3509}
3510
3511func (c *Module) InstallInSanitizerDir() bool {
3512 if c.installer == nil {
3513 return false
3514 }
3515 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003516 return true
3517 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003518 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003519}
3520
Yifan Hong1b3348d2020-01-21 15:53:22 -08003521func (c *Module) InstallInRamdisk() bool {
3522 return c.InRamdisk()
3523}
3524
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003525func (c *Module) InstallInVendorRamdisk() bool {
3526 return c.InVendorRamdisk()
3527}
3528
Jiyong Parkf9332f12018-02-01 00:54:12 +09003529func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003530 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003531}
3532
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003533func (c *Module) MakeUninstallable() {
3534 if c.installer == nil {
3535 c.ModuleBase.MakeUninstallable()
3536 return
3537 }
3538 c.installer.makeUninstallable(c)
3539}
3540
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003541func (c *Module) HostToolPath() android.OptionalPath {
3542 if c.installer == nil {
3543 return android.OptionalPath{}
3544 }
3545 return c.installer.hostToolPath()
3546}
3547
Nan Zhangd4e641b2017-07-12 12:55:28 -07003548func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3549 return c.outputFile
3550}
3551
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003552func (c *Module) static() bool {
3553 if static, ok := c.linker.(interface {
3554 static() bool
3555 }); ok {
3556 return static.static()
3557 }
3558 return false
3559}
3560
Colin Cross6a730042024-12-05 13:53:43 -08003561func (c *Module) staticLibrary() bool {
3562 if static, ok := c.linker.(interface {
3563 staticLibrary() bool
3564 }); ok {
3565 return static.staticLibrary()
3566 }
3567 return false
3568}
3569
Jiyong Park379de2f2018-12-19 02:47:14 +09003570func (c *Module) staticBinary() bool {
3571 if static, ok := c.linker.(interface {
3572 staticBinary() bool
3573 }); ok {
3574 return static.staticBinary()
3575 }
3576 return false
3577}
3578
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003579func (c *Module) testBinary() bool {
3580 if test, ok := c.linker.(interface {
3581 testBinary() bool
3582 }); ok {
3583 return test.testBinary()
3584 }
3585 return false
3586}
3587
Jingwen Chen537242c2022-08-24 11:53:27 +00003588func (c *Module) testLibrary() bool {
3589 if test, ok := c.linker.(interface {
3590 testLibrary() bool
3591 }); ok {
3592 return test.testLibrary()
3593 }
3594 return false
3595}
3596
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003597func (c *Module) benchmarkBinary() bool {
3598 if b, ok := c.linker.(interface {
3599 benchmarkBinary() bool
3600 }); ok {
3601 return b.benchmarkBinary()
3602 }
3603 return false
3604}
3605
3606func (c *Module) fuzzBinary() bool {
3607 if f, ok := c.linker.(interface {
3608 fuzzBinary() bool
3609 }); ok {
3610 return f.fuzzBinary()
3611 }
3612 return false
3613}
3614
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003615// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3616func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003617 if h, ok := c.linker.(interface {
3618 header() bool
3619 }); ok {
3620 return h.header()
3621 }
3622 return false
3623}
3624
Ivan Lozanod7586b62021-04-01 09:49:36 -04003625func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003626 if b, ok := c.linker.(interface {
3627 binary() bool
3628 }); ok {
3629 return b.binary()
3630 }
3631 return false
3632}
3633
Justin Yun5e035862021-06-29 20:50:37 +09003634func (c *Module) StaticExecutable() bool {
3635 if b, ok := c.linker.(*binaryDecorator); ok {
3636 return b.static()
3637 }
3638 return false
3639}
3640
Ivan Lozanod7586b62021-04-01 09:49:36 -04003641func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003642 if o, ok := c.linker.(interface {
3643 object() bool
3644 }); ok {
3645 return o.object()
3646 }
3647 return false
3648}
3649
Kiyoung Kim37693d02024-04-04 09:56:15 +09003650func (m *Module) Dylib() bool {
3651 return false
3652}
3653
3654func (m *Module) Rlib() bool {
3655 return false
3656}
3657
Ivan Lozanof9e21722020-12-02 09:00:51 -05003658func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003659 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003660 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003661 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003662 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003663 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003664 return "native:product"
3665 }
Jooyung Han38002912019-05-16 04:01:54 +09003666 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003667 } else if c.InRamdisk() {
3668 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003669 } else if c.InVendorRamdisk() {
3670 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003671 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003672 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003673 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003674 return "native:ndk:none:none"
3675 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3676 //family, link := getNdkStlFamilyAndLinkType(c)
3677 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3678 } else {
3679 return "native:platform"
3680 }
3681}
3682
Jiyong Park9d452992018-10-03 00:38:19 +09003683// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003684// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003685func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003686 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003687 // Stub libs and prebuilt libs in a versioned SDK are not
3688 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003689 return lib.shared() && !lib.buildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003690 }
3691 return false
3692}
3693
Jiyong Parka90ca002019-10-07 15:47:24 +09003694func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003695 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3696}
3697
3698func (c *Module) ApexAvailableFor() []string {
3699 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003700 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003701 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003702 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003703 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003704 }
Yu Liub73c3a62024-12-10 00:58:06 +00003705
3706 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003707}
3708
Paul Duffin0cb37b92020-03-04 14:52:46 +00003709func (c *Module) EverInstallable() bool {
3710 return c.installer != nil &&
3711 // Check to see whether the module is actually ever installable.
3712 c.installer.everInstallable()
3713}
3714
Ivan Lozanod7586b62021-04-01 09:49:36 -04003715func (c *Module) PreventInstall() bool {
3716 return c.Properties.PreventInstall
3717}
3718
3719func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003720 if c.library != nil {
3721 if i := c.library.installable(); i != nil {
3722 return i
3723 }
3724 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003725 return c.Properties.Installable
3726}
3727
3728func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003729 ret := c.EverInstallable() &&
3730 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003731 proptools.BoolDefault(c.Installable(), true) &&
3732 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003733
3734 // The platform variant doesn't need further condition. Apex variants however might not
3735 // be installable because it will likely to be included in the APEX and won't appear
3736 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003737 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003738 return ret
3739 }
3740
3741 // Special case for modules that are configured to be installed to /data, which includes
3742 // test modules. For these modules, both APEX and non-APEX variants are considered as
3743 // installable. This is because even the APEX variants won't be included in the APEX, but
3744 // will anyway be installed to /data/*.
3745 // See b/146995717
3746 if c.InstallInData() {
3747 return ret
3748 }
3749
3750 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003751}
3752
Logan Chien41eabe62019-04-10 13:33:58 +08003753func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3754 if c.linker != nil {
3755 if library, ok := c.linker.(*libraryDecorator); ok {
3756 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3757 }
3758 }
3759}
3760
Jiyong Park45bf82e2020-12-15 22:29:02 +09003761var _ android.ApexModule = (*Module)(nil)
3762
3763// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003764func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossc1b36442021-05-06 13:42:48 -07003765 if depTag == stubImplDepTag {
3766 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003767 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003768 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003769 if depTag == staticVariantTag {
3770 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3771 // actually mean that the static lib (and its dependencies) are copied into the
3772 // APEX.
3773 return false
3774 }
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003775 return true
3776}
3777
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003778func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
3779 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3780
3781 if c.HasStubsVariants() {
3782 if IsSharedDepTag(depTag) {
3783 // dynamic dep to a stubs lib crosses APEX boundary
3784 return false
3785 }
3786 if IsRuntimeDepTag(depTag) {
3787 // runtime dep to a stubs lib also crosses APEX boundary
3788 return false
3789 }
3790 if IsHeaderDepTag(depTag) {
3791 return false
3792 }
3793 }
3794 if c.IsLlndk() {
3795 return false
3796 }
3797 if isLibDepTag && libDepTag.fromStatic && libDepTag.shared() {
3798 // shared_lib dependency from a static lib is considered as crossing
3799 // the APEX boundary because the dependency doesn't actually is
3800 // linked; the dependency is used only during the compilation phase.
3801 return false
3802 }
3803
3804 if isLibDepTag && libDepTag.excludeInApex {
3805 return false
3806 }
3807
3808 return true
3809}
3810
Jiyong Park45bf82e2020-12-15 22:29:02 +09003811// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003812func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3813 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003814 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3815 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3816 return nil
3817 }
Jooyung Han749dc692020-04-15 11:03:39 +09003818 // We don't check for prebuilt modules
3819 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
3820 return nil
3821 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09003822
Jooyung Han749dc692020-04-15 11:03:39 +09003823 minSdkVersion := c.MinSdkVersion()
3824 if minSdkVersion == "apex_inherit" {
3825 return nil
3826 }
3827 if minSdkVersion == "" {
3828 // JNI libs within APK-in-APEX fall into here
3829 // Those are okay to set sdk_version instead
3830 // We don't have to check if this is a SDK variant because
3831 // non-SDK variant resets sdk_version, which works too.
3832 minSdkVersion = c.SdkVersion()
3833 }
Dan Albertc8060532020-07-22 22:32:17 -07003834 if minSdkVersion == "" {
3835 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
3836 }
3837 // Not using nativeApiLevelFromUser because the context here is not
3838 // necessarily a native context.
3839 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09003840 if err != nil {
3841 return err
3842 }
Dan Albertc8060532020-07-22 22:32:17 -07003843
Colin Cross8ca61c12022-10-06 21:00:14 -07003844 // A dependency only needs to support a min_sdk_version at least
3845 // as high as the api level that the architecture was introduced in.
3846 // This allows introducing new architectures in the platform that
3847 // need to be included in apexes that normally require an older
3848 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08003849 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07003850 if sdkVersion.LessThan(minApiForArch) {
3851 sdkVersion = minApiForArch
3852 }
3853
Dan Albertc8060532020-07-22 22:32:17 -07003854 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09003855 return fmt.Errorf("newer SDK(%v)", ver)
3856 }
3857 return nil
3858}
3859
Paul Duffinb5769c12021-05-12 16:16:51 +01003860// Implements android.ApexModule
3861func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
3862 // stub libraries and native bridge libraries are always available to platform
3863 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
3864}
3865
Inseob Kima1888ce2022-10-04 14:42:02 +09003866func (c *Module) overriddenModules() []string {
3867 if o, ok := c.linker.(overridable); ok {
3868 return o.overriddenModules()
3869 }
3870 return nil
3871}
3872
Liz Kammer35ca77e2021-12-22 15:31:40 -05003873type moduleType int
3874
3875const (
3876 unknownType moduleType = iota
3877 binary
3878 object
3879 fullLibrary
3880 staticLibrary
3881 sharedLibrary
3882 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00003883 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00003884 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05003885)
3886
3887func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00003888 if c.testBinary() {
3889 // testBinary is also a binary, so this comes before the c.Binary()
3890 // conditional. A testBinary has additional implicit dependencies and
3891 // other test-only semantics.
3892 return testBin
3893 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003894 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003895 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003896 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00003897 } else if c.testLibrary() {
3898 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
3899 // will let them add implicit compile deps on gtest, for example.
3900 //
Liz Kammerefc51d92023-04-21 15:11:25 -04003901 // For now, treat them as regular libraries.
3902 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003903 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05003904 static := false
3905 shared := false
3906 if library, ok := c.linker.(*libraryDecorator); ok {
3907 static = library.MutatedProperties.BuildStatic
3908 shared = library.MutatedProperties.BuildShared
3909 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
3910 static = library.MutatedProperties.BuildStatic
3911 shared = library.MutatedProperties.BuildShared
3912 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003913 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003914 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003915 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003916 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003917 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05003918 return staticLibrary
3919 }
3920 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00003921 } else if c.isNDKStubLibrary() {
3922 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05003923 }
3924 return unknownType
3925}
3926
Colin Crosscfad1192015-11-02 16:43:11 -08003927// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08003928type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07003929 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07003930 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09003931 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08003932}
3933
Patrice Arrudac249c712019-03-19 17:00:29 -07003934// cc_defaults provides a set of properties that can be inherited by other cc
3935// modules. A module can use the properties from a cc_defaults using
3936// `defaults: ["<:default_module_name>"]`. Properties of both modules are
3937// merged (when possible) by prepending the default module's values to the
3938// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07003939func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07003940 return DefaultsFactory()
3941}
3942
Colin Cross36242852017-06-23 15:06:31 -07003943func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08003944 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08003945
Colin Cross36242852017-06-23 15:06:31 -07003946 module.AddProperties(props...)
3947 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08003948 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07003949 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003950 &BaseCompilerProperties{},
3951 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01003952 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003953 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07003954 &StaticProperties{},
3955 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07003956 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003957 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00003958 &TestLinkerProperties{},
3959 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07003960 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07003961 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07003962 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08003963 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08003964 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07003965 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07003966 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07003967 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08003968 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08003969 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07003970 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08003971 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00003972 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08003973 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04003974 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
3975 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07003976 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07003977 )
Colin Crosscfad1192015-11-02 16:43:11 -08003978
Jooyung Hancc372c52019-09-25 15:18:44 +09003979 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07003980
3981 return module
Colin Crosscfad1192015-11-02 16:43:11 -08003982}
3983
Jiyong Park2286afd2020-06-16 21:58:53 +09003984func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02003985 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09003986}
3987
Sasha Smundak2a4549e2018-11-05 16:49:08 -08003988func kytheExtractAllFactory() android.Singleton {
3989 return &kytheExtractAllSingleton{}
3990}
3991
3992type kytheExtractAllSingleton struct {
3993}
3994
3995func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
3996 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00003997 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
3998 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).kytheFiles
3999 if len(files) > 0 {
4000 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004001 }
4002 })
4003 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4004 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004005 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004006 }
4007}
4008
Jihoon Kangf78a8902022-09-01 22:47:07 +00004009func (c *Module) Partition() string {
4010 if p, ok := c.installer.(interface {
4011 getPartition() string
4012 }); ok {
4013 return p.getPartition()
4014 }
4015 return ""
4016}
4017
Spandan Das2b6dfb52024-01-19 00:22:22 +00004018type sourceModuleName interface {
4019 sourceModuleName() string
4020}
4021
4022func (c *Module) BaseModuleName() string {
4023 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4024 // if the prebuilt module sets a source_module_name in Android.bp, use that
4025 return smn.sourceModuleName()
4026 }
4027 return c.ModuleBase.BaseModuleName()
4028}
4029
Spandan Dase20c56c2024-07-23 21:34:24 +00004030func (c *Module) stubsSymbolFilePath() android.Path {
4031 if library, ok := c.linker.(*libraryDecorator); ok {
4032 return library.stubsSymbolFilePath
4033 }
4034 return android.OptionalPath{}.Path()
4035}
4036
Colin Cross06a931b2015-10-28 17:23:31 -07004037var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004038var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004039var BoolPtr = proptools.BoolPtr
4040var String = proptools.String
4041var StringPtr = proptools.StringPtr