blob: f9097e42e125d9e377baf38cb9edb78ff060639f [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 Cross3f40fa42015-01-30 17:27:36 -080037)
38
Yu Liu76d94462024-10-31 23:32:36 +000039type CcMakeVarsInfo struct {
40 WarningsAllowed string
41 UsingWnoError string
42 MissingProfile string
43}
44
45var CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]()
46
Yu Liuec7043d2024-11-05 18:22:20 +000047type CcObjectInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000048 ObjFiles android.Paths
49 TidyFiles android.Paths
50 KytheFiles android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +000051}
52
53var CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]()
54
Yu Liu323d77a2024-12-16 23:13:57 +000055type AidlInterfaceInfo struct {
56 // list of aidl_interface sources
57 Sources []string
58 // root directory of AIDL sources
59 AidlRoot string
60 // AIDL backend language (e.g. "cpp", "ndk")
61 Lang string
62 // list of flags passed to AIDL generator
63 Flags []string
64}
65
66type CompilerInfo struct {
67 Srcs android.Paths
68 // list of module-specific flags that will be used for C and C++ compiles.
69 Cflags proptools.Configurable[[]string]
70 AidlInterfaceInfo AidlInterfaceInfo
71 LibraryDecoratorInfo *LibraryDecoratorInfo
72}
73
74type LinkerInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000075 WholeStaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000076 // list of modules that should be statically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000077 StaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000078 // list of modules that should be dynamically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000079 SharedLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000080 // list of modules that should only provide headers for this module.
Yu Liu8024b922024-12-20 23:31:32 +000081 HeaderLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000082
83 BinaryDecoratorInfo *BinaryDecoratorInfo
84 LibraryDecoratorInfo *LibraryDecoratorInfo
85 TestBinaryInfo *TestBinaryInfo
86 BenchmarkDecoratorInfo *BenchmarkDecoratorInfo
87 ObjectLinkerInfo *ObjectLinkerInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +000088 StubDecoratorInfo *StubDecoratorInfo
Yu Liu323d77a2024-12-16 23:13:57 +000089}
90
91type BinaryDecoratorInfo struct{}
92type LibraryDecoratorInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000093 ExportIncludeDirs proptools.Configurable[[]string]
Yu Liu116610a2025-01-06 21:54:48 +000094 InjectBsslHash bool
Yu Liu323d77a2024-12-16 23:13:57 +000095}
Yu Liuffe86322024-12-18 18:53:12 +000096
Yu Liu8024b922024-12-20 23:31:32 +000097type SnapshotInfo struct {
98 SnapshotAndroidMkSuffix string
Yu Liuffe86322024-12-18 18:53:12 +000099}
100
Yu Liu323d77a2024-12-16 23:13:57 +0000101type TestBinaryInfo struct {
102 Gtest bool
103}
104type BenchmarkDecoratorInfo struct{}
Yu Liu8a8d5b42025-01-07 00:48:08 +0000105
106type StubDecoratorInfo struct{}
107
Yu Liu323d77a2024-12-16 23:13:57 +0000108type ObjectLinkerInfo struct{}
109
Yu Liu8a8d5b42025-01-07 00:48:08 +0000110type LibraryInfo struct {
111 BuildStubs bool
112}
113
Yu Liub1bfa9d2024-12-05 18:57:51 +0000114// Common info about the cc module.
115type CcInfo struct {
Yu Liu323d77a2024-12-16 23:13:57 +0000116 IsPrebuilt bool
117 CmakeSnapshotSupported bool
118 CompilerInfo *CompilerInfo
119 LinkerInfo *LinkerInfo
Yu Liu8024b922024-12-20 23:31:32 +0000120 SnapshotInfo *SnapshotInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +0000121 LibraryInfo *LibraryInfo
Yu Liub1bfa9d2024-12-05 18:57:51 +0000122}
123
Yu Liu8024b922024-12-20 23:31:32 +0000124var CcInfoProvider = blueprint.NewProvider[*CcInfo]()
Yu Liub1bfa9d2024-12-05 18:57:51 +0000125
Yu Liu986d98c2024-11-12 00:28:11 +0000126type LinkableInfo struct {
127 // StaticExecutable returns true if this is a binary module with "static_executable: true".
Yu Liu8024b922024-12-20 23:31:32 +0000128 StaticExecutable bool
129 Static bool
130 Shared bool
131 HasStubsVariants bool
132 StubsVersion string
133 IsStubs bool
134 UnstrippedOutputFile android.Path
135 OutputFile android.OptionalPath
136 CoverageFiles android.Paths
137 SAbiDumpFiles android.Paths
Yu Liu8a8d5b42025-01-07 00:48:08 +0000138 CcLibrary bool
Yu Liu8024b922024-12-20 23:31:32 +0000139 CcLibraryInterface bool
140 RustLibraryInterface bool
141 // CrateName returns the crateName for a Rust library
142 CrateName string
143 // DepFlags returns a slice of Rustc string flags
144 ExportedCrateLinkDirs []string
145 // This can be different from the one on CommonModuleInfo
146 BaseModuleName string
147 HasNonSystemVariants bool
148 IsLlndk bool
149 InVendorOrProduct bool
150 // SubName returns the modules SubName, used for image and NDK/SDK variations.
151 SubName string
152 InRamdisk bool
153 OnlyInRamdisk bool
154 InVendorRamdisk bool
155 OnlyInVendorRamdisk bool
156 InRecovery bool
157 OnlyInRecovery bool
Yu Liu8a8d5b42025-01-07 00:48:08 +0000158 Installable *bool
Yu Liu97880e12025-01-07 19:03:34 +0000159 // RelativeInstallPath returns the relative install path for this module.
160 RelativeInstallPath string
Yu Liu986d98c2024-11-12 00:28:11 +0000161}
162
Yu Liu8024b922024-12-20 23:31:32 +0000163var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
Yu Liu986d98c2024-11-12 00:28:11 +0000164
Colin Cross463a90e2015-06-17 14:20:06 -0700165func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000166 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700167
Inseob Kim3b244062023-07-11 13:31:36 +0900168 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000169 pctx.Import("android/soong/cc/config")
170}
171
172func RegisterCCBuildComponents(ctx android.RegistrationContext) {
173 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
174
175 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700176 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700177 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700178 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700179 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700180 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700181 })
Colin Cross16b23492016-01-06 14:41:07 -0800182
Paul Duffin036e7002019-12-19 19:16:28 +0000183 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400184 for _, san := range Sanitizers {
185 san.registerMutators(ctx)
186 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800187
Colin Cross8a962802024-10-09 15:29:27 -0700188 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
189 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800190
Colin Cross597bad62024-10-08 15:10:55 -0700191 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000192
Colin Crossf5f4ad32024-01-19 15:41:48 -0800193 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700194
Colin Crossd38feb02024-01-23 16:38:06 -0800195 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800196
Colin Cross33e0c812024-01-23 16:36:07 -0800197 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000198
Colin Cross6ac83a82024-01-23 11:23:10 -0800199 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900200
Colin Cross8a962802024-10-09 15:29:27 -0700201 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
202 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700203 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700204
Colin Cross91ae5ec2024-10-01 14:03:40 -0700205 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800206 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700207 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800208 })
209
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000210 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700211}
212
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500213// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
214// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
215// edges to these modules.
216// This object is constructed in DepsMutator, by calling to various module delegates to set
217// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
218// dependencies.
219// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
220// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800221type Deps struct {
222 SharedLibs, LateSharedLibs []string
223 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800224 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800225 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700226
Colin Cross3e5e7782022-06-17 22:17:05 +0000227 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
228 // prevent automatically exporting symbols.
229 UnexportedStaticLibs []string
230
Chris Parsons79d66a52020-06-05 17:26:16 -0400231 // Used for data dependencies adjacent to tests
232 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700233 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400234
Yo Chiang219968c2020-09-22 18:45:04 +0800235 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
236 SystemSharedLibs []string
237
Vinh Tran367d89d2023-04-28 11:21:25 -0400238 // Used by DepMutator to pass aidl_library modules to aidl compiler
239 AidlLibs []string
240
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500241 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800242 StaticUnwinderIfLegacy bool
243
Colin Cross5950f382016-12-13 12:50:57 -0800244 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700245
Colin Cross81413472016-04-11 14:37:39 -0700246 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700247
Cole Faust65cb40a2024-10-21 15:41:42 -0700248 GeneratedSources []string
249 GeneratedHeaders []string
250 DeviceFirstGeneratedHeaders []string
251 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700252
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700253 ReexportGeneratedHeaders []string
254
Colin Crossc465efd2021-06-11 18:00:04 -0700255 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700256
257 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700258 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900259
260 // List of libs that need to be excluded for APEX variant
261 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900262 // List of libs that need to be excluded for non-APEX variant
263 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800264
265 // LLNDK headers for the ABI checker to check LLNDK implementation library.
266 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700267 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800268 // Instead, the LLNDK implementation depends on the LLNDK header libs.
269 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700270}
271
Ivan Lozano0a468a42024-05-13 21:03:34 -0400272// A struct which to collect flags for rlib dependencies
273type RustRlibDep struct {
274 LibPath android.Path // path to the rlib
275 LinkDirs []string // flags required for dependency (e.g. -L flags)
276 CrateName string // crateNames associated with rlibDeps
277}
278
279func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
280 return a.LibPath == b.LibPath
281}
282
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500283// PathDeps is a struct containing file paths to dependencies of a module.
284// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
285// It's used to construct flags for various build statements (such as for compiling and linking).
286// It is then passed to module decorator functions responsible for registering build statements
287// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800288type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700289 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900290 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700291 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900292 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700293 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700294 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400295 // Paths and crateNames for RustStaticLib dependencies
296 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700297
Colin Cross0de8a1e2020-09-18 14:15:30 -0700298 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700299 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700300
Colin Cross26c34ed2016-09-30 17:10:16 -0700301 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100302 Objs Objects
303 // Paths to .o files in dependencies that provide them. Note that these lists
304 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800305 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700306 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700307
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100308 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
309 // the libs from all whole_static_lib dependencies.
310 WholeStaticLibsFromPrebuilts android.Paths
311
Colin Cross26c34ed2016-09-30 17:10:16 -0700312 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700313 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900314 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700315
Inseob Kimd110f872019-12-06 13:15:38 +0900316 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000317 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900318 IncludeDirs android.Paths
319 SystemIncludeDirs android.Paths
320 ReexportedDirs android.Paths
321 ReexportedSystemDirs android.Paths
322 ReexportedFlags []string
323 ReexportedGeneratedHeaders android.Paths
324 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400325 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700326
Colin Cross26c34ed2016-09-30 17:10:16 -0700327 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700328 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700329
Dan Willemsena0790e32018-10-12 00:24:23 -0700330 // Path to the dynamic linker binary
331 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700332
333 // For Darwin builds, the path to the second architecture's output that should
334 // be combined with this architectures's output into a FAT MachO file.
335 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400336
337 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
338 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800339
340 // LLNDK headers for the ABI checker to check LLNDK implementation library.
341 LlndkIncludeDirs android.Paths
342 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700343
344 directImplementationDeps android.Paths
345 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700346}
347
Colin Cross4af21ed2019-11-04 09:37:55 -0800348// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
349// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
350// command line so they can be overridden by the local module flags).
351type LocalOrGlobalFlags struct {
352 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700353 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800354 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700355 CFlags []string // Flags that apply to C and C++ source files
356 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
357 ConlyFlags []string // Flags that apply to C source files
358 CppFlags []string // Flags that apply to C++ source files
359 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700360 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800361}
362
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500363// Flags contains various types of command line flags (and settings) for use in building build
364// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800365type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500366 // Local flags (which individual modules are responsible for). These may override global flags.
367 Local LocalOrGlobalFlags
368 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700369 Global LocalOrGlobalFlags
370 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800371
372 aidlFlags []string // Flags that apply to aidl source files
373 rsFlags []string // Flags that apply to renderscript source files
374 libFlags []string // Flags to add libraries early to the link order
375 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
376 TidyFlags []string // Flags that apply to clang-tidy
377 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700378
Colin Crossc3199482017-03-30 15:03:04 -0700379 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800380 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700381 SystemIncludeFlags []string
382
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800383 Toolchain config.Toolchain
384 Tidy bool // True if ninja .tidy rules should be generated.
385 NeedTidyFiles bool // True if module link should depend on .tidy files
386 GcovCoverage bool // True if coverage files should be generated.
387 SAbiDump bool // True if header abi dumps should be generated.
388 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800389 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800390
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500391 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800392 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500393 // The target-device system path to the dynamic linker.
394 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800395
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700396 CFlagsDeps android.Paths // Files depended on by compiler flags
397 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800398
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500399 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700400 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800401
Colin Cross19878da2019-03-28 14:45:07 -0700402 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700403 protoC bool // Whether to use C instead of C++
404 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700405
406 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200407 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700408}
409
Colin Crossca860ac2016-01-04 14:34:37 -0800410// Properties used to compile all C or C++ modules
411type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700412 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800413 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700414
Yi Kong5786f5c2024-05-28 02:22:34 +0900415 // Aggresively trade performance for smaller binary size.
416 // This should only be used for on-device binaries that are rarely executed and not
417 // performance critical.
418 Optimize_for_size *bool `android:"arch_variant"`
419
Jiyong Parkb35a8192020-08-10 15:59:36 +0900420 // The API level that this module is built against. The APIs of this API level will be
421 // visible at build time, but use of any APIs newer than min_sdk_version will render the
422 // module unloadable on older devices. In the future it will be possible to weakly-link new
423 // APIs, making the behavior match Java: such modules will load on older devices, but
424 // calling new APIs on devices that do not support them will result in a crash.
425 //
426 // This property has the same behavior as sdk_version does for Java modules. For those
427 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
428 // does for Java code.
429 //
430 // In addition, setting this property causes two variants to be built, one for the platform
431 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800432 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700433
Jiyong Parkb35a8192020-08-10 15:59:36 +0900434 // Minimum OS API level supported by this C or C++ module. This property becomes the value
435 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
436 // this property is also used to ensure that the min_sdk_version of the containing module is
437 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
438 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
439 // min_sdk_version of the containing APEX. When the module
440 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900441 Min_sdk_version *string
442
Colin Crossc511bc52020-04-07 16:50:32 +0000443 // If true, always create an sdk variant and don't create a platform variant.
444 Sdk_variant_only *bool
445
Colin Cross4297f402024-11-20 15:20:09 -0800446 AndroidMkSharedLibs []string `blueprint:"mutated"`
447 AndroidMkStaticLibs []string `blueprint:"mutated"`
448 AndroidMkRlibs []string `blueprint:"mutated"`
449 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
450 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
451 AndroidMkHeaderLibs []string `blueprint:"mutated"`
452 HideFromMake bool `blueprint:"mutated"`
453 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700454
Yo Chiang219968c2020-09-22 18:45:04 +0800455 // Set by DepsMutator.
456 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
457
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900458 // The name of the image this module is built for
459 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200460
461 // The VNDK version this module is built against. If empty, the module is not
462 // build against the VNDK.
463 VndkVersion string `blueprint:"mutated"`
464
465 // Suffix for the name of Android.mk entries generated by this module
466 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800467
468 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
469 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900470 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900471
Yifan Hong39143a92020-10-26 12:43:12 -0700472 // Make this module available when building for ramdisk.
473 // On device without a dedicated recovery partition, the module is only
474 // available after switching root into
475 // /first_stage_ramdisk. To expose the module before switching root, install
476 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800477 Ramdisk_available *bool
478
Yifan Hong39143a92020-10-26 12:43:12 -0700479 // Make this module available when building for vendor ramdisk.
480 // On device without a dedicated recovery partition, the module is only
481 // available after switching root into
482 // /first_stage_ramdisk. To expose the module before switching root, install
483 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700484 Vendor_ramdisk_available *bool
485
Jiyong Parkf9332f12018-02-01 00:54:12 +0900486 // Make this module available when building for recovery
487 Recovery_available *bool
488
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200489 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000490 VendorVariantNeeded bool `blueprint:"mutated"`
491 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200492 CoreVariantNeeded bool `blueprint:"mutated"`
493 RamdiskVariantNeeded bool `blueprint:"mutated"`
494 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
495 RecoveryVariantNeeded bool `blueprint:"mutated"`
496
497 // A list of variations for the "image" mutator of the form
498 //<image name> '.' <version char>, for example, 'vendor.S'
499 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900500
501 // Allows this module to use non-APEX version of libraries. Useful
502 // for building binaries that are started before APEXes are activated.
503 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900504
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000505 // Allows this module to be included in CMake release snapshots to be built outside of Android
506 // build system and source tree.
507 Cmake_snapshot_supported *bool
508
Colin Cross1bc94122021-10-28 13:25:54 -0700509 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000510
511 // Set by factories of module types that can only be referenced from variants compiled against
512 // the SDK.
513 AlwaysSdk bool `blueprint:"mutated"`
514
515 // Variant is an SDK variant created by sdkMutator
516 IsSdkVariant bool `blueprint:"mutated"`
517 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
518 // variant to have a ".sdk" suffix.
519 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700520
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800521 Target struct {
522 Platform struct {
523 // List of modules required by the core variant.
524 Required []string `android:"arch_variant"`
525
526 // List of modules not required by the core variant.
527 Exclude_required []string `android:"arch_variant"`
528 } `android:"arch_variant"`
529
530 Recovery struct {
531 // List of modules required by the recovery variant.
532 Required []string `android:"arch_variant"`
533
534 // List of modules not required by the recovery variant.
535 Exclude_required []string `android:"arch_variant"`
536 } `android:"arch_variant"`
537 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700538}
539
540type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900541 // whether this module should be allowed to be directly depended by other
542 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900543 // If set to true, two variants will be built separately, one like
544 // normal, and the other limited to the set of libraries and headers
545 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700546 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900547 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700548 // so it shouldn't have any unversioned runtime dependencies, or
549 // make assumptions about the system that may not be true in the
550 // future.
551 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900552 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900553 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900554 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900555 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900556 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700557 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
558 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900559
Justin Yunebcf0c52021-01-08 18:00:19 +0900560 // This is the same as the "vendor_available" except that the install path
561 // of the vendor variant is /odm or /vendor/odm.
562 // By replacing "vendor_available: true" with "odm_available: true", the
563 // module will install its vendor variant to the /odm partition or /vendor/odm.
564 // As the modules with "odm_available: true" still create the vendor variants,
565 // they can link to the other vendor modules as the vendor_available modules do.
566 // Also, the vendor modules can link to odm_available modules.
567 //
568 // It may not be used for VNDK modules.
569 Odm_available *bool
570
Justin Yun63e9ec72020-10-29 16:49:43 +0900571 // whether this module should be allowed to be directly depended by other
572 // modules with `product_specific: true` or `product_available: true`.
573 // If set to true, an additional product variant will be built separately
574 // that is limited to the set of libraries and headers that are exposed to
575 // /product modules.
576 //
577 // The product variant may be used with a different (newer) /system,
578 // so it shouldn't have any unversioned runtime dependencies, or
579 // make assumptions about the system that may not be true in the
580 // future.
581 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900582 // If set to false, this module becomes inaccessible from /product modules.
583 //
584 // Different from the 'vendor_available' property, the modules with
585 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
586 // library without 'product_available' may not be depended on by any other
587 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900588 //
589 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
590 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
591 Product_available *bool
592
Jiyong Park5fb8c102018-04-09 12:03:06 +0900593 // whether this module is capable of being loaded with other instance
594 // (possibly an older version) of the same module in the same process.
595 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
596 // can be double loaded in a vendor process if the library is also a
597 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
598 // explicitly marked as `double_loadable: true` by the owner, or the dependency
599 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
600 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800601
602 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
603 IsLLNDK bool `blueprint:"mutated"`
604
Colin Cross5271fea2021-04-27 13:06:04 -0700605 // IsVendorPublicLibrary is set for the core and product variants of a library that has
606 // vendor_public_library stubs.
607 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800608}
609
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500610// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
611// to understanding details about the type of the current module.
612// For example, one might call these functions to determine whether the current module is a static
613// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800614type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800615 static() bool
616 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800617 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700618 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800619 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900620 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900621 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900622 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700623 toolchain() config.Toolchain
Jooyung Hanccce2f22020-03-07 03:45:53 +0900624 canUseSdk() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700625 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800626 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900627 minSdkVersion() string
628 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700629 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700630 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800631 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800632 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700633 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900634 inProduct() bool
635 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800636 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700637 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900638 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900639 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700640 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700641 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800642 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000643 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800644 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900645 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800646 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800647 useClangLld(actx ModuleContext) bool
Logan Chiene274fc92019-12-03 11:18:32 -0800648 isForPlatform() bool
Colin Crosse07f2312020-08-13 11:24:56 -0700649 apexVariationName() string
Dan Albertc8060532020-07-22 22:32:17 -0700650 apexSdkVersion() android.ApiLevel
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900651 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700652 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800653 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800654 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800655 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800656 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900657 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000658 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800659}
660
661type SharedFlags struct {
662 numSharedFlags int
663 flagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800664}
665
666type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700667 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800668 ModuleContextIntf
669}
670
671type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700672 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800673 ModuleContextIntf
674}
675
Colin Cross37047f12016-12-13 17:06:13 -0800676type DepsContext interface {
677 android.BottomUpMutatorContext
678 ModuleContextIntf
679}
680
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500681// feature represents additional (optional) steps to building cc-related modules, such as invocation
682// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800683type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800684 flags(ctx ModuleContext, flags Flags) Flags
685 props() []interface{}
686}
687
Joe Onorato37f900c2023-07-18 16:58:16 -0700688// Information returned from Generator about the source code it's generating
689type GeneratedSource struct {
690 IncludeDirs android.Paths
691 Sources android.Paths
692 Headers android.Paths
693 ReexportedDirs android.Paths
694}
695
696// generator allows injection of generated code
697type Generator interface {
698 GeneratorProps() []interface{}
699 GeneratorInit(ctx BaseModuleContext)
700 GeneratorDeps(ctx DepsContext, deps Deps) Deps
701 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
702 GeneratorSources(ctx ModuleContext) GeneratedSource
703 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
704}
705
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500706// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500707// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800708type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700709 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800710 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800711 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700712 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000713 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700714
Colin Cross76fada02016-07-27 10:31:13 -0700715 appendCflags([]string)
716 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700717 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800718}
719
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500720// linker is the interface for a linker decorator object. Individual module types can provide
721// their own implementation for this decorator, and thus specify custom logic regarding build
722// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800723type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700724 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800725 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700726 linkerFlags(ctx ModuleContext, flags Flags) Flags
727 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000728 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800729 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700730
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700731 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700732 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900733 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800734 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700735
736 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900737 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000738
739 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700740 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800741
742 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000743}
744
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500745// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000746type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500747 sharedLibs []string
748 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
749 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700750 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800751}
752
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500753// installer is the interface for an installer helper object. This helper is responsible for
754// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800755type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700756 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700757 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000758 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800759 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700760 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700761 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900762 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000763 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900764 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800765}
766
Inseob Kima1888ce2022-10-04 14:42:02 +0900767type overridable interface {
768 overriddenModules() []string
769}
770
Colin Cross6e511a92020-07-27 21:26:48 -0700771type libraryDependencyKind int
772
773const (
774 headerLibraryDependency = iota
775 sharedLibraryDependency
776 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400777 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700778)
779
780func (k libraryDependencyKind) String() string {
781 switch k {
782 case headerLibraryDependency:
783 return "headerLibraryDependency"
784 case sharedLibraryDependency:
785 return "sharedLibraryDependency"
786 case staticLibraryDependency:
787 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400788 case rlibLibraryDependency:
789 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700790 default:
791 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
792 }
793}
794
795type libraryDependencyOrder int
796
797const (
798 earlyLibraryDependency = -1
799 normalLibraryDependency = 0
800 lateLibraryDependency = 1
801)
802
803func (o libraryDependencyOrder) String() string {
804 switch o {
805 case earlyLibraryDependency:
806 return "earlyLibraryDependency"
807 case normalLibraryDependency:
808 return "normalLibraryDependency"
809 case lateLibraryDependency:
810 return "lateLibraryDependency"
811 default:
812 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
813 }
814}
815
816// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
817// tags that have a set of predefined tag objects that are reused for each dependency, a
818// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
819// That means that comparing a libraryDependencyTag for equality will only be equal if all
820// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
821// then check individual metadata fields instead.
822type libraryDependencyTag struct {
823 blueprint.BaseDependencyTag
824
825 // These are exported so that fmt.Printf("%#v") can call their String methods.
826 Kind libraryDependencyKind
827 Order libraryDependencyOrder
828
829 wholeStatic bool
830
831 reexportFlags bool
832 explicitlyVersioned bool
833 dataLib bool
834 ndk bool
835
836 staticUnwinder bool
837
838 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900839
Cindy Zhou18417cb2020-12-10 07:12:38 -0800840 // Whether or not this dependency should skip the apex dependency check
841 skipApexAllowedDependenciesCheck bool
842
Jiyong Parke3867542020-12-03 17:28:25 +0900843 // Whether or not this dependency has to be followed for the apex variants
844 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900845 // Whether or not this dependency has to be followed for the non-apex variants
846 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000847
848 // If true, don't automatically export symbols from the static library into a shared library.
849 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700850}
851
852// header returns true if the libraryDependencyTag is tagging a header lib dependency.
853func (d libraryDependencyTag) header() bool {
854 return d.Kind == headerLibraryDependency
855}
856
857// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
858func (d libraryDependencyTag) shared() bool {
859 return d.Kind == sharedLibraryDependency
860}
861
862// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
863func (d libraryDependencyTag) static() bool {
864 return d.Kind == staticLibraryDependency
865}
866
Colin Cross65cb3142021-12-10 23:05:02 +0000867func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
868 if d.shared() {
869 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
870 }
871 return nil
872}
873
874var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
875
Colin Crosse9fe2942020-11-10 18:12:15 -0800876// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
877// binaries or other shared libraries are installed as dependencies.
878func (d libraryDependencyTag) InstallDepNeeded() bool {
879 return d.shared()
880}
881
882var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
883
Yu Liu67a28422024-03-05 00:36:31 +0000884func (d libraryDependencyTag) PropagateAconfigValidation() bool {
885 return d.static()
886}
887
888var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
889
Colin Crosse9fe2942020-11-10 18:12:15 -0800890// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700891// libraryDependencyTag. Each tag object is created globally and reused for multiple
892// dependencies (although since the object contains no references, assigning a tag to a
893// variable and modifying it will not modify the original). Users can compare the tag
894// returned by ctx.OtherModuleDependencyTag against the global original
895type dependencyTag struct {
896 blueprint.BaseDependencyTag
897 name string
898}
899
Colin Crosse9fe2942020-11-10 18:12:15 -0800900// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
901// libraryDependencyTag, but where the dependency needs to be installed when the parent is
902// installed.
903type installDependencyTag struct {
904 blueprint.BaseDependencyTag
905 android.InstallAlwaysNeededDependencyTag
906 name string
907}
908
Colin Crossc99deeb2016-04-11 15:06:20 -0700909var (
Colin Cross6e511a92020-07-27 21:26:48 -0700910 genSourceDepTag = dependencyTag{name: "gen source"}
911 genHeaderDepTag = dependencyTag{name: "gen header"}
912 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
913 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900914 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700915 reuseObjTag = dependencyTag{name: "reuse objects"}
916 staticVariantTag = dependencyTag{name: "static variant"}
917 vndkExtDepTag = dependencyTag{name: "vndk extends"}
918 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700919 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800920 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Colin Cross0de8a1e2020-09-18 14:15:30 -0700921 stubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000922 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500923 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400924 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800925 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700926)
927
Roland Levillainf89cd092019-07-29 16:22:59 +0100928func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700929 ccLibDepTag, ok := depTag.(libraryDependencyTag)
930 return ok && ccLibDepTag.shared()
931}
932
933func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
934 ccLibDepTag, ok := depTag.(libraryDependencyTag)
935 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100936}
937
Zach Johnson3df4e632020-11-06 11:56:27 -0800938func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
939 ccLibDepTag, ok := depTag.(libraryDependencyTag)
940 return ok && ccLibDepTag.header()
941}
942
Roland Levillainf89cd092019-07-29 16:22:59 +0100943func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800944 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100945}
946
Colin Crossca860ac2016-01-04 14:34:37 -0800947// Module contains the properties and members used by all C/C++ module types, and implements
948// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500949// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
950// interface.
951//
952// To define a C/C++ related module, construct a new Module object and point its delegates to
953// type-specific structs. These delegates will be invoked to register module-specific build
954// statements which may be unique to the module type. For example, module.compiler.compile() should
955// be defined so as to register build statements which are responsible for compiling the module.
956//
957// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
958// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
959// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
960// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800961type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700962 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700963
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700964 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700965 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700966 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700967
Colin Crossca860ac2016-01-04 14:34:37 -0800968 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +0000969 hod android.HostOrDeviceSupported
970 multilib android.Multilib
971 testModule bool
972 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -0700973
Paul Duffina0843f62019-12-13 19:50:38 +0000974 // Allowable SdkMemberTypes of this module type.
975 sdkMemberTypes []android.SdkMemberType
976
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500977 // decorator delegates, initialize before calling Init
978 // these may contain module-specific implementations, and effectively allow for custom
979 // type-specific logic. These members may reference different objects or the same object.
980 // Functions of these decorators will be invoked to initialize and register type-specific
981 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800982 generators []Generator
983 compiler compiler
984 linker linker
985 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500986
Spandan Dase12d2522023-09-12 21:42:31 +0000987 features []feature
988 stl *stl
989 sanitize *sanitize
990 coverage *coverage
991 fuzzer *fuzzer
992 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +0000993 lto *lto
994 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000995 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -0800996
Colin Cross31076b32020-10-23 17:22:06 -0700997 library libraryInterface
998
Colin Cross635c3b02016-05-18 15:37:25 -0700999 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -08001000
Colin Crossb98c8b02016-07-29 13:44:28 -07001001 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -07001002
Yu Liue70976d2024-10-15 20:45:35 +00001003 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001004
1005 // Flags used to compile this module
1006 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -07001007
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001008 // Shared flags among build rules of this module
1009 sharedFlags SharedFlags
1010
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08001011 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -07001012 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001013
1014 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001015
1016 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001017 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001018
1019 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001020
Inseob Kim37e0bb02024-04-29 15:54:44 +09001021 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001022
1023 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001024
1025 hasAidl bool
1026 hasLex bool
1027 hasProto bool
1028 hasRenderscript bool
1029 hasSysprop bool
1030 hasWinMsg bool
1031 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001032
1033 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001034}
1035
Yu Liu76d94462024-10-31 23:32:36 +00001036func (c *Module) IncrementalSupported() bool {
1037 return c.incremental
1038}
1039
1040var _ blueprint.Incremental = (*Module)(nil)
1041
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001042func (c *Module) AddJSONData(d *map[string]interface{}) {
1043 c.AndroidModuleBase().AddJSONData(d)
1044 (*d)["Cc"] = map[string]interface{}{
1045 "SdkVersion": c.SdkVersion(),
1046 "MinSdkVersion": c.MinSdkVersion(),
1047 "VndkVersion": c.VndkVersion(),
1048 "ProductSpecific": c.ProductSpecific(),
1049 "SocSpecific": c.SocSpecific(),
1050 "DeviceSpecific": c.DeviceSpecific(),
1051 "InProduct": c.InProduct(),
1052 "InVendor": c.InVendor(),
1053 "InRamdisk": c.InRamdisk(),
1054 "InVendorRamdisk": c.InVendorRamdisk(),
1055 "InRecovery": c.InRecovery(),
1056 "VendorAvailable": c.VendorAvailable(),
1057 "ProductAvailable": c.ProductAvailable(),
1058 "RamdiskAvailable": c.RamdiskAvailable(),
1059 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1060 "RecoveryAvailable": c.RecoveryAvailable(),
1061 "OdmAvailable": c.OdmAvailable(),
1062 "InstallInData": c.InstallInData(),
1063 "InstallInRamdisk": c.InstallInRamdisk(),
1064 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1065 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1066 "InstallInRecovery": c.InstallInRecovery(),
1067 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001068 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001069 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1070 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001071 "AidlSrcs": c.hasAidl,
1072 "LexSrcs": c.hasLex,
1073 "ProtoSrcs": c.hasProto,
1074 "RenderscriptSrcs": c.hasRenderscript,
1075 "SyspropSrcs": c.hasSysprop,
1076 "WinMsgSrcs": c.hasWinMsg,
1077 "YaccSrsc": c.hasYacc,
1078 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001079 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001080 }
1081}
1082
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001083func (c *Module) SetPreventInstall() {
1084 c.Properties.PreventInstall = true
1085}
1086
1087func (c *Module) SetHideFromMake() {
1088 c.Properties.HideFromMake = true
1089}
1090
Ivan Lozanod7586b62021-04-01 09:49:36 -04001091func (c *Module) HiddenFromMake() bool {
1092 return c.Properties.HideFromMake
1093}
1094
Cole Fauste8a87832024-09-11 11:35:46 -07001095func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001096 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001097 if c.ImageVariation().Variation == android.CoreVariation {
1098 required = append(required, c.Properties.Target.Platform.Required...)
1099 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1100 } else if c.InRecovery() {
1101 required = append(required, c.Properties.Target.Recovery.Required...)
1102 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1103 }
1104 return android.FirstUniqueStrings(required)
1105}
1106
Ivan Lozano52767be2019-10-18 14:49:46 -07001107func (c *Module) Toc() android.OptionalPath {
1108 if c.linker != nil {
1109 if library, ok := c.linker.(libraryInterface); ok {
1110 return library.toc()
1111 }
1112 }
1113 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1114}
1115
1116func (c *Module) ApiLevel() string {
1117 if c.linker != nil {
1118 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001119 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001120 }
1121 }
1122 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1123}
1124
1125func (c *Module) Static() bool {
1126 if c.linker != nil {
1127 if library, ok := c.linker.(libraryInterface); ok {
1128 return library.static()
1129 }
1130 }
1131 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1132}
1133
1134func (c *Module) Shared() bool {
1135 if c.linker != nil {
1136 if library, ok := c.linker.(libraryInterface); ok {
1137 return library.shared()
1138 }
1139 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001140
Ivan Lozano52767be2019-10-18 14:49:46 -07001141 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1142}
1143
1144func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001145 if c.stl != nil {
1146 return c.stl.Properties.SelectedStl
1147 }
1148 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001149}
1150
Ivan Lozano52767be2019-10-18 14:49:46 -07001151func (c *Module) StubDecorator() bool {
1152 if _, ok := c.linker.(*stubDecorator); ok {
1153 return true
1154 }
1155 return false
1156}
1157
Yi Kong5786f5c2024-05-28 02:22:34 +09001158func (c *Module) OptimizeForSize() bool {
1159 return Bool(c.Properties.Optimize_for_size)
1160}
1161
Ivan Lozano52767be2019-10-18 14:49:46 -07001162func (c *Module) SdkVersion() string {
1163 return String(c.Properties.Sdk_version)
1164}
1165
Artur Satayev480e25b2020-04-27 18:53:18 +01001166func (c *Module) MinSdkVersion() string {
1167 return String(c.Properties.Min_sdk_version)
1168}
1169
Jiyong Park5df7bd32021-08-25 16:18:46 +09001170func (c *Module) isCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001171 if linker, ok := c.linker.(*objectLinker); ok {
1172 return linker.isCrt()
1173 }
1174 return false
1175}
1176
Jiyong Park5df7bd32021-08-25 16:18:46 +09001177func (c *Module) SplitPerApiLevel() bool {
1178 return c.canUseSdk() && c.isCrt()
1179}
1180
Colin Crossc511bc52020-04-07 16:50:32 +00001181func (c *Module) AlwaysSdk() bool {
1182 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1183}
1184
Ivan Lozano183a3212019-10-18 14:18:45 -07001185func (c *Module) CcLibrary() bool {
1186 if c.linker != nil {
1187 if _, ok := c.linker.(*libraryDecorator); ok {
1188 return true
1189 }
Colin Crossd48fe732020-09-23 20:37:24 -07001190 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1191 return true
1192 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001193 }
1194 return false
1195}
1196
1197func (c *Module) CcLibraryInterface() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001198 if _, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001199 return true
1200 }
1201 return false
1202}
1203
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001204func (c *Module) RlibStd() bool {
1205 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1206}
1207
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001208func (c *Module) RustLibraryInterface() bool {
1209 return false
1210}
1211
Ivan Lozano0a468a42024-05-13 21:03:34 -04001212func (c *Module) CrateName() string {
1213 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1214}
1215
1216func (c *Module) ExportedCrateLinkDirs() []string {
1217 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1218}
1219
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001220func (c *Module) IsFuzzModule() bool {
1221 if _, ok := c.compiler.(*fuzzBinary); ok {
1222 return true
1223 }
1224 return false
1225}
1226
1227func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1228 return c.FuzzModule
1229}
1230
1231func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1232 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1233 return fuzzer.fuzzPackagedModule
1234 }
1235 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1236}
1237
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001238func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001239 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1240 return fuzzer.sharedLibraries
1241 }
1242 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1243}
1244
Ivan Lozano2b262972019-11-21 12:30:50 -08001245func (c *Module) NonCcVariants() bool {
1246 return false
1247}
1248
Ivan Lozano183a3212019-10-18 14:18:45 -07001249func (c *Module) SetStatic() {
1250 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001251 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001252 library.setStatic()
1253 return
1254 }
1255 }
1256 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1257}
1258
1259func (c *Module) SetShared() {
1260 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001261 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001262 library.setShared()
1263 return
1264 }
1265 }
1266 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1267}
1268
1269func (c *Module) BuildStaticVariant() bool {
1270 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001271 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001272 return library.buildStatic()
1273 }
1274 }
1275 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1276}
1277
1278func (c *Module) BuildSharedVariant() bool {
1279 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001280 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001281 return library.buildShared()
1282 }
1283 }
1284 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1285}
1286
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001287func (c *Module) BuildRlibVariant() bool {
1288 // cc modules can never build rlib variants
1289 return false
1290}
1291
Ivan Lozano183a3212019-10-18 14:18:45 -07001292func (c *Module) Module() android.Module {
1293 return c
1294}
1295
Jiyong Parkc20eee32018-09-05 22:36:17 +09001296func (c *Module) OutputFile() android.OptionalPath {
1297 return c.outputFile
1298}
1299
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001300func (c *Module) CoverageFiles() android.Paths {
1301 if c.linker != nil {
1302 if library, ok := c.linker.(libraryInterface); ok {
1303 return library.objs().coverageFiles
1304 }
1305 }
1306 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1307}
1308
Ivan Lozano183a3212019-10-18 14:18:45 -07001309var _ LinkableInterface = (*Module)(nil)
1310
Jiyong Park719b4462019-01-13 00:39:51 +09001311func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001312 if c.linker != nil {
1313 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001314 }
1315 return nil
1316}
1317
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001318func (c *Module) CoverageOutputFile() android.OptionalPath {
1319 if c.linker != nil {
1320 return c.linker.coverageOutputFilePath()
1321 }
1322 return android.OptionalPath{}
1323}
1324
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001325func (c *Module) RelativeInstallPath() string {
1326 if c.installer != nil {
1327 return c.installer.relativeInstallPath()
1328 }
1329 return ""
1330}
1331
Jooyung Han344d5432019-08-23 11:17:39 +09001332func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001333 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001334}
1335
Colin Cross36242852017-06-23 15:06:31 -07001336func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001337 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001338 for _, generator := range c.generators {
1339 c.AddProperties(generator.GeneratorProps()...)
1340 }
Colin Crossca860ac2016-01-04 14:34:37 -08001341 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001342 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001343 }
1344 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001345 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001346 }
1347 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001348 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001349 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001350 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001351 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001352 }
Colin Cross16b23492016-01-06 14:41:07 -08001353 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001354 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001355 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001356 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001357 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001358 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001359 if c.fuzzer != nil {
1360 c.AddProperties(c.fuzzer.props()...)
1361 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001362 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001363 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001364 }
Stephen Craneba090d12017-05-09 15:44:35 -07001365 if c.lto != nil {
1366 c.AddProperties(c.lto.props()...)
1367 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001368 if c.afdo != nil {
1369 c.AddProperties(c.afdo.props()...)
1370 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001371 if c.orderfile != nil {
1372 c.AddProperties(c.orderfile.props()...)
1373 }
Colin Crossca860ac2016-01-04 14:34:37 -08001374 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001375 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001376 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001377 // Allow test-only on libraries that are not cc_test_library
1378 if c.library != nil && !c.testLibrary() {
1379 c.AddProperties(&c.sourceProperties)
1380 }
Colin Crossc472d572015-03-17 15:06:21 -07001381
Colin Cross36242852017-06-23 15:06:31 -07001382 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001383 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001384 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001385
Colin Cross36242852017-06-23 15:06:31 -07001386 return c
Colin Crossc472d572015-03-17 15:06:21 -07001387}
1388
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001389// UseVndk() returns true if this module is built against VNDK.
1390// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001391func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001392 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001393}
1394
Colin Crossc511bc52020-04-07 16:50:32 +00001395func (c *Module) canUseSdk() bool {
Colin Cross94e347e2021-01-19 14:56:07 -08001396 return c.Os() == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001397 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001398}
1399
1400func (c *Module) UseSdk() bool {
1401 if c.canUseSdk() {
Colin Cross1348ce32020-10-01 13:37:16 -07001402 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001403 }
1404 return false
1405}
1406
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001407func (c *Module) isCoverageVariant() bool {
1408 return c.coverage.Properties.IsCoverageVariant
1409}
1410
Colin Cross95f1ca02020-10-29 20:47:22 -07001411func (c *Module) IsNdk(config android.Config) bool {
1412 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001413}
1414
Colin Cross127bb8b2020-12-16 16:46:01 -08001415func (c *Module) IsLlndk() bool {
1416 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001417}
1418
Colin Cross1f3f1302021-04-26 18:37:44 -07001419func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001420 lib := moduleLibraryInterface(m)
Colin Cross1f3f1302021-04-26 18:37:44 -07001421 return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001422}
1423
Colin Cross5271fea2021-04-27 13:06:04 -07001424func (m *Module) NeedsVendorPublicLibraryVariants() bool {
1425 lib := moduleLibraryInterface(m)
1426 return lib != nil && (lib.hasVendorPublicLibrary())
1427}
1428
1429// IsVendorPublicLibrary returns true for vendor public libraries.
1430func (c *Module) IsVendorPublicLibrary() bool {
1431 return c.VendorProperties.IsVendorPublicLibrary
1432}
1433
Ivan Lozanof1868af2022-04-12 13:08:36 -04001434func (c *Module) IsVndkPrebuiltLibrary() bool {
1435 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1436 return true
1437 }
1438 return false
1439}
1440
1441func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1442 return c.Properties.SdkAndPlatformVariantVisibleToMake
1443}
1444
Ivan Lozanod7586b62021-04-01 09:49:36 -04001445func (c *Module) HasLlndkStubs() bool {
1446 lib := moduleLibraryInterface(c)
1447 return lib != nil && lib.hasLLNDKStubs()
1448}
1449
1450func (c *Module) StubsVersion() string {
1451 if lib, ok := c.linker.(versionedInterface); ok {
1452 return lib.stubsVersion()
1453 }
1454 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1455}
1456
Colin Cross127bb8b2020-12-16 16:46:01 -08001457// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1458// and does not set llndk.vendor_available: false.
1459func (c *Module) isImplementationForLLNDKPublic() bool {
1460 library, _ := c.library.(*libraryDecorator)
1461 return library != nil && library.hasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001462 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001463}
1464
Colin Cross3513fb12024-01-24 14:44:47 -08001465func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001466 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001467 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001468 }
1469 return false
1470}
1471
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001472func (c *Module) isOrderfileCompile() bool {
1473 if orderfile := c.orderfile; orderfile != nil {
1474 return orderfile.Properties.OrderfileLoad
1475 }
1476 return false
1477}
1478
Yi Kongc702ebd2022-08-19 16:02:45 +08001479func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001480 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001481}
1482
Yi Konged79fa32023-06-04 17:15:42 +09001483func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001484 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001485}
1486
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001487func (c *Module) isNDKStubLibrary() bool {
1488 if _, ok := c.compiler.(*stubDecorator); ok {
1489 return true
1490 }
1491 return false
1492}
1493
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001494func (c *Module) SubName() string {
1495 return c.Properties.SubName
1496}
1497
Jiyong Park25fc6a92018-11-18 18:02:45 +09001498func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001499 if lib := c.library; lib != nil {
1500 return lib.buildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001501 }
1502 return false
1503}
1504
1505func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001506 if lib := c.library; lib != nil {
1507 return lib.hasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001508 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001509 return false
1510}
1511
Alan Stokes73feba32022-11-14 12:21:24 +00001512func (c *Module) IsStubsImplementationRequired() bool {
1513 if lib := c.library; lib != nil {
1514 return lib.isStubsImplementationRequired()
1515 }
1516 return false
1517}
1518
Colin Cross0477b422020-10-13 18:43:54 -07001519// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1520// the implementation. If it is an implementation library it returns its own name.
1521func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1522 name := ctx.OtherModuleName(c)
1523 if versioned, ok := c.linker.(versionedInterface); ok {
1524 name = versioned.implementationModuleName(name)
1525 }
1526 return name
1527}
1528
Martin Stjernholm2856c662020-12-02 15:03:42 +00001529// Similar to ImplementationModuleName, but uses the Make variant of the module
1530// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1531// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1532// under the premise that the prebuilt module overrides its source counterpart
1533// if it is exposed to Make).
1534func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1535 name := c.BaseModuleName()
1536 if versioned, ok := c.linker.(versionedInterface); ok {
1537 name = versioned.implementationModuleName(name)
1538 }
1539 return name
1540}
1541
Jiyong Park7d55b612021-06-11 17:22:09 +09001542func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001543 return Bool(c.Properties.Bootstrap)
1544}
1545
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001546func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001547 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1548 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1549 return false
1550 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001551 return c.linker != nil && c.linker.nativeCoverage()
1552}
1553
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001554func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001555 if p, ok := c.linker.(SnapshotInterface); ok {
1556 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001557 }
1558 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001559}
1560
Jiyong Parkf1194352019-02-25 11:05:47 +09001561func isBionic(name string) bool {
1562 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001563 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001564 return true
1565 }
1566 return false
1567}
1568
Martin Stjernholm279de572019-09-10 23:18:20 +01001569func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001570 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001571 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001572 }
1573 return isBionic(name)
1574}
1575
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001576func (c *Module) isCfiAssemblySupportEnabled() bool {
1577 return c.sanitize != nil &&
1578 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1579}
1580
Inseob Kim800d1142021-06-14 12:03:51 +09001581func (c *Module) InstallInRoot() bool {
1582 return c.installer != nil && c.installer.installInRoot()
1583}
1584
Colin Crossca860ac2016-01-04 14:34:37 -08001585type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001586 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001587 moduleContextImpl
1588}
1589
Colin Cross37047f12016-12-13 17:06:13 -08001590type depsContext struct {
1591 android.BottomUpMutatorContext
1592 moduleContextImpl
1593}
1594
Colin Crossca860ac2016-01-04 14:34:37 -08001595type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001596 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001597 moduleContextImpl
1598}
1599
1600type moduleContextImpl struct {
1601 mod *Module
1602 ctx BaseModuleContext
1603}
1604
Colin Crossb98c8b02016-07-29 13:44:28 -07001605func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001606 return ctx.mod.toolchain(ctx.ctx)
1607}
1608
1609func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001610 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001611}
1612
1613func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001614 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001615}
1616
Colin Cross6a730042024-12-05 13:53:43 -08001617func (ctx *moduleContextImpl) staticLibrary() bool {
1618 return ctx.mod.staticLibrary()
1619}
1620
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001621func (ctx *moduleContextImpl) testBinary() bool {
1622 return ctx.mod.testBinary()
1623}
1624
Yi Kong56fc1b62022-09-06 16:24:00 +08001625func (ctx *moduleContextImpl) testLibrary() bool {
1626 return ctx.mod.testLibrary()
1627}
1628
Jiyong Park1d1119f2019-07-29 21:27:18 +09001629func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001630 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001631}
1632
Inseob Kim7f283f42020-06-01 21:53:49 +09001633func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001634 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001635}
1636
Inseob Kim1042d292020-06-01 23:23:05 +09001637func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001638 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001639}
1640
Yi Kong5786f5c2024-05-28 02:22:34 +09001641func (ctx *moduleContextImpl) optimizeForSize() bool {
1642 return ctx.mod.OptimizeForSize()
1643}
1644
Jooyung Hanccce2f22020-03-07 03:45:53 +09001645func (ctx *moduleContextImpl) canUseSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001646 return ctx.mod.canUseSdk()
Jooyung Hanccce2f22020-03-07 03:45:53 +09001647}
1648
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001649func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001650 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001651}
1652
1653func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001654 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001655 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001656 }
1657 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001658}
1659
Jiyong Parkb35a8192020-08-10 15:59:36 +09001660func (ctx *moduleContextImpl) minSdkVersion() string {
1661 ver := ctx.mod.MinSdkVersion()
1662 if ver == "apex_inherit" && !ctx.isForPlatform() {
1663 ver = ctx.apexSdkVersion().String()
1664 }
1665 if ver == "apex_inherit" || ver == "" {
1666 ver = ctx.sdkVersion()
1667 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001668
1669 if ctx.ctx.Device() {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001670 // When building for vendor/product, use the latest _stable_ API as "current".
1671 // This is passed to clang/aidl compilers so that compiled/generated code works
1672 // with the system.
1673 if (ctx.inVendor() || ctx.inProduct()) && (ver == "" || ver == "current") {
1674 ver = ctx.ctx.Config().PlatformSdkVersion().String()
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001675 }
1676 }
1677
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001678 // For crt objects, the meaning of min_sdk_version is very different from other types of
1679 // module. For them, min_sdk_version defines the oldest version that the build system will
1680 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1681 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1682 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001683 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1684 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1685 // support such an old version. The version is set to the later version in case when the
1686 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1687 // it's for an APEX.
1688 if ctx.mod.isCrt() && !ctx.isSdkVariant() {
1689 if ctx.isForPlatform() {
1690 ver = strconv.Itoa(android.FutureApiLevelInt)
1691 } else { // for apex
1692 ver = ctx.apexSdkVersion().String()
1693 if ver == "" { // in case when min_sdk_version was not set by the APEX
1694 ver = ctx.sdkVersion()
1695 }
1696 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001697 }
1698
Jiyong Parkb35a8192020-08-10 15:59:36 +09001699 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
1700 sdkVersionInt, err := strconv.Atoi(ctx.sdkVersion())
1701 minSdkVersionInt, err2 := strconv.Atoi(ver)
1702 if err == nil && err2 == nil {
1703 if sdkVersionInt < minSdkVersionInt {
1704 return strconv.Itoa(sdkVersionInt)
1705 }
1706 }
1707 return ver
1708}
1709
1710func (ctx *moduleContextImpl) isSdkVariant() bool {
1711 return ctx.mod.IsSdkVariant()
1712}
1713
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001714func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001715 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001716}
Justin Yun8effde42017-06-23 19:24:43 +09001717
Kiyoung Kimaa394802024-01-08 12:55:45 +09001718func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1719 return ctx.mod.InVendorOrProduct()
1720}
1721
Colin Cross95f1ca02020-10-29 20:47:22 -07001722func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1723 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001724}
1725
Colin Cross127bb8b2020-12-16 16:46:01 -08001726func (ctx *moduleContextImpl) IsLlndk() bool {
1727 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001728}
1729
Colin Cross127bb8b2020-12-16 16:46:01 -08001730func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1731 return ctx.mod.isImplementationForLLNDKPublic()
1732}
1733
Colin Cross3513fb12024-01-24 14:44:47 -08001734func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1735 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001736}
1737
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001738func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1739 return ctx.mod.isOrderfileCompile()
1740}
1741
Yi Kongc702ebd2022-08-19 16:02:45 +08001742func (ctx *moduleContextImpl) isCfi() bool {
1743 return ctx.mod.isCfi()
1744}
1745
Yi Konged79fa32023-06-04 17:15:42 +09001746func (ctx *moduleContextImpl) isFuzzer() bool {
1747 return ctx.mod.isFuzzer()
1748}
1749
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001750func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1751 return ctx.mod.isNDKStubLibrary()
1752}
1753
Colin Cross5271fea2021-04-27 13:06:04 -07001754func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1755 return ctx.mod.IsVendorPublicLibrary()
1756}
1757
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001758func (ctx *moduleContextImpl) selectedStl() string {
1759 if stl := ctx.mod.stl; stl != nil {
1760 return stl.Properties.SelectedStl
1761 }
1762 return ""
1763}
1764
Ivan Lozanobd721262018-11-27 14:33:03 -08001765func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1766 return ctx.mod.linker.useClangLld(actx)
1767}
1768
Colin Crossce75d2c2016-10-06 16:12:58 -07001769func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001770 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001771}
1772
Logan Chiene274fc92019-12-03 11:18:32 -08001773func (ctx *moduleContextImpl) isForPlatform() bool {
Colin Crossff694a82023-12-13 15:54:49 -08001774 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1775 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001776}
1777
Colin Crosse07f2312020-08-13 11:24:56 -07001778func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001779 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1780 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001781}
1782
Dan Albertc8060532020-07-22 22:32:17 -07001783func (ctx *moduleContextImpl) apexSdkVersion() android.ApiLevel {
Jooyung Han75568392020-03-20 04:29:24 +09001784 return ctx.mod.apexSdkVersion
Jooyung Hanccce2f22020-03-07 03:45:53 +09001785}
1786
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001787func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001788 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001789}
1790
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001791func (ctx *moduleContextImpl) nativeCoverage() bool {
1792 return ctx.mod.nativeCoverage()
1793}
1794
Colin Cross95b07f22020-12-16 11:06:50 -08001795func (ctx *moduleContextImpl) isPreventInstall() bool {
1796 return ctx.mod.Properties.PreventInstall
1797}
1798
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001799func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1800 shared := &ctx.mod.sharedFlags
1801 if shared.flagsMap == nil {
1802 shared.numSharedFlags = 0
1803 shared.flagsMap = make(map[string]string)
1804 }
1805 return shared
1806}
1807
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001808func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1809 return ctx.mod.isCfiAssemblySupportEnabled()
1810}
1811
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001812func (ctx *moduleContextImpl) notInPlatform() bool {
1813 return ctx.mod.NotInPlatform()
1814}
1815
Yu Liu76d94462024-10-31 23:32:36 +00001816func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1817 if ctx.mod.makeVarsInfo == nil {
1818 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1819 }
1820 return ctx.mod.makeVarsInfo
1821}
1822
Colin Cross635c3b02016-05-18 15:37:25 -07001823func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001824 return &Module{
1825 hod: hod,
1826 multilib: multilib,
1827 }
1828}
1829
Colin Cross635c3b02016-05-18 15:37:25 -07001830func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001831 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001832 module.features = []feature{
1833 &tidyFeature{},
1834 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001835 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001836 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001837 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001838 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001839 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001840 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001841 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001842 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001843 return module
1844}
1845
Colin Crossce75d2c2016-10-06 16:12:58 -07001846func (c *Module) Prebuilt() *android.Prebuilt {
1847 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1848 return p.prebuilt()
1849 }
1850 return nil
1851}
1852
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001853func (c *Module) IsPrebuilt() bool {
1854 return c.Prebuilt() != nil
1855}
1856
Colin Crossce75d2c2016-10-06 16:12:58 -07001857func (c *Module) Name() string {
1858 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001859 if p, ok := c.linker.(interface {
1860 Name(string) string
1861 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001862 name = p.Name(name)
1863 }
1864 return name
1865}
1866
Alex Light3d673592019-01-18 14:37:31 -08001867func (c *Module) Symlinks() []string {
1868 if p, ok := c.installer.(interface {
1869 symlinkList() []string
1870 }); ok {
1871 return p.symlinkList()
1872 }
1873 return nil
1874}
1875
Chris Parsons216e10a2020-07-09 17:12:52 -04001876func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001877 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001878 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001879 }); ok {
1880 return p.dataPaths()
1881 }
1882 return nil
1883}
1884
Ivan Lozanof1868af2022-04-12 13:08:36 -04001885func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001886 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1887 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001888 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001889 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001890 if c.ProductSpecific() {
1891 // If the module is product specific with 'product_specific: true',
1892 // do not add a name suffix because it is a base module.
1893 return ""
1894 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001895 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001896 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001897 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001898 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001899 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001900 // add version suffix only if the module is using different vndk version than the
1901 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001902 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001903 }
1904 return nameSuffix
1905}
1906
Ivan Lozanof1868af2022-04-12 13:08:36 -04001907func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1908 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001909
1910 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001911 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001912 }
1913
Colin Cross127bb8b2020-12-16 16:46:01 -08001914 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001915 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001916 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1917 // added for product variant only when we have vendor and product variants with core
1918 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001919 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001920 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001921 subName += vendorPublicLibrarySuffix
1922 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001923 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1924 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001925 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001926 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001927 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001928 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001929 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001930 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001931 subName += RecoverySuffix
1932 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1933 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001934 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001935 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001936 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001937 } else if c.IsStubs() && c.IsSdkVariant() {
1938 // Public API surface (NDK)
1939 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1940 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001941 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001942
1943 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001944}
1945
Sam Delmerico75dbca22023-04-20 13:13:25 +00001946func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1947 ctx := &moduleContext{
1948 ModuleContext: actx,
1949 moduleContextImpl: moduleContextImpl{
1950 mod: c,
1951 },
1952 }
1953 ctx.ctx = ctx
1954 return ctx
1955}
1956
Spandan Das20fce2d2023-04-12 17:21:39 +00001957// TODO (b/277651159): Remove this allowlist
1958var (
1959 skipStubLibraryMultipleApexViolation = map[string]bool{
1960 "libclang_rt.asan": true,
1961 "libclang_rt.hwasan": true,
1962 // runtime apex
1963 "libc": true,
1964 "libc_hwasan": true,
1965 "libdl_android": true,
1966 "libm": true,
1967 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00001968 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00001969 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01001970 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00001971 "libandroidio": true,
1972 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01001973 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00001974 "libnativebridge": true,
1975 "libnativehelper": true,
1976 "libnativeloader": true,
1977 "libsigchain": true,
1978 }
1979)
1980
1981// Returns true if a stub library could be installed in multiple apexes
1982func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
1983 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08001984 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00001985 return false
1986 }
1987 // If this is not a stub library, no check necessary
1988 if !c.HasStubsVariants() {
1989 return false
1990 }
1991 // Skip the allowlist
1992 // Use BaseModuleName so that this matches prebuilts.
1993 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
1994 return false
1995 }
1996
Spandan Das20fce2d2023-04-12 17:21:39 +00001997 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08001998 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
1999 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00002000 return true
2001 }
2002 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08002003 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00002004 return true
2005 }
2006 // Default: no violation
2007 return false
2008}
2009
Chris Parsons8d6e4332021-02-22 16:13:50 -05002010func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002011 ctx := moduleContextFromAndroidModuleContext(actx, c)
2012
Inseob Kim37e0bb02024-04-29 15:54:44 +09002013 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2014 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2015 Logtags: c.logtagsPaths,
2016 })
2017
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002018 // If Test_only is set on a module in bp file, respect the setting, otherwise
2019 // see if is a known test module type.
2020 testOnly := c.testModule || c.testLibrary()
2021 if c.sourceProperties.Test_only != nil {
2022 testOnly = Bool(c.sourceProperties.Test_only)
2023 }
2024 // Keep before any early returns.
2025 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2026 TestOnly: testOnly,
2027 TopLevelTarget: c.testModule,
2028 })
2029
Ivan Lozanof1868af2022-04-12 13:08:36 -04002030 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002031 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002032 if !apexInfo.IsForPlatform() {
2033 c.hideApexVariantFromMake = true
2034 }
2035
Chris Parsonseefc9e62021-04-02 17:36:47 -04002036 c.makeLinkType = GetMakeLinkType(actx, c)
2037
Colin Crossf18e1102017-11-16 14:33:08 -08002038 deps := c.depsToPaths(ctx)
2039 if ctx.Failed() {
2040 return
2041 }
2042
Joe Onorato37f900c2023-07-18 16:58:16 -07002043 for _, generator := range c.generators {
2044 gen := generator.GeneratorSources(ctx)
2045 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2046 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2047 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2048 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2049 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2050 if len(deps.Objs.objFiles) == 0 {
2051 // If we are reusuing object files (which happens when we're a shared library and we're
2052 // reusing our static variant's object files), then skip adding the actual source files,
2053 // because we already have the object for it.
2054 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2055 }
2056 }
2057
2058 if ctx.Failed() {
2059 return
2060 }
2061
Spandan Das20fce2d2023-04-12 17:21:39 +00002062 if c.stubLibraryMultipleApexViolation(actx) {
2063 actx.PropertyErrorf("apex_available",
2064 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2065 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002066 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2067 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002068 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2069 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002070 }
2071
Colin Crossca860ac2016-01-04 14:34:37 -08002072 flags := Flags{
2073 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002074 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002075 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002076 for _, generator := range c.generators {
2077 flags = generator.GeneratorFlags(ctx, flags, deps)
2078 }
Colin Crossca860ac2016-01-04 14:34:37 -08002079 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002080 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002081 }
2082 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002083 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002084 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002085 if c.stl != nil {
2086 flags = c.stl.flags(ctx, flags)
2087 }
Colin Cross16b23492016-01-06 14:41:07 -08002088 if c.sanitize != nil {
2089 flags = c.sanitize.flags(ctx, flags)
2090 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002091 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002092 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002093 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002094 if c.fuzzer != nil {
2095 flags = c.fuzzer.flags(ctx, flags)
2096 }
Stephen Craneba090d12017-05-09 15:44:35 -07002097 if c.lto != nil {
2098 flags = c.lto.flags(ctx, flags)
2099 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002100 if c.afdo != nil {
2101 flags = c.afdo.flags(ctx, flags)
2102 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002103 if c.orderfile != nil {
2104 flags = c.orderfile.flags(ctx, flags)
2105 }
Colin Crossca860ac2016-01-04 14:34:37 -08002106 for _, feature := range c.features {
2107 flags = feature.flags(ctx, flags)
2108 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002109 if ctx.Failed() {
2110 return
2111 }
2112
Colin Cross4af21ed2019-11-04 09:37:55 -08002113 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2114 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2115 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002116
Colin Cross4af21ed2019-11-04 09:37:55 -08002117 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002118
2119 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002120 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002121 }
2122 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002123 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002124 }
2125
Colin Cross3e5e7782022-06-17 22:17:05 +00002126 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2127
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002128 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002129 // We need access to all the flags seen by a source file.
2130 if c.sabi != nil {
2131 flags = c.sabi.flags(ctx, flags)
2132 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002133
Colin Cross4af21ed2019-11-04 09:37:55 -08002134 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002135
Joe Onorato37f900c2023-07-18 16:58:16 -07002136 for _, generator := range c.generators {
2137 generator.GeneratorBuildActions(ctx, flags, deps)
2138 }
2139
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002140 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002141 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002142 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002143 if ctx.Failed() {
2144 return
2145 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002146 }
2147
Colin Crossca860ac2016-01-04 14:34:37 -08002148 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002149 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002150 if ctx.Failed() {
2151 return
2152 }
Colin Cross635c3b02016-05-18 15:37:25 -07002153 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002154
Chris Parsons94a0bba2021-06-04 15:03:47 -04002155 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002156
2157 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2158 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2159 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002160 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002161
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002162 if Bool(c.Properties.Cmake_snapshot_supported) {
2163 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2164 }
2165
Chris Parsons94a0bba2021-06-04 15:03:47 -04002166 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002167
2168 if c.linker != nil {
2169 moduleInfoJSON := ctx.ModuleInfoJSON()
2170 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2171 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2172 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2173 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2174 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2175
2176 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2177 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2178 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2179 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2180
2181 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2182 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2183 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2184 moduleInfoJSON.SubName += ".cfi"
2185 }
2186 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2187 moduleInfoJSON.SubName += ".hwasan"
2188 }
2189 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2190 moduleInfoJSON.SubName += ".scs"
2191 }
2192 }
2193 moduleInfoJSON.SubName += c.Properties.SubName
2194
2195 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2196 moduleInfoJSON.Uninstallable = true
2197 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002198 }
Wei Lia1aa2972024-06-21 13:08:51 -07002199
2200 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002201
Cole Faust96a692b2024-08-08 14:47:51 -07002202 if b, ok := c.compiler.(*baseCompiler); ok {
2203 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2204 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2205 c.hasProto = b.hasSrcExt(ctx, ".proto")
2206 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2207 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2208 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2209 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2210 }
2211
Yu Liuec7043d2024-11-05 18:22:20 +00002212 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002213 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002214 }
2215 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002216 ccObjectInfo.ObjFiles = objs.objFiles
2217 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002218 }
Yu Liu4f825132024-12-18 00:35:39 +00002219 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002220 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2221 }
2222
Yu Liu8024b922024-12-20 23:31:32 +00002223 linkableInfo := CreateCommonLinkableInfo(c)
2224 if lib, ok := c.linker.(versionedInterface); ok {
2225 linkableInfo.StubsVersion = lib.stubsVersion()
2226 }
2227 if c.linker != nil {
2228 if library, ok := c.linker.(libraryInterface); ok {
2229 linkableInfo.Static = library.static()
Yu Liu8a8d5b42025-01-07 00:48:08 +00002230 linkableInfo.Shared = library.shared()
Yu Liu8024b922024-12-20 23:31:32 +00002231 linkableInfo.CoverageFiles = library.objs().coverageFiles
2232 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2233 }
2234 }
2235 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002236
Yu Liu323d77a2024-12-16 23:13:57 +00002237 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002238 IsPrebuilt: c.IsPrebuilt(),
2239 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
2240 }
2241 if c.compiler != nil {
2242 ccInfo.CompilerInfo = &CompilerInfo{
2243 Srcs: c.compiler.(CompiledInterface).Srcs(),
2244 Cflags: c.compiler.baseCompilerProps().Cflags,
2245 AidlInterfaceInfo: AidlInterfaceInfo{
2246 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2247 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2248 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2249 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2250 },
2251 }
2252 switch decorator := c.compiler.(type) {
2253 case *libraryDecorator:
2254 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002255 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs,
Yu Liu323d77a2024-12-16 23:13:57 +00002256 }
2257 }
2258 }
2259 if c.linker != nil {
2260 ccInfo.LinkerInfo = &LinkerInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002261 WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs,
2262 StaticLibs: c.linker.baseLinkerProps().Static_libs,
2263 SharedLibs: c.linker.baseLinkerProps().Shared_libs,
2264 HeaderLibs: c.linker.baseLinkerProps().Header_libs,
Yu Liu323d77a2024-12-16 23:13:57 +00002265 }
2266 switch decorator := c.linker.(type) {
2267 case *binaryDecorator:
2268 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2269 case *libraryDecorator:
Yu Liu116610a2025-01-06 21:54:48 +00002270 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
2271 InjectBsslHash: Bool(c.linker.(*libraryDecorator).Properties.Inject_bssl_hash),
2272 }
Yu Liu323d77a2024-12-16 23:13:57 +00002273 case *testBinary:
2274 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2275 Gtest: decorator.testDecorator.gtest(),
2276 }
2277 case *benchmarkDecorator:
2278 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2279 case *objectLinker:
2280 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{}
Yu Liu8a8d5b42025-01-07 00:48:08 +00002281 case *stubDecorator:
2282 ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{}
Yu Liu323d77a2024-12-16 23:13:57 +00002283 }
Yu Liu8024b922024-12-20 23:31:32 +00002284
2285 if s, ok := c.linker.(SnapshotInterface); ok {
2286 ccInfo.SnapshotInfo = &SnapshotInfo{
2287 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2288 }
Yu Liuffe86322024-12-18 18:53:12 +00002289 }
2290 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002291 if c.library != nil {
2292 ccInfo.LibraryInfo = &LibraryInfo{
2293 BuildStubs: c.library.buildStubs(),
2294 }
2295 }
Yu Liu8024b922024-12-20 23:31:32 +00002296 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002297
mrziwangabdb2932024-06-18 12:43:41 -07002298 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002299
2300 if c.makeVarsInfo != nil {
2301 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2302 }
mrziwangabdb2932024-06-18 12:43:41 -07002303}
2304
Yu Liu8024b922024-12-20 23:31:32 +00002305func CreateCommonLinkableInfo(mod LinkableInterface) *LinkableInfo {
2306 return &LinkableInfo{
2307 StaticExecutable: mod.StaticExecutable(),
2308 HasStubsVariants: mod.HasStubsVariants(),
2309 OutputFile: mod.OutputFile(),
2310 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
2311 IsStubs: mod.IsStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002312 CcLibrary: mod.CcLibrary(),
Yu Liu8024b922024-12-20 23:31:32 +00002313 CcLibraryInterface: mod.CcLibraryInterface(),
2314 RustLibraryInterface: mod.RustLibraryInterface(),
2315 BaseModuleName: mod.BaseModuleName(),
2316 IsLlndk: mod.IsLlndk(),
2317 HasNonSystemVariants: mod.HasNonSystemVariants(),
2318 SubName: mod.SubName(),
2319 InVendorOrProduct: mod.InVendorOrProduct(),
2320 InRamdisk: mod.InRamdisk(),
2321 OnlyInRamdisk: mod.OnlyInRamdisk(),
2322 InVendorRamdisk: mod.InVendorRamdisk(),
2323 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2324 InRecovery: mod.InRecovery(),
2325 OnlyInRecovery: mod.OnlyInRecovery(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002326 Installable: mod.Installable(),
Yu Liu97880e12025-01-07 19:03:34 +00002327 RelativeInstallPath: mod.RelativeInstallPath(),
Yu Liu8024b922024-12-20 23:31:32 +00002328 }
2329}
2330
Yu Liuec7043d2024-11-05 18:22:20 +00002331func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2332 if len(files) > 0 {
2333 ctx.SetOutputFiles(files, tag)
2334 }
2335}
2336
mrziwangabdb2932024-06-18 12:43:41 -07002337func (c *Module) setOutputFiles(ctx ModuleContext) {
2338 if c.outputFile.Valid() {
2339 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2340 } else {
2341 ctx.SetOutputFiles(android.Paths{}, "")
2342 }
2343 if c.linker != nil {
2344 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2345 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2346 }
Wei Lia1aa2972024-06-21 13:08:51 -07002347}
2348
2349func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2350 // Dump metadata that can not be done in android/compliance-metadata.go
2351 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
2352 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2353 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2354
2355 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002356 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002357 staticDepNames := make([]string, 0, len(staticDeps))
2358 for _, dep := range staticDeps {
2359 staticDepNames = append(staticDepNames, dep.Name())
2360 }
2361
2362 staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2363 for _, dep := range deps.StaticLibs {
2364 staticDepPaths = append(staticDepPaths, dep.String())
2365 }
2366 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2367 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2368
2369 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002370 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002371 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2372 for _, dep := range wholeStaticDeps {
2373 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2374 }
2375
2376 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2377 for _, dep := range deps.WholeStaticLibs {
2378 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2379 }
2380 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2381 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002382}
2383
2384func (c *Module) maybeUnhideFromMake() {
2385 // If a lib is directly included in any of the APEXes or is not available to the
2386 // platform (which is often the case when the stub is provided as a prebuilt),
2387 // unhide the stubs variant having the latest version gets visible to make. In
2388 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2389 // force anything in the make world to link against the stubs library. (unless it
2390 // is explicitly referenced via .bootstrap suffix or the module is marked with
2391 // 'bootstrap: true').
2392 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002393 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002394 c.IsStubs() && !c.InVendorRamdisk() {
2395 c.Properties.HideFromMake = false // unhide
2396 // Note: this is still non-installable
2397 }
2398}
2399
Colin Cross8ff10582023-12-07 13:10:56 -08002400// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2401// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002402func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002403 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002404 // If the module has been specifically configure to not be installed then
2405 // hide from make as otherwise it will break when running inside make
2406 // as the output path to install will not be specified. Not all uninstallable
2407 // modules can be hidden from make as some are needed for resolving make side
2408 // dependencies.
2409 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002410 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002411 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002412 c.SkipInstall()
2413 }
2414
2415 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2416 // to allow using the outputs in a genrule.
2417 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002418 c.installer.install(ctx, c.outputFile.Path())
2419 if ctx.Failed() {
2420 return
Colin Crossca860ac2016-01-04 14:34:37 -08002421 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002422 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002423}
2424
Colin Cross0ea8ba82019-06-06 14:33:29 -07002425func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002426 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002427 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002428 }
Colin Crossca860ac2016-01-04 14:34:37 -08002429 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002430}
2431
Colin Crossca860ac2016-01-04 14:34:37 -08002432func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002433 for _, generator := range c.generators {
2434 generator.GeneratorInit(ctx)
2435 }
Colin Crossca860ac2016-01-04 14:34:37 -08002436 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002437 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002438 }
Colin Crossca860ac2016-01-04 14:34:37 -08002439 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002440 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002441 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002442 if c.stl != nil {
2443 c.stl.begin(ctx)
2444 }
Colin Cross16b23492016-01-06 14:41:07 -08002445 if c.sanitize != nil {
2446 c.sanitize.begin(ctx)
2447 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002448 if c.coverage != nil {
2449 c.coverage.begin(ctx)
2450 }
Yi Kong9723e332023-12-04 14:52:53 +09002451 if c.afdo != nil {
2452 c.afdo.begin(ctx)
2453 }
Stephen Craneba090d12017-05-09 15:44:35 -07002454 if c.lto != nil {
2455 c.lto.begin(ctx)
2456 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002457 if c.orderfile != nil {
2458 c.orderfile.begin(ctx)
2459 }
Dan Albert92fe7402020-07-15 13:33:30 -07002460 if ctx.useSdk() && c.IsSdkVariant() {
Dan Albert1a246272020-07-06 14:49:35 -07002461 version, err := nativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002462 if err != nil {
2463 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002464 c.Properties.Sdk_version = nil
2465 } else {
2466 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002467 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002468 }
Colin Crossca860ac2016-01-04 14:34:37 -08002469}
2470
Colin Cross37047f12016-12-13 17:06:13 -08002471func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002472 deps := Deps{}
2473
Joe Onorato37f900c2023-07-18 16:58:16 -07002474 for _, generator := range c.generators {
2475 deps = generator.GeneratorDeps(ctx, deps)
2476 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002477 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002478 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002479 }
2480 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002481 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002482 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002483 if c.stl != nil {
2484 deps = c.stl.deps(ctx, deps)
2485 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002486 if c.coverage != nil {
2487 deps = c.coverage.deps(ctx, deps)
2488 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002489
Colin Crossb6715442017-10-24 11:13:31 -07002490 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2491 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2492 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2493 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2494 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2495 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002496 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002497 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002498
Colin Cross516c5452024-10-28 13:45:21 -07002499 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2500 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2501 }
2502
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002503 for _, lib := range deps.ReexportSharedLibHeaders {
2504 if !inList(lib, deps.SharedLibs) {
2505 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2506 }
2507 }
2508
2509 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002510 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2511 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 -07002512 }
2513 }
2514
Colin Cross5950f382016-12-13 12:50:57 -08002515 for _, lib := range deps.ReexportHeaderLibHeaders {
2516 if !inList(lib, deps.HeaderLibs) {
2517 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2518 }
2519 }
2520
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002521 for _, gen := range deps.ReexportGeneratedHeaders {
2522 if !inList(gen, deps.GeneratedHeaders) {
2523 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2524 }
2525 }
2526
Colin Crossc99deeb2016-04-11 15:06:20 -07002527 return deps
2528}
2529
Colin Cross516c5452024-10-28 13:45:21 -07002530func checkConflictingExplicitVersions(libs []string) error {
2531 withoutVersion := func(s string) string {
2532 name, _ := StubsLibNameAndVersion(s)
2533 return name
2534 }
2535 var errs []error
2536 for i, lib := range libs {
2537 libName := withoutVersion(lib)
2538 libsToCompare := libs[i+1:]
2539 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2540 return withoutVersion(s) == libName
2541 })
2542 if j >= 0 {
2543 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2544 lib, libsToCompare[j]))
2545 }
2546 }
2547 return errors.Join(errs...)
2548}
2549
Dan Albert7e9d2952016-08-04 13:02:36 -07002550func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002551 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002552 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002553 moduleContextImpl: moduleContextImpl{
2554 mod: c,
2555 },
2556 }
2557 ctx.ctx = ctx
2558
Colin Crossca860ac2016-01-04 14:34:37 -08002559 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002560}
2561
Jiyong Park7ed9de32018-10-15 22:25:07 +09002562// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002563func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002564 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2565 version := name[sharp+1:]
2566 libname := name[:sharp]
2567 return libname, version
2568 }
2569 return name, ""
2570}
2571
Dan Albert92fe7402020-07-15 13:33:30 -07002572func GetCrtVariations(ctx android.BottomUpMutatorContext,
2573 m LinkableInterface) []blueprint.Variation {
2574 if ctx.Os() != android.Android {
2575 return nil
2576 }
2577 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002578 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2579 minSdkVersion := m.MinSdkVersion()
2580 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2581 minSdkVersion = m.SdkVersion()
2582 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002583 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2584 if err != nil {
2585 ctx.PropertyErrorf("min_sdk_version", err.Error())
2586 }
Colin Cross363ec762023-01-13 13:45:14 -08002587
2588 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002589 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002590 if apiLevel.LessThan(minApiForArch) {
2591 apiLevel = minApiForArch
2592 }
2593
Dan Albert92fe7402020-07-15 13:33:30 -07002594 return []blueprint.Variation{
2595 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002596 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002597 }
2598 }
2599 return []blueprint.Variation{
2600 {Mutator: "sdk", Variation: ""},
2601 }
2602}
2603
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002604func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2605 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002606
2607 variations = append([]blueprint.Variation(nil), variations...)
2608
Liz Kammer23942242022-04-08 15:41:00 -04002609 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002610 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002611 if version == "impl" {
2612 version = ""
2613 }
Colin Crosse7257d22020-09-24 09:56:18 -07002614 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002615 if tag, ok := depTag.(libraryDependencyTag); ok {
2616 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002617 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2618 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2619 // the modified copy to depTag.
2620 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002621 } else {
2622 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2623 }
Colin Crosse7257d22020-09-24 09:56:18 -07002624 }
Colin Crosse7257d22020-09-24 09:56:18 -07002625
Colin Cross0de8a1e2020-09-18 14:15:30 -07002626 if far {
2627 ctx.AddFarVariationDependencies(variations, depTag, name)
2628 } else {
2629 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002630 }
2631}
2632
Kiyoung Kim487689e2022-07-26 09:48:22 +09002633func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2634 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002635 return snapshot
2636 }
2637
2638 return lib
2639}
2640
Kiyoung Kim37693d02024-04-04 09:56:15 +09002641// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002642// of names:
2643//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002644// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002645//
2646// For each of these, it adds the name of the ndk_library module to the list of
2647// variant libs.
2648//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002649// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002650//
2651// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002652//
2653// The caller can then know to add the variantLibs dependencies differently from the
2654// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002655func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002656 variantLibs = []string{}
2657
2658 nonvariantLibs = []string{}
2659 for _, entry := range list {
2660 // strip #version suffix out
2661 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002662 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002663 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002664 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002665 nonvariantLibs = append(nonvariantLibs, entry)
2666 }
2667 }
2668 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002669
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002670}
2671
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002672func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2673 nonVariantLibs := []string{}
2674 variantLibs := []string{}
2675
2676 for _, lib := range libs {
2677 replaceLibName := GetReplaceModuleName(lib, replaceList)
2678 if replaceLibName == lib {
2679 // Do not handle any libs which are not in API imports
2680 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2681 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2682 variantLibs = append(variantLibs, replaceLibName)
2683 } else {
2684 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2685 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002686 }
2687
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002688 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002689}
2690
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002691func (c *Module) shouldUseApiSurface() bool {
2692 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2693 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2694 // LLNDK Variant
2695 return true
2696 }
2697
2698 if c.Properties.IsSdkVariant {
2699 // NDK Variant
2700 return true
2701 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002702 }
2703
2704 return false
2705}
2706
Colin Cross1e676be2016-10-12 14:38:15 -07002707func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002708 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002709 return
2710 }
2711
Colin Cross37047f12016-12-13 17:06:13 -08002712 ctx := &depsContext{
2713 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002714 moduleContextImpl: moduleContextImpl{
2715 mod: c,
2716 },
2717 }
2718 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002719
Colin Crossc99deeb2016-04-11 15:06:20 -07002720 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002721
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002722 apiNdkLibs := []string{}
2723 apiLateNdkLibs := []string{}
2724
Yo Chiang219968c2020-09-22 18:45:04 +08002725 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2726
Dan Albert914449f2016-06-17 16:45:24 -07002727 variantNdkLibs := []string{}
2728 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002729 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002730 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2731 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2732 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002733 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002734
Colin Cross32ec36c2016-12-15 07:39:51 -08002735 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002736 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002737 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002738 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002739 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002740
Spandan Das73bcafc2022-08-18 23:26:00 +00002741 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002742 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2743 if variationExists {
2744 actx.AddVariationDependencies(nil, depTag, lib)
2745 } else {
2746 // dependencies to ndk_headers fall here as ndk_headers do not have
2747 // any variants.
2748 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2749 }
Spandan Dasff665182024-09-11 18:48:44 +00002750 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002751 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002752 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002753 } else {
2754 actx.AddVariationDependencies(nil, depTag, lib)
2755 }
2756 }
2757
Dan Albertf1d14c72020-07-30 14:32:55 -07002758 if c.isNDKStubLibrary() {
2759 // NDK stubs depend on their implementation because the ABI dumps are
2760 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002761
Spandan Das8b08aea2023-03-14 19:29:34 +00002762 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2763 c.ImageVariation(),
2764 blueprint.Variation{Mutator: "link", Variation: "shared"},
2765 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002766 }
2767
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002768 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2769 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2770 c.Target().NativeBridge == android.NativeBridgeDisabled {
2771 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002772 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002773 llndkHeaderLibTag,
2774 deps.LlndkHeaderLibs...)
2775 }
2776
Jiyong Park5d1598f2019-02-25 22:14:17 +09002777 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002778 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002779
Jiyong Park5d1598f2019-02-25 22:14:17 +09002780 actx.AddVariationDependencies([]blueprint.Variation{
2781 {Mutator: "link", Variation: "static"},
2782 }, depTag, lib)
2783 }
2784
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002785 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002786 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002787 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002788
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002789 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002790 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002791 }
Jiyong Parke3867542020-12-03 17:28:25 +09002792 if inList(lib, deps.ExcludeLibsForApex) {
2793 depTag.excludeInApex = true
2794 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002795 actx.AddVariationDependencies([]blueprint.Variation{
2796 {Mutator: "link", Variation: "static"},
2797 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002798 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002799
Jooyung Han75568392020-03-20 04:29:24 +09002800 // staticUnwinderDep is treated as staticDep for Q apexes
2801 // so that native libraries/binaries are linked with static unwinder
2802 // because Q libc doesn't have unwinder APIs
2803 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002804 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002805 actx.AddVariationDependencies([]blueprint.Variation{
2806 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002807 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002808 }
2809
Jiyong Park7ed9de32018-10-15 22:25:07 +09002810 // shared lib names without the #version suffix
2811 var sharedLibNames []string
2812
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002813 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002814 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002815 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002816 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002817 }
Jiyong Parke3867542020-12-03 17:28:25 +09002818 if inList(lib, deps.ExcludeLibsForApex) {
2819 depTag.excludeInApex = true
2820 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002821 if inList(lib, deps.ExcludeLibsForNonApex) {
2822 depTag.excludeInNonApex = true
2823 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002824
Jiyong Park73c54ee2019-10-22 20:31:18 +09002825 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002826 sharedLibNames = append(sharedLibNames, name)
2827
Colin Crosse7257d22020-09-24 09:56:18 -07002828 variations := []blueprint.Variation{
2829 {Mutator: "link", Variation: "shared"},
2830 }
Spandan Dasff665182024-09-11 18:48:44 +00002831 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002832 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002833
Colin Crossfe9acfe2021-06-14 16:13:03 -07002834 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002835 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002836 actx.AddVariationDependencies([]blueprint.Variation{
2837 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002838 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002839 }
2840
Colin Cross3e5e7782022-06-17 22:17:05 +00002841 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002842 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002843 actx.AddVariationDependencies([]blueprint.Variation{
2844 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002845 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002846 }
2847
Jiyong Park7ed9de32018-10-15 22:25:07 +09002848 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002849 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002850 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2851 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2852 // linking against both the stubs lib and the non-stubs lib at the same time.
2853 continue
2854 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002855 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002856 variations := []blueprint.Variation{
2857 {Mutator: "link", Variation: "shared"},
2858 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002859 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002860 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002861
Dan Willemsen59339a22018-07-22 21:18:45 -07002862 actx.AddVariationDependencies([]blueprint.Variation{
2863 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002864 }, dataLibDepTag, deps.DataLibs...)
2865
Colin Crossc8caa062021-09-24 16:50:14 -07002866 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2867
Chris Parsons79d66a52020-06-05 17:26:16 -04002868 actx.AddVariationDependencies([]blueprint.Variation{
2869 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002870 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002871
Colin Cross68861832016-07-08 10:41:41 -07002872 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002873
2874 for _, gen := range deps.GeneratedHeaders {
2875 depTag := genHeaderDepTag
2876 if inList(gen, deps.ReexportGeneratedHeaders) {
2877 depTag = genHeaderExportDepTag
2878 }
2879 actx.AddDependency(c, depTag, gen)
2880 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002881
Cole Faust65cb40a2024-10-21 15:41:42 -07002882 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2883 depTag := genHeaderDepTag
2884 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2885 }
2886
Dan Albert92fe7402020-07-15 13:33:30 -07002887 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002888 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002889 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002890 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002891 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002892 }
Colin Crossc465efd2021-06-11 18:00:04 -07002893 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002894 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002895 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002896 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002897 if deps.DynamicLinker != "" {
2898 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002899 }
Dan Albert914449f2016-06-17 16:45:24 -07002900
2901 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002902
Colin Cross8acea3e2024-12-12 14:53:30 -08002903 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002904 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002905 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002906 {Mutator: "link", Variation: "shared"},
2907 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002908 actx.AddVariationDependencies([]blueprint.Variation{
2909 {Mutator: "version", Variation: version},
2910 {Mutator: "link", Variation: "shared"},
2911 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002912
Colin Cross8acea3e2024-12-12 14:53:30 -08002913 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002914 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002915 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002916 {Mutator: "link", Variation: "shared"},
2917 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002918 actx.AddVariationDependencies([]blueprint.Variation{
2919 {Mutator: "version", Variation: version},
2920 {Mutator: "link", Variation: "shared"},
2921 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002922
Vinh Tran367d89d2023-04-28 11:21:25 -04002923 if len(deps.AidlLibs) > 0 {
2924 actx.AddDependency(
2925 c,
2926 aidlLibraryTag,
2927 deps.AidlLibs...,
2928 )
2929 }
2930
Colin Cross6362e272015-10-29 15:25:03 -07002931}
Colin Cross21b9a242015-03-24 14:15:58 -07002932
Colin Crosse40b4ea2018-10-02 22:25:58 -07002933func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002934 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002935 c.beginMutator(ctx)
2936 }
2937}
2938
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002939// Whether a module can link to another module, taking into
2940// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09002941func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07002942 tag blueprint.DependencyTag) {
2943
2944 switch t := tag.(type) {
2945 case dependencyTag:
2946 if t != vndkExtDepTag {
2947 return
2948 }
2949 case libraryDependencyTag:
2950 default:
2951 return
2952 }
2953
Ivan Lozanof9e21722020-12-02 09:00:51 -05002954 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002955 // Host code is not restricted
2956 return
2957 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002958
Ivan Lozano52767be2019-10-18 14:49:46 -07002959 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002960 // Platform code can link to anything
2961 return
2962 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08002963 if from.InRamdisk() {
2964 // Ramdisk code is not NDK
2965 return
2966 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002967 if from.InVendorRamdisk() {
2968 // Vendor ramdisk code is not NDK
2969 return
2970 }
Ivan Lozano52767be2019-10-18 14:49:46 -07002971 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09002972 // Recovery code is not NDK
2973 return
2974 }
Colin Cross31076b32020-10-23 17:22:06 -07002975 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07002976 if c.StubDecorator() {
2977 // These aren't real libraries, but are the stub shared libraries that are included in
2978 // the NDK.
2979 return
2980 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002981 }
Logan Chien834b9a62019-01-14 15:39:03 +08002982
Ivan Lozano52767be2019-10-18 14:49:46 -07002983 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08002984 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
2985 // to link to libc++ (non-NDK and without sdk_version).
2986 return
2987 }
2988
Ivan Lozano52767be2019-10-18 14:49:46 -07002989 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002990 // NDK code linking to platform code is never okay.
2991 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07002992 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08002993 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002994 }
2995
2996 // At this point we know we have two NDK libraries, but we need to
2997 // check that we're not linking against anything built against a higher
2998 // API level, as it is only valid to link against older or equivalent
2999 // APIs.
3000
Inseob Kim01a28722018-04-11 09:48:45 +09003001 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003002 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003003 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003004 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003005 // Current can't be linked against by anything else.
3006 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003007 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003008 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003009 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003010 if err != nil {
3011 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003012 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003013 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003014 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003015 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003016 if err != nil {
3017 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003018 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003019 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003020 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003021
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003022 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003023 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003024 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003025 }
3026 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003027 }
Dan Albert202fe492017-12-15 13:56:59 -08003028
3029 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003030 fromStl := from.SelectedStl()
3031 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003032 if fromStl == "" || toStl == "" {
3033 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003034 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003035 // We can be permissive with the system "STL" since it is only the C++
3036 // ABI layer, but in the future we should make sure that everyone is
3037 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003038 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003039 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003040 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3041 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003042 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003043}
3044
Jooyung Han479ca172020-10-19 18:51:07 +09003045func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3046 if c, ok := ctx.Module().(*Module); ok {
3047 ctx.VisitDirectDeps(func(dep android.Module) {
3048 depTag := ctx.OtherModuleDependencyTag(dep)
3049 ccDep, ok := dep.(LinkableInterface)
3050 if ok {
3051 checkLinkType(ctx, c, ccDep, depTag)
3052 }
3053 })
3054 }
3055}
3056
Jiyong Park5fb8c102018-04-09 12:03:06 +09003057// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003058// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3059// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003060// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003061func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003062 check := func(child, parent android.Module) bool {
3063 to, ok := child.(*Module)
3064 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003065 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003066 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003067
Jooyung Hana70f0672019-01-18 15:20:43 +09003068 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3069 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003070 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003071
Jiyong Park0474e1f2021-01-14 14:26:06 +09003072 // These dependencies are not excercised at runtime. Tracking these will give us
3073 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003074 depTag := ctx.OtherModuleDependencyTag(child)
3075 if IsHeaderDepTag(depTag) {
3076 return false
3077 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003078 if depTag == staticVariantTag {
3079 return false
3080 }
3081 if depTag == stubImplDepTag {
3082 return false
3083 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003084 if depTag == android.RequiredDepTag {
3085 return false
3086 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003087
Justin Yun63e9ec72020-10-29 16:49:43 +09003088 // Even if target lib has no vendor variant, keep checking dependency
3089 // graph in case it depends on vendor_available or product_available
3090 // but not double_loadable transtively.
3091 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003092 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003093 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003094
Jiyong Park0474e1f2021-01-14 14:26:06 +09003095 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3096 // one.
3097 if Bool(to.VendorProperties.Double_loadable) {
3098 return true
3099 }
3100
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003101 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003102 return false
3103 }
3104
Jooyung Hana70f0672019-01-18 15:20:43 +09003105 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3106 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003107 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003108 return false
3109 }
3110 if module, ok := ctx.Module().(*Module); ok {
3111 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003112 if lib.hasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003113 ctx.WalkDeps(check)
3114 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003115 }
3116 }
3117}
3118
Yu Liue4312402023-01-18 09:15:31 -08003119func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3120 // For the dependency from platform to apex, use the latest stubs
3121 apexSdkVersion := android.FutureApiLevel
3122 if !apexInfo.IsForPlatform() {
3123 apexSdkVersion = apexInfo.MinSdkVersion
3124 }
3125
3126 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3127 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3128 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3129 // (b/144430859)
3130 apexSdkVersion = android.FutureApiLevel
3131 }
3132
3133 return apexSdkVersion
3134}
3135
Colin Crossc99deeb2016-04-11 15:06:20 -07003136// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003137func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003138 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003139
Colin Cross0de8a1e2020-09-18 14:15:30 -07003140 var directStaticDeps []StaticLibraryInfo
3141 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003142
Colin Cross0de8a1e2020-09-18 14:15:30 -07003143 reexportExporter := func(exporter FlagExporterInfo) {
3144 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3145 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3146 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3147 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3148 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003149 }
3150
Colin Crossff694a82023-12-13 15:54:49 -08003151 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003152 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003153
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003154 skipModuleList := map[string]bool{}
3155
Yu Liu8024b922024-12-20 23:31:32 +00003156 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003157 depName := ctx.OtherModuleName(dep)
3158 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003159
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003160 if _, ok := skipModuleList[depName]; ok {
3161 // skip this module because original module or API imported module matching with this should be used instead.
3162 return
3163 }
3164
Yu Liu8024b922024-12-20 23:31:32 +00003165 var ccInfo *CcInfo
3166 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3167 if hasCcInfo {
3168 ccInfo = v
3169 }
3170 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003171 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003172 if !hasCcInfo {
3173 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3174 }
3175 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003176 return
3177 }
3178
Vinh Tran367d89d2023-04-28 11:21:25 -04003179 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003180 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003181 depPaths.AidlLibraryInfos = append(
3182 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003183 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003184 )
3185 }
3186 }
3187
Yu Liu8024b922024-12-20 23:31:32 +00003188 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003189 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003190 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003191 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003192 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003193 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003194 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003195 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003196 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003197 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003198 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003199 // Support exported headers from a generated_sources dependency
3200 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003201 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003202 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003203 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003204 genRule.GeneratedDeps...)
3205 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003206 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003207 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003208 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003209 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003210 genRule.GeneratedSourceFiles...)
3211 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003212 // 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 +09003213 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003214 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003215 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003216 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003217 }
Colin Crosscef792e2021-06-11 18:01:26 -07003218 case CrtBeginDepTag:
3219 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3220 case CrtEndDepTag:
3221 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003222 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003223 return
3224 }
3225
Colin Crossfe17f6f2019-03-28 19:30:56 -07003226 if depTag == android.ProtoPluginDepTag {
3227 return
3228 }
3229
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003230 if depTag == android.RequiredDepTag {
3231 return
3232 }
3233
Yu Liu8024b922024-12-20 23:31:32 +00003234 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3235 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003236 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 -07003237 return
3238 }
Yu Liu8024b922024-12-20 23:31:32 +00003239 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003240 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003241 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003242 return
3243 }
3244
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003245 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003246 // Skip reused objects for stub libraries, they use their own stub object file instead.
3247 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3248 // version mutator, so the stubs variant is created from the shared variant that
3249 // already has the reuseObjTag dependency on the static variant.
Colin Cross31076b32020-10-23 17:22:06 -07003250 if !c.library.buildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003251 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003252 objs := staticAnalogue.ReuseObjects
3253 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003254 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003255 reexportExporter(depExporterInfo)
3256 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003257 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003258 }
3259
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003260 if depTag == llndkHeaderLibTag {
3261 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3262 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3263 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3264 }
3265
Yu Liu8024b922024-12-20 23:31:32 +00003266 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003267
3268 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3269 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003270 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003271 return
3272 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003273
Jiyong Parke3867542020-12-03 17:28:25 +09003274 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3275 return
3276 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003277 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3278 return
3279 }
Jiyong Parke3867542020-12-03 17:28:25 +09003280
Colin Cross313aa542023-12-13 13:47:44 -08003281 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003282
Colin Cross6e511a92020-07-27 21:26:48 -07003283 var ptr *android.Paths
3284 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003285
Colin Cross6e511a92020-07-27 21:26:48 -07003286 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003287
Colin Cross6e511a92020-07-27 21:26:48 -07003288 switch {
3289 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003290 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003291 if !ctx.Config().AllowMissingDependencies() {
3292 ctx.ModuleErrorf("module %q is not a header library", depName)
3293 } else {
3294 ctx.AddMissingDependencies([]string{depName})
3295 }
3296 return
3297 }
Colin Cross6e511a92020-07-27 21:26:48 -07003298 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003299 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003300 if !ctx.Config().AllowMissingDependencies() {
3301 ctx.ModuleErrorf("module %q is not a shared library", depName)
3302 } else {
3303 ctx.AddMissingDependencies([]string{depName})
3304 }
3305 return
3306 }
Jiyong Parke3867542020-12-03 17:28:25 +09003307
Jiyong Park7d55b612021-06-11 17:22:09 +09003308 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3309 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003310
Jiyong Park1ad8e162020-12-01 23:40:09 +09003311 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3312 // linkFile, depFile, and ptr.
3313 if c.IsStubs() {
3314 break
3315 }
3316
Colin Cross0de8a1e2020-09-18 14:15:30 -07003317 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3318 depFile = sharedLibraryInfo.TableOfContents
3319
Colin Crossb614cd42024-10-11 12:52:21 -07003320 if !sharedLibraryInfo.IsStubs {
3321 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3322 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3323 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3324 }
3325 }
3326
Colin Cross6e511a92020-07-27 21:26:48 -07003327 ptr = &depPaths.SharedLibs
3328 switch libDepTag.Order {
3329 case earlyLibraryDependency:
3330 ptr = &depPaths.EarlySharedLibs
3331 depPtr = &depPaths.EarlySharedLibsDeps
3332 case normalLibraryDependency:
3333 ptr = &depPaths.SharedLibs
3334 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003335 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003336 case lateLibraryDependency:
3337 ptr = &depPaths.LateSharedLibs
3338 depPtr = &depPaths.LateSharedLibsDeps
3339 default:
3340 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003341 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003342
Colin Cross6e511a92020-07-27 21:26:48 -07003343 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003344 if linkableInfo.RustLibraryInterface {
3345 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003346 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3347 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3348 if libDepTag.wholeStatic {
3349 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3350 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003351
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003352 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3353 // exported functions from the rust generated staticlib still exported.
3354 if c.CcLibrary() && c.Shared() {
3355 c.WholeRustStaticlib = true
3356 }
Colin Cross6e511a92020-07-27 21:26:48 -07003357 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003358
Colin Cross6e511a92020-07-27 21:26:48 -07003359 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003360 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3361 if !isStaticLib {
3362 if !ctx.Config().AllowMissingDependencies() {
3363 ctx.ModuleErrorf("module %q is not a static library", depName)
3364 } else {
3365 ctx.AddMissingDependencies([]string{depName})
3366 }
3367 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003368 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003369
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003370 // Stubs lib doesn't link to the static lib dependencies. Don't set
3371 // linkFile, depFile, and ptr.
3372 if c.IsStubs() {
3373 break
3374 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003375
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003376 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3377 if libDepTag.wholeStatic {
3378 ptr = &depPaths.WholeStaticLibs
3379 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3380 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3381 } else {
3382 // This case normally catches prebuilt static
3383 // libraries, but it can also occur when
3384 // AllowMissingDependencies is on and the
3385 // dependencies has no sources of its own
3386 // but has a whole_static_libs dependency
3387 // on a missing library. We want to depend
3388 // on the .a file so that there is something
3389 // in the dependency tree that contains the
3390 // error rule for the missing transitive
3391 // dependency.
3392 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3393 }
3394 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3395 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3396 } else {
3397 switch libDepTag.Order {
3398 case earlyLibraryDependency:
3399 panic(fmt.Errorf("early static libs not supported"))
3400 case normalLibraryDependency:
3401 // static dependencies will be handled separately so they can be ordered
3402 // using transitive dependencies.
3403 ptr = nil
3404 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3405 case lateLibraryDependency:
3406 ptr = &depPaths.LateStaticLibs
3407 default:
3408 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3409 }
3410 }
3411
3412 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3413 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3414
3415 if libDepTag.unexportedSymbols {
3416 depPaths.LdFlags = append(depPaths.LdFlags,
3417 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3418 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003419 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003420 }
3421
Yu Liu8024b922024-12-20 23:31:32 +00003422 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3423 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003424 ctx.ModuleErrorf("module %q not a static library", depName)
3425 return
3426 }
Logan Chien43d34c32017-12-20 01:17:32 +08003427
Colin Cross6e511a92020-07-27 21:26:48 -07003428 // When combining coverage files for shared libraries and executables, coverage files
3429 // in static libraries act as if they were whole static libraries. The same goes for
3430 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003431 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003432 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003433 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003434 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003435 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003436 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003437 // Handle non-CC modules here
3438 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003439 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003440 }
3441 }
3442
Colin Cross6e511a92020-07-27 21:26:48 -07003443 if ptr != nil {
3444 if !linkFile.Valid() {
3445 if !ctx.Config().AllowMissingDependencies() {
3446 ctx.ModuleErrorf("module %q missing output file", depName)
3447 } else {
3448 ctx.AddMissingDependencies([]string{depName})
3449 }
3450 return
3451 }
3452 *ptr = append(*ptr, linkFile.Path())
3453 }
3454
3455 if depPtr != nil {
3456 dep := depFile
3457 if !dep.Valid() {
3458 dep = linkFile
3459 }
3460 *depPtr = append(*depPtr, dep.Path())
3461 }
3462
Colin Cross0de8a1e2020-09-18 14:15:30 -07003463 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3464 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3465 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3466 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003467 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3468
3469 // Only re-export RustRlibDeps for cc static libs
3470 if c.static() {
3471 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3472 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003473
3474 if libDepTag.reexportFlags {
3475 reexportExporter(depExporterInfo)
3476 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3477 // Re-exported shared library headers must be included as well since they can help us with type information
3478 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003479 c.sabi.Properties.ReexportedIncludes = append(
3480 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003481 c.sabi.Properties.ReexportedSystemIncludes = append(
3482 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003483 }
3484
Yu Liu8024b922024-12-20 23:31:32 +00003485 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003486 switch {
3487 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003488 c.Properties.AndroidMkHeaderLibs = append(
3489 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003490 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003491 // Note: the order of libs in this list is not important because
3492 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003493 c.Properties.AndroidMkSharedLibs = append(
3494 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003495 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003496 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003497 if libDepTag.wholeStatic {
3498 c.Properties.AndroidMkWholeStaticLibs = append(
3499 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3500 } else {
3501 c.Properties.AndroidMkStaticLibs = append(
3502 c.Properties.AndroidMkStaticLibs, makeLibName)
3503 }
Colin Cross6e511a92020-07-27 21:26:48 -07003504 }
3505 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003506 } else if !c.IsStubs() {
3507 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3508
Colin Cross6e511a92020-07-27 21:26:48 -07003509 switch depTag {
3510 case runtimeDepTag:
3511 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu8024b922024-12-20 23:31:32 +00003512 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003513 case objDepTag:
3514 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3515 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003516 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003517 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003518 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003519 case dynamicLinkerDepTag:
3520 depPaths.DynamicLinker = linkFile
3521 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003522 }
Colin Crossca860ac2016-01-04 14:34:37 -08003523 })
3524
Jeff Gaston294356f2017-09-27 17:05:30 -07003525 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003526 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3527 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3528 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003529
Colin Crossdd84e052017-05-17 13:44:16 -07003530 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003531 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003532 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3533 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003534 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003535 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3536
Jiyong Park74955042019-10-22 20:19:51 +09003537 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3538 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003539 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003540 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003541 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003542 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003543
3544 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003545 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003546 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003547 }
Colin Crossdd84e052017-05-17 13:44:16 -07003548
Colin Crossca860ac2016-01-04 14:34:37 -08003549 return depPaths
3550}
3551
Spandan Das10c41362024-12-03 01:33:09 +00003552func ShouldUseStubForApex(ctx android.ModuleContext, parent, dep android.Module) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003553 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003554 bootstrap := false
Spandan Das10c41362024-12-03 01:33:09 +00003555 if linkable, ok := parent.(LinkableInterface); !ok {
3556 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
Jiyong Park7d55b612021-06-11 17:22:09 +09003557 } else {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003558 inVendorOrProduct = linkable.InVendorOrProduct()
Jiyong Park7d55b612021-06-11 17:22:09 +09003559 bootstrap = linkable.Bootstrap()
3560 }
3561
Spandan Das10c41362024-12-03 01:33:09 +00003562 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003563
3564 useStubs := false
3565
Yu Liu8024b922024-12-20 23:31:32 +00003566 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003567 if !apexInfo.IsForPlatform() {
3568 // For platform libraries, use current version of LLNDK
3569 // If this is for use_vendor apex we will apply the same rules
3570 // of apex sdk enforcement below to choose right version.
3571 useStubs = true
3572 }
3573 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3574 // If not building for APEX or the containing APEX allows the use of
3575 // platform APIs, use stubs only when it is from an APEX (and not from
3576 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3577 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003578 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003579
Spandan Dasff665182024-09-11 18:48:44 +00003580 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003581 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003582 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3583 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003584 }
3585
3586 return useStubs
3587}
3588
3589// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3590// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3591// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3592// has different level of updatability. For example, if a library foo in an APEX depends on a
3593// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3594// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3595// same APEX as foo, the non-stub variant of bar is used.
3596func ChooseStubOrImpl(ctx android.ModuleContext, dep android.Module) (SharedLibraryInfo, FlagExporterInfo) {
3597 depTag := ctx.OtherModuleDependencyTag(dep)
3598 libDepTag, ok := depTag.(libraryDependencyTag)
3599 if !ok || !libDepTag.shared() {
3600 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3601 }
3602
Colin Cross313aa542023-12-13 13:47:44 -08003603 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3604 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3605 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003606
3607 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003608 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003609 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003610 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3611 toUse := stubs[len(stubs)-1]
3612 sharedLibraryInfo = toUse.SharedLibraryInfo
3613 depExporterInfo = toUse.FlagExporterInfo
3614 }
3615 }
3616 return sharedLibraryInfo, depExporterInfo
3617}
3618
Colin Cross0de8a1e2020-09-18 14:15:30 -07003619// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3620// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003621// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003622// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003623func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3624 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003625 var staticPaths android.Paths
3626 for _, staticDep := range staticDeps {
3627 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3628 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3629 }
3630 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003631 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003632 }
3633 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3634
3635 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3636
3637 // reorder the dependencies based on transitive dependencies
3638 staticPaths = android.FirstUniquePaths(staticPaths)
3639 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3640
3641 if len(orderedStaticPaths) != len(staticPaths) {
3642 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3643 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3644 }
3645
3646 return orderedStaticPaths, transitiveStaticLibs
3647}
3648
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003649// BaseLibName trims known prefixes and suffixes
3650func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003651 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3652 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003653 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003654 return libName
3655}
3656
Yu Liu8024b922024-12-20 23:31:32 +00003657func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003658 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003659 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3660 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003661
Yu Liu8024b922024-12-20 23:31:32 +00003662 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003663 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003664 if ccInfo.SnapshotInfo != nil {
3665 return linkableInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003666 }
3667 }
3668
Yu Liu8024b922024-12-20 23:31:32 +00003669 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003670 // The vendor and product modules in Make will have been renamed to not conflict with the
3671 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003672 return libName + linkableInfo.SubName
3673 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003674 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003675 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003676 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003677 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003678 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003679 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003680 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003681 } else {
3682 return libName
3683 }
3684}
3685
Colin Crossca860ac2016-01-04 14:34:37 -08003686func (c *Module) InstallInData() bool {
3687 if c.installer == nil {
3688 return false
3689 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003690 return c.installer.inData()
3691}
3692
3693func (c *Module) InstallInSanitizerDir() bool {
3694 if c.installer == nil {
3695 return false
3696 }
3697 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003698 return true
3699 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003700 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003701}
3702
Yifan Hong1b3348d2020-01-21 15:53:22 -08003703func (c *Module) InstallInRamdisk() bool {
3704 return c.InRamdisk()
3705}
3706
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003707func (c *Module) InstallInVendorRamdisk() bool {
3708 return c.InVendorRamdisk()
3709}
3710
Jiyong Parkf9332f12018-02-01 00:54:12 +09003711func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003712 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003713}
3714
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003715func (c *Module) MakeUninstallable() {
3716 if c.installer == nil {
3717 c.ModuleBase.MakeUninstallable()
3718 return
3719 }
3720 c.installer.makeUninstallable(c)
3721}
3722
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003723func (c *Module) HostToolPath() android.OptionalPath {
3724 if c.installer == nil {
3725 return android.OptionalPath{}
3726 }
3727 return c.installer.hostToolPath()
3728}
3729
Nan Zhangd4e641b2017-07-12 12:55:28 -07003730func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3731 return c.outputFile
3732}
3733
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003734func (c *Module) static() bool {
3735 if static, ok := c.linker.(interface {
3736 static() bool
3737 }); ok {
3738 return static.static()
3739 }
3740 return false
3741}
3742
Colin Cross6a730042024-12-05 13:53:43 -08003743func (c *Module) staticLibrary() bool {
3744 if static, ok := c.linker.(interface {
3745 staticLibrary() bool
3746 }); ok {
3747 return static.staticLibrary()
3748 }
3749 return false
3750}
3751
Jiyong Park379de2f2018-12-19 02:47:14 +09003752func (c *Module) staticBinary() bool {
3753 if static, ok := c.linker.(interface {
3754 staticBinary() bool
3755 }); ok {
3756 return static.staticBinary()
3757 }
3758 return false
3759}
3760
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003761func (c *Module) testBinary() bool {
3762 if test, ok := c.linker.(interface {
3763 testBinary() bool
3764 }); ok {
3765 return test.testBinary()
3766 }
3767 return false
3768}
3769
Jingwen Chen537242c2022-08-24 11:53:27 +00003770func (c *Module) testLibrary() bool {
3771 if test, ok := c.linker.(interface {
3772 testLibrary() bool
3773 }); ok {
3774 return test.testLibrary()
3775 }
3776 return false
3777}
3778
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003779func (c *Module) benchmarkBinary() bool {
3780 if b, ok := c.linker.(interface {
3781 benchmarkBinary() bool
3782 }); ok {
3783 return b.benchmarkBinary()
3784 }
3785 return false
3786}
3787
3788func (c *Module) fuzzBinary() bool {
3789 if f, ok := c.linker.(interface {
3790 fuzzBinary() bool
3791 }); ok {
3792 return f.fuzzBinary()
3793 }
3794 return false
3795}
3796
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003797// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3798func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003799 if h, ok := c.linker.(interface {
3800 header() bool
3801 }); ok {
3802 return h.header()
3803 }
3804 return false
3805}
3806
Ivan Lozanod7586b62021-04-01 09:49:36 -04003807func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003808 if b, ok := c.linker.(interface {
3809 binary() bool
3810 }); ok {
3811 return b.binary()
3812 }
3813 return false
3814}
3815
Justin Yun5e035862021-06-29 20:50:37 +09003816func (c *Module) StaticExecutable() bool {
3817 if b, ok := c.linker.(*binaryDecorator); ok {
3818 return b.static()
3819 }
3820 return false
3821}
3822
Ivan Lozanod7586b62021-04-01 09:49:36 -04003823func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003824 if o, ok := c.linker.(interface {
3825 object() bool
3826 }); ok {
3827 return o.object()
3828 }
3829 return false
3830}
3831
Kiyoung Kim37693d02024-04-04 09:56:15 +09003832func (m *Module) Dylib() bool {
3833 return false
3834}
3835
3836func (m *Module) Rlib() bool {
3837 return false
3838}
3839
Ivan Lozanof9e21722020-12-02 09:00:51 -05003840func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003841 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003842 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003843 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003844 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003845 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003846 return "native:product"
3847 }
Jooyung Han38002912019-05-16 04:01:54 +09003848 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003849 } else if c.InRamdisk() {
3850 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003851 } else if c.InVendorRamdisk() {
3852 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003853 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003854 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003855 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003856 return "native:ndk:none:none"
3857 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3858 //family, link := getNdkStlFamilyAndLinkType(c)
3859 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3860 } else {
3861 return "native:platform"
3862 }
3863}
3864
Jiyong Park9d452992018-10-03 00:38:19 +09003865// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003866// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003867func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003868 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003869 // Stub libs and prebuilt libs in a versioned SDK are not
3870 // installable to APEX even though they are shared libs.
Paul Duffin458a15b2022-11-25 12:18:24 +00003871 return lib.shared() && !lib.buildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003872 }
3873 return false
3874}
3875
Jiyong Parka90ca002019-10-07 15:47:24 +09003876func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003877 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3878}
3879
3880func (c *Module) ApexAvailableFor() []string {
3881 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003882 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003883 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003884 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003885 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003886 }
Yu Liub73c3a62024-12-10 00:58:06 +00003887
3888 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003889}
3890
Paul Duffin0cb37b92020-03-04 14:52:46 +00003891func (c *Module) EverInstallable() bool {
3892 return c.installer != nil &&
3893 // Check to see whether the module is actually ever installable.
3894 c.installer.everInstallable()
3895}
3896
Ivan Lozanod7586b62021-04-01 09:49:36 -04003897func (c *Module) PreventInstall() bool {
3898 return c.Properties.PreventInstall
3899}
3900
3901func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003902 if c.library != nil {
3903 if i := c.library.installable(); i != nil {
3904 return i
3905 }
3906 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003907 return c.Properties.Installable
3908}
3909
3910func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003911 ret := c.EverInstallable() &&
3912 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003913 proptools.BoolDefault(c.Installable(), true) &&
3914 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003915
3916 // The platform variant doesn't need further condition. Apex variants however might not
3917 // be installable because it will likely to be included in the APEX and won't appear
3918 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003919 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003920 return ret
3921 }
3922
3923 // Special case for modules that are configured to be installed to /data, which includes
3924 // test modules. For these modules, both APEX and non-APEX variants are considered as
3925 // installable. This is because even the APEX variants won't be included in the APEX, but
3926 // will anyway be installed to /data/*.
3927 // See b/146995717
3928 if c.InstallInData() {
3929 return ret
3930 }
3931
3932 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09003933}
3934
Logan Chien41eabe62019-04-10 13:33:58 +08003935func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
3936 if c.linker != nil {
3937 if library, ok := c.linker.(*libraryDecorator); ok {
3938 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
3939 }
3940 }
3941}
3942
Jiyong Park45bf82e2020-12-15 22:29:02 +09003943var _ android.ApexModule = (*Module)(nil)
3944
3945// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003946func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossc1b36442021-05-06 13:42:48 -07003947 if depTag == stubImplDepTag {
3948 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09003949 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003950 }
Jiyong Park12177fc2021-01-05 14:37:15 +09003951 if depTag == staticVariantTag {
3952 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
3953 // actually mean that the static lib (and its dependencies) are copied into the
3954 // APEX.
3955 return false
3956 }
Colin Cross8acea3e2024-12-12 14:53:30 -08003957
3958 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
3959 if isLibDepTag && c.static() && libDepTag.shared() {
3960 // shared_lib dependency from a static lib is considered as crossing
3961 // the APEX boundary because the dependency doesn't actually is
3962 // linked; the dependency is used only during the compilation phase.
3963 return false
3964 }
3965
3966 if isLibDepTag && libDepTag.excludeInApex {
3967 return false
3968 }
3969
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09003970 return true
3971}
3972
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003973func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003974 if c.HasStubsVariants() {
3975 if IsSharedDepTag(depTag) {
3976 // dynamic dep to a stubs lib crosses APEX boundary
3977 return false
3978 }
3979 if IsRuntimeDepTag(depTag) {
3980 // runtime dep to a stubs lib also crosses APEX boundary
3981 return false
3982 }
3983 if IsHeaderDepTag(depTag) {
3984 return false
3985 }
3986 }
3987 if c.IsLlndk() {
3988 return false
3989 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08003990
3991 return true
3992}
3993
Jiyong Park45bf82e2020-12-15 22:29:02 +09003994// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07003995func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
3996 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09003997 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
3998 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
3999 return nil
4000 }
Jooyung Han749dc692020-04-15 11:03:39 +09004001 // We don't check for prebuilt modules
4002 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4003 return nil
4004 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004005
Jooyung Han749dc692020-04-15 11:03:39 +09004006 minSdkVersion := c.MinSdkVersion()
4007 if minSdkVersion == "apex_inherit" {
4008 return nil
4009 }
4010 if minSdkVersion == "" {
4011 // JNI libs within APK-in-APEX fall into here
4012 // Those are okay to set sdk_version instead
4013 // We don't have to check if this is a SDK variant because
4014 // non-SDK variant resets sdk_version, which works too.
4015 minSdkVersion = c.SdkVersion()
4016 }
Dan Albertc8060532020-07-22 22:32:17 -07004017 if minSdkVersion == "" {
4018 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4019 }
4020 // Not using nativeApiLevelFromUser because the context here is not
4021 // necessarily a native context.
4022 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004023 if err != nil {
4024 return err
4025 }
Dan Albertc8060532020-07-22 22:32:17 -07004026
Colin Cross8ca61c12022-10-06 21:00:14 -07004027 // A dependency only needs to support a min_sdk_version at least
4028 // as high as the api level that the architecture was introduced in.
4029 // This allows introducing new architectures in the platform that
4030 // need to be included in apexes that normally require an older
4031 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004032 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004033 if sdkVersion.LessThan(minApiForArch) {
4034 sdkVersion = minApiForArch
4035 }
4036
Dan Albertc8060532020-07-22 22:32:17 -07004037 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004038 return fmt.Errorf("newer SDK(%v)", ver)
4039 }
4040 return nil
4041}
4042
Paul Duffinb5769c12021-05-12 16:16:51 +01004043// Implements android.ApexModule
4044func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4045 // stub libraries and native bridge libraries are always available to platform
4046 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4047}
4048
Inseob Kima1888ce2022-10-04 14:42:02 +09004049func (c *Module) overriddenModules() []string {
4050 if o, ok := c.linker.(overridable); ok {
4051 return o.overriddenModules()
4052 }
4053 return nil
4054}
4055
Liz Kammer35ca77e2021-12-22 15:31:40 -05004056type moduleType int
4057
4058const (
4059 unknownType moduleType = iota
4060 binary
4061 object
4062 fullLibrary
4063 staticLibrary
4064 sharedLibrary
4065 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004066 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004067 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004068)
4069
4070func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004071 if c.testBinary() {
4072 // testBinary is also a binary, so this comes before the c.Binary()
4073 // conditional. A testBinary has additional implicit dependencies and
4074 // other test-only semantics.
4075 return testBin
4076 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004077 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004078 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004079 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004080 } else if c.testLibrary() {
4081 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4082 // will let them add implicit compile deps on gtest, for example.
4083 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004084 // For now, treat them as regular libraries.
4085 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004086 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004087 static := false
4088 shared := false
4089 if library, ok := c.linker.(*libraryDecorator); ok {
4090 static = library.MutatedProperties.BuildStatic
4091 shared = library.MutatedProperties.BuildShared
4092 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4093 static = library.MutatedProperties.BuildStatic
4094 shared = library.MutatedProperties.BuildShared
4095 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004096 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004097 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004098 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004099 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004100 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004101 return staticLibrary
4102 }
4103 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004104 } else if c.isNDKStubLibrary() {
4105 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004106 }
4107 return unknownType
4108}
4109
Colin Crosscfad1192015-11-02 16:43:11 -08004110// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004111type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004112 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004113 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004114 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004115}
4116
Patrice Arrudac249c712019-03-19 17:00:29 -07004117// cc_defaults provides a set of properties that can be inherited by other cc
4118// modules. A module can use the properties from a cc_defaults using
4119// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4120// merged (when possible) by prepending the default module's values to the
4121// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004122func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004123 return DefaultsFactory()
4124}
4125
Colin Cross36242852017-06-23 15:06:31 -07004126func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004127 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004128
Colin Cross36242852017-06-23 15:06:31 -07004129 module.AddProperties(props...)
4130 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004131 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004132 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004133 &BaseCompilerProperties{},
4134 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004135 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004136 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004137 &StaticProperties{},
4138 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004139 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004140 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004141 &TestLinkerProperties{},
4142 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004143 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004144 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004145 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004146 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004147 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004148 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004149 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004150 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004151 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004152 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004153 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004154 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004155 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004156 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004157 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4158 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004159 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004160 )
Colin Crosscfad1192015-11-02 16:43:11 -08004161
Jooyung Hancc372c52019-09-25 15:18:44 +09004162 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004163
4164 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004165}
4166
Jiyong Park2286afd2020-06-16 21:58:53 +09004167func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004168 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004169}
4170
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004171func kytheExtractAllFactory() android.Singleton {
4172 return &kytheExtractAllSingleton{}
4173}
4174
4175type kytheExtractAllSingleton struct {
4176}
4177
4178func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4179 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004180 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004181 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004182 if len(files) > 0 {
4183 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004184 }
4185 })
4186 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4187 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004188 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004189 }
4190}
4191
Jihoon Kangf78a8902022-09-01 22:47:07 +00004192func (c *Module) Partition() string {
4193 if p, ok := c.installer.(interface {
4194 getPartition() string
4195 }); ok {
4196 return p.getPartition()
4197 }
4198 return ""
4199}
4200
Spandan Das2b6dfb52024-01-19 00:22:22 +00004201type sourceModuleName interface {
4202 sourceModuleName() string
4203}
4204
4205func (c *Module) BaseModuleName() string {
4206 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4207 // if the prebuilt module sets a source_module_name in Android.bp, use that
4208 return smn.sourceModuleName()
4209 }
4210 return c.ModuleBase.BaseModuleName()
4211}
4212
Spandan Dase20c56c2024-07-23 21:34:24 +00004213func (c *Module) stubsSymbolFilePath() android.Path {
4214 if library, ok := c.linker.(*libraryDecorator); ok {
4215 return library.stubsSymbolFilePath
4216 }
4217 return android.OptionalPath{}.Path()
4218}
4219
Colin Cross06a931b2015-10-28 17:23:31 -07004220var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004221var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004222var BoolPtr = proptools.BoolPtr
4223var String = proptools.String
4224var StringPtr = proptools.StringPtr