blob: 7122bcee63b2bbadfeb0f2734261d8a626bef207 [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.
Cole Faustc9b88c92025-02-06 17:58:26 -080069 Cflags []string
Yu Liu323d77a2024-12-16 23:13:57 +000070 AidlInterfaceInfo AidlInterfaceInfo
71 LibraryDecoratorInfo *LibraryDecoratorInfo
72}
73
74type LinkerInfo struct {
Cole Faustc9b88c92025-02-06 17:58:26 -080075 WholeStaticLibs []string
Yu Liu323d77a2024-12-16 23:13:57 +000076 // list of modules that should be statically linked into this module.
Cole Faustc9b88c92025-02-06 17:58:26 -080077 StaticLibs []string
Yu Liu323d77a2024-12-16 23:13:57 +000078 // list of modules that should be dynamically linked into this module.
Cole Faustc9b88c92025-02-06 17:58:26 -080079 SharedLibs []string
Yu Liu323d77a2024-12-16 23:13:57 +000080 // list of modules that should only provide headers for this module.
Cole Faustc9b88c92025-02-06 17:58:26 -080081 HeaderLibs []string
Yu Liu68a70b72025-01-08 22:54:44 +000082 ImplementationModuleName *string
Yu Liu323d77a2024-12-16 23:13:57 +000083
84 BinaryDecoratorInfo *BinaryDecoratorInfo
85 LibraryDecoratorInfo *LibraryDecoratorInfo
86 TestBinaryInfo *TestBinaryInfo
87 BenchmarkDecoratorInfo *BenchmarkDecoratorInfo
88 ObjectLinkerInfo *ObjectLinkerInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +000089 StubDecoratorInfo *StubDecoratorInfo
Yu Liu323d77a2024-12-16 23:13:57 +000090}
91
92type BinaryDecoratorInfo struct{}
93type LibraryDecoratorInfo struct {
Cole Faustc9b88c92025-02-06 17:58:26 -080094 ExportIncludeDirs []string
Yu Liu116610a2025-01-06 21:54:48 +000095 InjectBsslHash bool
Yu Liu95cef3a2025-02-25 00:54:20 +000096 // Location of the static library in the sysroot. Empty if the library is
97 // not included in the NDK.
98 NdkSysrootPath android.Path
Yu Liu323d77a2024-12-16 23:13:57 +000099}
Yu Liuffe86322024-12-18 18:53:12 +0000100
Yu Liu8024b922024-12-20 23:31:32 +0000101type SnapshotInfo struct {
102 SnapshotAndroidMkSuffix string
Yu Liuffe86322024-12-18 18:53:12 +0000103}
104
Yu Liu323d77a2024-12-16 23:13:57 +0000105type TestBinaryInfo struct {
106 Gtest bool
107}
108type BenchmarkDecoratorInfo struct{}
Yu Liu8a8d5b42025-01-07 00:48:08 +0000109
Yu Liu2a815b62025-02-21 20:46:25 +0000110type StubDecoratorInfo struct {
111 AbiDumpPath android.OutputPath
112 HasAbiDump bool
113 AbiDiffPaths android.Paths
Yu Liu95cef3a2025-02-25 00:54:20 +0000114 InstallPath android.Path
Yu Liu2a815b62025-02-21 20:46:25 +0000115}
Yu Liu8a8d5b42025-01-07 00:48:08 +0000116
Yu Liu95cef3a2025-02-25 00:54:20 +0000117type ObjectLinkerInfo struct {
118 // Location of the object in the sysroot. Empty if the object is not
119 // included in the NDK.
120 NdkSysrootPath android.Path
121}
Yu Liu323d77a2024-12-16 23:13:57 +0000122
Yu Liu8a8d5b42025-01-07 00:48:08 +0000123type LibraryInfo struct {
124 BuildStubs bool
125}
126
Yu Liu2a815b62025-02-21 20:46:25 +0000127type InstallerInfo struct {
128 StubDecoratorInfo *StubDecoratorInfo
129}
130
Yu Liub1bfa9d2024-12-05 18:57:51 +0000131// Common info about the cc module.
132type CcInfo struct {
Yu Liu323d77a2024-12-16 23:13:57 +0000133 IsPrebuilt bool
134 CmakeSnapshotSupported bool
Yu Liu68a70b72025-01-08 22:54:44 +0000135 HasLlndkStubs bool
Yu Liu0a37d422025-02-13 02:05:00 +0000136 DataPaths []android.DataPath
Yu Liu323d77a2024-12-16 23:13:57 +0000137 CompilerInfo *CompilerInfo
138 LinkerInfo *LinkerInfo
Yu Liu8024b922024-12-20 23:31:32 +0000139 SnapshotInfo *SnapshotInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +0000140 LibraryInfo *LibraryInfo
Yu Liu2a815b62025-02-21 20:46:25 +0000141 InstallerInfo *InstallerInfo
Yu Liub1bfa9d2024-12-05 18:57:51 +0000142}
143
Yu Liu8024b922024-12-20 23:31:32 +0000144var CcInfoProvider = blueprint.NewProvider[*CcInfo]()
Yu Liub1bfa9d2024-12-05 18:57:51 +0000145
Yu Liu986d98c2024-11-12 00:28:11 +0000146type LinkableInfo struct {
147 // StaticExecutable returns true if this is a binary module with "static_executable: true".
Yu Liu8024b922024-12-20 23:31:32 +0000148 StaticExecutable bool
149 Static bool
150 Shared bool
151 HasStubsVariants bool
152 StubsVersion string
153 IsStubs bool
154 UnstrippedOutputFile android.Path
155 OutputFile android.OptionalPath
156 CoverageFiles android.Paths
Yu Liuf6f85492025-01-13 21:02:36 +0000157 // CoverageOutputFile returns the output archive of gcno coverage information files.
158 CoverageOutputFile android.OptionalPath
159 SAbiDumpFiles android.Paths
160 // Partition returns the partition string for this module.
161 Partition string
Yu Liu8a8d5b42025-01-07 00:48:08 +0000162 CcLibrary bool
Yu Liu8024b922024-12-20 23:31:32 +0000163 CcLibraryInterface bool
164 RustLibraryInterface bool
165 // CrateName returns the crateName for a Rust library
166 CrateName string
167 // DepFlags returns a slice of Rustc string flags
168 ExportedCrateLinkDirs []string
Yu Liu0a37d422025-02-13 02:05:00 +0000169 HasNonSystemVariants bool
170 IsLlndk bool
Yu Liuf6f85492025-01-13 21:02:36 +0000171 // True if the library is in the configs known NDK list.
172 IsNdk bool
173 InVendorOrProduct bool
Yu Liu8024b922024-12-20 23:31:32 +0000174 // SubName returns the modules SubName, used for image and NDK/SDK variations.
175 SubName string
176 InRamdisk bool
177 OnlyInRamdisk bool
178 InVendorRamdisk bool
179 OnlyInVendorRamdisk bool
180 InRecovery bool
181 OnlyInRecovery bool
Yu Liu367827f2025-02-15 00:18:33 +0000182 InVendor bool
Yu Liu8a8d5b42025-01-07 00:48:08 +0000183 Installable *bool
Yu Liu97880e12025-01-07 19:03:34 +0000184 // RelativeInstallPath returns the relative install path for this module.
185 RelativeInstallPath string
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000186 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
187 RustApexExclude bool
Yu Liuf6f85492025-01-13 21:02:36 +0000188 // Bootstrap tests if this module is allowed to use non-APEX version of libraries.
Yu Liu0a37d422025-02-13 02:05:00 +0000189 Bootstrap bool
190 Multilib string
191 ImplementationModuleNameForMake string
192 IsStubsImplementationRequired bool
193 // Symlinks returns a list of symlinks that should be created for this module.
Yu Liu367827f2025-02-15 00:18:33 +0000194 Symlinks []string
195 APIListCoverageXMLPath android.ModuleOutPath
Yu Liu119d38c2025-02-25 22:25:11 +0000196 // FuzzSharedLibraries returns the shared library dependencies for this module.
197 // Expects that IsFuzzModule returns true.
198 FuzzSharedLibraries android.RuleBuilderInstalls
Yu Liu986d98c2024-11-12 00:28:11 +0000199}
200
Yu Liu8024b922024-12-20 23:31:32 +0000201var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
Yu Liu986d98c2024-11-12 00:28:11 +0000202
Colin Cross463a90e2015-06-17 14:20:06 -0700203func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000204 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700205
Inseob Kim3b244062023-07-11 13:31:36 +0900206 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000207 pctx.Import("android/soong/cc/config")
208}
209
210func RegisterCCBuildComponents(ctx android.RegistrationContext) {
211 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
212
213 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700214 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700215 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700216 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700217 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700218 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700219 })
Colin Cross16b23492016-01-06 14:41:07 -0800220
Paul Duffin036e7002019-12-19 19:16:28 +0000221 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400222 for _, san := range Sanitizers {
223 san.registerMutators(ctx)
224 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800225
Colin Cross8a962802024-10-09 15:29:27 -0700226 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
227 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800228
Colin Cross597bad62024-10-08 15:10:55 -0700229 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000230
Colin Crossf5f4ad32024-01-19 15:41:48 -0800231 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700232
Colin Crossd38feb02024-01-23 16:38:06 -0800233 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800234
Colin Cross33e0c812024-01-23 16:36:07 -0800235 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000236
Colin Cross6ac83a82024-01-23 11:23:10 -0800237 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900238
Colin Cross8a962802024-10-09 15:29:27 -0700239 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
240 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700241 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700242
Colin Cross91ae5ec2024-10-01 14:03:40 -0700243 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800244 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700245 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800246 })
247
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000248 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700249}
250
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500251// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
252// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
253// edges to these modules.
254// This object is constructed in DepsMutator, by calling to various module delegates to set
255// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
256// dependencies.
257// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
258// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800259type Deps struct {
260 SharedLibs, LateSharedLibs []string
261 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800262 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800263 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700264
Colin Cross3e5e7782022-06-17 22:17:05 +0000265 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
266 // prevent automatically exporting symbols.
267 UnexportedStaticLibs []string
268
Chris Parsons79d66a52020-06-05 17:26:16 -0400269 // Used for data dependencies adjacent to tests
270 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700271 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400272
Yo Chiang219968c2020-09-22 18:45:04 +0800273 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
274 SystemSharedLibs []string
275
Vinh Tran367d89d2023-04-28 11:21:25 -0400276 // Used by DepMutator to pass aidl_library modules to aidl compiler
277 AidlLibs []string
278
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500279 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800280 StaticUnwinderIfLegacy bool
281
Colin Cross5950f382016-12-13 12:50:57 -0800282 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700283
Colin Cross81413472016-04-11 14:37:39 -0700284 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700285
Cole Faust65cb40a2024-10-21 15:41:42 -0700286 GeneratedSources []string
287 GeneratedHeaders []string
288 DeviceFirstGeneratedHeaders []string
289 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700290
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700291 ReexportGeneratedHeaders []string
292
Colin Crossc465efd2021-06-11 18:00:04 -0700293 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700294
295 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700296 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900297
298 // List of libs that need to be excluded for APEX variant
299 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900300 // List of libs that need to be excluded for non-APEX variant
301 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800302
303 // LLNDK headers for the ABI checker to check LLNDK implementation library.
304 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700305 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800306 // Instead, the LLNDK implementation depends on the LLNDK header libs.
307 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700308}
309
Ivan Lozano0a468a42024-05-13 21:03:34 -0400310// A struct which to collect flags for rlib dependencies
311type RustRlibDep struct {
312 LibPath android.Path // path to the rlib
313 LinkDirs []string // flags required for dependency (e.g. -L flags)
314 CrateName string // crateNames associated with rlibDeps
315}
316
317func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
318 return a.LibPath == b.LibPath
319}
320
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500321// PathDeps is a struct containing file paths to dependencies of a module.
322// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
323// It's used to construct flags for various build statements (such as for compiling and linking).
324// It is then passed to module decorator functions responsible for registering build statements
325// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800326type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700327 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900328 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700329 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900330 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700331 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700332 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400333 // Paths and crateNames for RustStaticLib dependencies
334 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700335
Colin Cross0de8a1e2020-09-18 14:15:30 -0700336 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700337 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700338
Colin Cross26c34ed2016-09-30 17:10:16 -0700339 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100340 Objs Objects
341 // Paths to .o files in dependencies that provide them. Note that these lists
342 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800343 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700344 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700345
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100346 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
347 // the libs from all whole_static_lib dependencies.
348 WholeStaticLibsFromPrebuilts android.Paths
349
Colin Cross26c34ed2016-09-30 17:10:16 -0700350 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700351 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900352 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700353
Inseob Kimd110f872019-12-06 13:15:38 +0900354 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000355 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900356 IncludeDirs android.Paths
357 SystemIncludeDirs android.Paths
358 ReexportedDirs android.Paths
359 ReexportedSystemDirs android.Paths
360 ReexportedFlags []string
361 ReexportedGeneratedHeaders android.Paths
362 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400363 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700364
Colin Cross26c34ed2016-09-30 17:10:16 -0700365 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700366 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700367
Dan Willemsena0790e32018-10-12 00:24:23 -0700368 // Path to the dynamic linker binary
369 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700370
371 // For Darwin builds, the path to the second architecture's output that should
372 // be combined with this architectures's output into a FAT MachO file.
373 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400374
375 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
376 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800377
378 // LLNDK headers for the ABI checker to check LLNDK implementation library.
379 LlndkIncludeDirs android.Paths
380 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700381
382 directImplementationDeps android.Paths
383 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700384}
385
Colin Cross4af21ed2019-11-04 09:37:55 -0800386// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
387// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
388// command line so they can be overridden by the local module flags).
389type LocalOrGlobalFlags struct {
390 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700391 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800392 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700393 CFlags []string // Flags that apply to C and C++ source files
394 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
395 ConlyFlags []string // Flags that apply to C source files
396 CppFlags []string // Flags that apply to C++ source files
397 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700398 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800399}
400
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500401// Flags contains various types of command line flags (and settings) for use in building build
402// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800403type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500404 // Local flags (which individual modules are responsible for). These may override global flags.
405 Local LocalOrGlobalFlags
406 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700407 Global LocalOrGlobalFlags
408 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800409
410 aidlFlags []string // Flags that apply to aidl source files
411 rsFlags []string // Flags that apply to renderscript source files
412 libFlags []string // Flags to add libraries early to the link order
413 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
414 TidyFlags []string // Flags that apply to clang-tidy
415 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700416
Colin Crossc3199482017-03-30 15:03:04 -0700417 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800418 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700419 SystemIncludeFlags []string
420
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800421 Toolchain config.Toolchain
422 Tidy bool // True if ninja .tidy rules should be generated.
423 NeedTidyFiles bool // True if module link should depend on .tidy files
424 GcovCoverage bool // True if coverage files should be generated.
425 SAbiDump bool // True if header abi dumps should be generated.
426 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800427 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800428
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500429 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800430 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500431 // The target-device system path to the dynamic linker.
432 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800433
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700434 CFlagsDeps android.Paths // Files depended on by compiler flags
435 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800436
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500437 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700438 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800439
Colin Cross19878da2019-03-28 14:45:07 -0700440 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700441 protoC bool // Whether to use C instead of C++
442 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700443
444 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200445 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700446}
447
Colin Crossca860ac2016-01-04 14:34:37 -0800448// Properties used to compile all C or C++ modules
449type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700450 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800451 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700452
Yi Kong5786f5c2024-05-28 02:22:34 +0900453 // Aggresively trade performance for smaller binary size.
454 // This should only be used for on-device binaries that are rarely executed and not
455 // performance critical.
456 Optimize_for_size *bool `android:"arch_variant"`
457
Jiyong Parkb35a8192020-08-10 15:59:36 +0900458 // The API level that this module is built against. The APIs of this API level will be
459 // visible at build time, but use of any APIs newer than min_sdk_version will render the
460 // module unloadable on older devices. In the future it will be possible to weakly-link new
461 // APIs, making the behavior match Java: such modules will load on older devices, but
462 // calling new APIs on devices that do not support them will result in a crash.
463 //
464 // This property has the same behavior as sdk_version does for Java modules. For those
465 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
466 // does for Java code.
467 //
468 // In addition, setting this property causes two variants to be built, one for the platform
469 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800470 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700471
Jiyong Parkb35a8192020-08-10 15:59:36 +0900472 // Minimum OS API level supported by this C or C++ module. This property becomes the value
473 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
474 // this property is also used to ensure that the min_sdk_version of the containing module is
475 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
476 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
477 // min_sdk_version of the containing APEX. When the module
478 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900479 Min_sdk_version *string
480
Colin Crossc511bc52020-04-07 16:50:32 +0000481 // If true, always create an sdk variant and don't create a platform variant.
482 Sdk_variant_only *bool
483
Colin Cross4297f402024-11-20 15:20:09 -0800484 AndroidMkSharedLibs []string `blueprint:"mutated"`
485 AndroidMkStaticLibs []string `blueprint:"mutated"`
486 AndroidMkRlibs []string `blueprint:"mutated"`
487 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
488 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
489 AndroidMkHeaderLibs []string `blueprint:"mutated"`
490 HideFromMake bool `blueprint:"mutated"`
491 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700492
Yo Chiang219968c2020-09-22 18:45:04 +0800493 // Set by DepsMutator.
494 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
495
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900496 // The name of the image this module is built for
497 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200498
499 // The VNDK version this module is built against. If empty, the module is not
500 // build against the VNDK.
501 VndkVersion string `blueprint:"mutated"`
502
503 // Suffix for the name of Android.mk entries generated by this module
504 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800505
506 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
507 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900508 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900509
Yifan Hong39143a92020-10-26 12:43:12 -0700510 // Make this module available when building for ramdisk.
511 // On device without a dedicated recovery partition, the module is only
512 // available after switching root into
513 // /first_stage_ramdisk. To expose the module before switching root, install
514 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800515 Ramdisk_available *bool
516
Yifan Hong39143a92020-10-26 12:43:12 -0700517 // Make this module available when building for vendor ramdisk.
518 // On device without a dedicated recovery partition, the module is only
519 // available after switching root into
520 // /first_stage_ramdisk. To expose the module before switching root, install
521 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700522 Vendor_ramdisk_available *bool
523
Jiyong Parkf9332f12018-02-01 00:54:12 +0900524 // Make this module available when building for recovery
525 Recovery_available *bool
526
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200527 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000528 VendorVariantNeeded bool `blueprint:"mutated"`
529 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200530 CoreVariantNeeded bool `blueprint:"mutated"`
531 RamdiskVariantNeeded bool `blueprint:"mutated"`
532 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
533 RecoveryVariantNeeded bool `blueprint:"mutated"`
534
535 // A list of variations for the "image" mutator of the form
536 //<image name> '.' <version char>, for example, 'vendor.S'
537 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900538
539 // Allows this module to use non-APEX version of libraries. Useful
540 // for building binaries that are started before APEXes are activated.
541 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900542
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000543 // Allows this module to be included in CMake release snapshots to be built outside of Android
544 // build system and source tree.
545 Cmake_snapshot_supported *bool
546
Colin Cross1bc94122021-10-28 13:25:54 -0700547 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000548
549 // Set by factories of module types that can only be referenced from variants compiled against
550 // the SDK.
551 AlwaysSdk bool `blueprint:"mutated"`
552
553 // Variant is an SDK variant created by sdkMutator
554 IsSdkVariant bool `blueprint:"mutated"`
555 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
556 // variant to have a ".sdk" suffix.
557 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700558
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800559 Target struct {
560 Platform struct {
561 // List of modules required by the core variant.
562 Required []string `android:"arch_variant"`
563
564 // List of modules not required by the core variant.
565 Exclude_required []string `android:"arch_variant"`
566 } `android:"arch_variant"`
567
568 Recovery struct {
569 // List of modules required by the recovery variant.
570 Required []string `android:"arch_variant"`
571
572 // List of modules not required by the recovery variant.
573 Exclude_required []string `android:"arch_variant"`
574 } `android:"arch_variant"`
575 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700576}
577
578type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900579 // whether this module should be allowed to be directly depended by other
580 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900581 // If set to true, two variants will be built separately, one like
582 // normal, and the other limited to the set of libraries and headers
583 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700584 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900585 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700586 // so it shouldn't have any unversioned runtime dependencies, or
587 // make assumptions about the system that may not be true in the
588 // future.
589 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900590 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900591 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900592 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900593 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900594 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700595 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
596 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900597
Justin Yunebcf0c52021-01-08 18:00:19 +0900598 // This is the same as the "vendor_available" except that the install path
599 // of the vendor variant is /odm or /vendor/odm.
600 // By replacing "vendor_available: true" with "odm_available: true", the
601 // module will install its vendor variant to the /odm partition or /vendor/odm.
602 // As the modules with "odm_available: true" still create the vendor variants,
603 // they can link to the other vendor modules as the vendor_available modules do.
604 // Also, the vendor modules can link to odm_available modules.
605 //
606 // It may not be used for VNDK modules.
607 Odm_available *bool
608
Justin Yun63e9ec72020-10-29 16:49:43 +0900609 // whether this module should be allowed to be directly depended by other
610 // modules with `product_specific: true` or `product_available: true`.
611 // If set to true, an additional product variant will be built separately
612 // that is limited to the set of libraries and headers that are exposed to
613 // /product modules.
614 //
615 // The product variant may be used with a different (newer) /system,
616 // so it shouldn't have any unversioned runtime dependencies, or
617 // make assumptions about the system that may not be true in the
618 // future.
619 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900620 // If set to false, this module becomes inaccessible from /product modules.
621 //
622 // Different from the 'vendor_available' property, the modules with
623 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
624 // library without 'product_available' may not be depended on by any other
625 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900626 //
627 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
628 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
629 Product_available *bool
630
Jiyong Park5fb8c102018-04-09 12:03:06 +0900631 // whether this module is capable of being loaded with other instance
632 // (possibly an older version) of the same module in the same process.
633 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
634 // can be double loaded in a vendor process if the library is also a
635 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
636 // explicitly marked as `double_loadable: true` by the owner, or the dependency
637 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
638 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800639
640 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
641 IsLLNDK bool `blueprint:"mutated"`
642
Colin Cross5271fea2021-04-27 13:06:04 -0700643 // IsVendorPublicLibrary is set for the core and product variants of a library that has
644 // vendor_public_library stubs.
645 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800646}
647
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500648// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
649// to understanding details about the type of the current module.
650// For example, one might call these functions to determine whether the current module is a static
651// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800652type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800653 static() bool
654 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800655 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700656 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800657 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900658 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900659 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900660 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700661 toolchain() config.Toolchain
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700662 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800663 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900664 minSdkVersion() string
665 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700666 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700667 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800668 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800669 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700670 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900671 inProduct() bool
672 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800673 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700674 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900675 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900676 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700677 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700678 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800679 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000680 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800681 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900682 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800683 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800684 useClangLld(actx ModuleContext) bool
Colin Crosse07f2312020-08-13 11:24:56 -0700685 apexVariationName() string
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900686 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700687 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800688 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800689 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800690 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800691 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900692 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000693 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800694}
695
696type SharedFlags struct {
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000697 NumSharedFlags int
698 FlagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800699}
700
701type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700702 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800703 ModuleContextIntf
704}
705
706type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700707 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800708 ModuleContextIntf
709}
710
Colin Cross37047f12016-12-13 17:06:13 -0800711type DepsContext interface {
712 android.BottomUpMutatorContext
713 ModuleContextIntf
714}
715
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500716// feature represents additional (optional) steps to building cc-related modules, such as invocation
717// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800718type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800719 flags(ctx ModuleContext, flags Flags) Flags
720 props() []interface{}
721}
722
Joe Onorato37f900c2023-07-18 16:58:16 -0700723// Information returned from Generator about the source code it's generating
724type GeneratedSource struct {
725 IncludeDirs android.Paths
726 Sources android.Paths
727 Headers android.Paths
728 ReexportedDirs android.Paths
729}
730
731// generator allows injection of generated code
732type Generator interface {
733 GeneratorProps() []interface{}
734 GeneratorInit(ctx BaseModuleContext)
735 GeneratorDeps(ctx DepsContext, deps Deps) Deps
736 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
737 GeneratorSources(ctx ModuleContext) GeneratedSource
738 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
739}
740
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500741// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500742// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800743type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700744 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800745 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800746 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700747 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000748 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700749
Colin Cross76fada02016-07-27 10:31:13 -0700750 appendCflags([]string)
751 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700752 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800753}
754
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500755// linker is the interface for a linker decorator object. Individual module types can provide
756// their own implementation for this decorator, and thus specify custom logic regarding build
757// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800758type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700759 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800760 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700761 linkerFlags(ctx ModuleContext, flags Flags) Flags
762 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000763 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800764 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700765
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700766 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700767 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900768 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800769 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700770
771 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900772 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000773
774 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700775 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800776
777 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000778}
779
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500780// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000781type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500782 sharedLibs []string
783 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
784 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700785 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800786}
787
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500788// installer is the interface for an installer helper object. This helper is responsible for
789// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800790type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700791 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700792 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000793 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800794 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700795 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700796 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900797 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000798 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900799 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800800}
801
Inseob Kima1888ce2022-10-04 14:42:02 +0900802type overridable interface {
803 overriddenModules() []string
804}
805
Colin Cross6e511a92020-07-27 21:26:48 -0700806type libraryDependencyKind int
807
808const (
809 headerLibraryDependency = iota
810 sharedLibraryDependency
811 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400812 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700813)
814
815func (k libraryDependencyKind) String() string {
816 switch k {
817 case headerLibraryDependency:
818 return "headerLibraryDependency"
819 case sharedLibraryDependency:
820 return "sharedLibraryDependency"
821 case staticLibraryDependency:
822 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400823 case rlibLibraryDependency:
824 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700825 default:
826 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
827 }
828}
829
830type libraryDependencyOrder int
831
832const (
833 earlyLibraryDependency = -1
834 normalLibraryDependency = 0
835 lateLibraryDependency = 1
836)
837
838func (o libraryDependencyOrder) String() string {
839 switch o {
840 case earlyLibraryDependency:
841 return "earlyLibraryDependency"
842 case normalLibraryDependency:
843 return "normalLibraryDependency"
844 case lateLibraryDependency:
845 return "lateLibraryDependency"
846 default:
847 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
848 }
849}
850
851// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
852// tags that have a set of predefined tag objects that are reused for each dependency, a
853// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
854// That means that comparing a libraryDependencyTag for equality will only be equal if all
855// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
856// then check individual metadata fields instead.
857type libraryDependencyTag struct {
858 blueprint.BaseDependencyTag
859
860 // These are exported so that fmt.Printf("%#v") can call their String methods.
861 Kind libraryDependencyKind
862 Order libraryDependencyOrder
863
864 wholeStatic bool
865
866 reexportFlags bool
867 explicitlyVersioned bool
Colin Crossbd930bc2025-02-03 12:17:42 -0800868 explicitlyImpl bool
Colin Cross6e511a92020-07-27 21:26:48 -0700869 dataLib bool
870 ndk bool
871
872 staticUnwinder bool
873
874 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900875
Cindy Zhou18417cb2020-12-10 07:12:38 -0800876 // Whether or not this dependency should skip the apex dependency check
877 skipApexAllowedDependenciesCheck bool
878
Jiyong Parke3867542020-12-03 17:28:25 +0900879 // Whether or not this dependency has to be followed for the apex variants
880 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900881 // Whether or not this dependency has to be followed for the non-apex variants
882 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000883
884 // If true, don't automatically export symbols from the static library into a shared library.
885 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700886}
887
888// header returns true if the libraryDependencyTag is tagging a header lib dependency.
889func (d libraryDependencyTag) header() bool {
890 return d.Kind == headerLibraryDependency
891}
892
893// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
894func (d libraryDependencyTag) shared() bool {
895 return d.Kind == sharedLibraryDependency
896}
897
898// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
899func (d libraryDependencyTag) static() bool {
900 return d.Kind == staticLibraryDependency
901}
902
Colin Cross65cb3142021-12-10 23:05:02 +0000903func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
904 if d.shared() {
905 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
906 }
907 return nil
908}
909
910var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
911
Colin Crosse9fe2942020-11-10 18:12:15 -0800912// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
913// binaries or other shared libraries are installed as dependencies.
914func (d libraryDependencyTag) InstallDepNeeded() bool {
915 return d.shared()
916}
917
918var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
919
Yu Liu67a28422024-03-05 00:36:31 +0000920func (d libraryDependencyTag) PropagateAconfigValidation() bool {
921 return d.static()
922}
923
924var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
925
Colin Crosse9fe2942020-11-10 18:12:15 -0800926// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700927// libraryDependencyTag. Each tag object is created globally and reused for multiple
928// dependencies (although since the object contains no references, assigning a tag to a
929// variable and modifying it will not modify the original). Users can compare the tag
930// returned by ctx.OtherModuleDependencyTag against the global original
931type dependencyTag struct {
932 blueprint.BaseDependencyTag
933 name string
934}
935
Colin Crosse9fe2942020-11-10 18:12:15 -0800936// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
937// libraryDependencyTag, but where the dependency needs to be installed when the parent is
938// installed.
939type installDependencyTag struct {
940 blueprint.BaseDependencyTag
941 android.InstallAlwaysNeededDependencyTag
942 name string
943}
944
Colin Crossc99deeb2016-04-11 15:06:20 -0700945var (
Colin Cross6e511a92020-07-27 21:26:48 -0700946 genSourceDepTag = dependencyTag{name: "gen source"}
947 genHeaderDepTag = dependencyTag{name: "gen header"}
948 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
949 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900950 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700951 reuseObjTag = dependencyTag{name: "reuse objects"}
952 staticVariantTag = dependencyTag{name: "static variant"}
953 vndkExtDepTag = dependencyTag{name: "vndk extends"}
954 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700955 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800956 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000957 StubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000958 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500959 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400960 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800961 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700962)
963
Colin Crossbd930bc2025-02-03 12:17:42 -0800964func IsExplicitImplSharedDepTag(depTag blueprint.DependencyTag) bool {
965 ccLibDepTag, ok := depTag.(libraryDependencyTag)
966 return ok && ccLibDepTag.shared() && ccLibDepTag.explicitlyImpl
967}
968
Roland Levillainf89cd092019-07-29 16:22:59 +0100969func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700970 ccLibDepTag, ok := depTag.(libraryDependencyTag)
971 return ok && ccLibDepTag.shared()
972}
973
974func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
975 ccLibDepTag, ok := depTag.(libraryDependencyTag)
976 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100977}
978
Zach Johnson3df4e632020-11-06 11:56:27 -0800979func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
980 ccLibDepTag, ok := depTag.(libraryDependencyTag)
981 return ok && ccLibDepTag.header()
982}
983
Roland Levillainf89cd092019-07-29 16:22:59 +0100984func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800985 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100986}
987
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000988func ExcludeInApexDepTag(depTag blueprint.DependencyTag) bool {
989 ccLibDepTag, ok := depTag.(libraryDependencyTag)
990 return ok && ccLibDepTag.excludeInApex
991}
992
Colin Crossca860ac2016-01-04 14:34:37 -0800993// Module contains the properties and members used by all C/C++ module types, and implements
994// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500995// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
996// interface.
997//
998// To define a C/C++ related module, construct a new Module object and point its delegates to
999// type-specific structs. These delegates will be invoked to register module-specific build
1000// statements which may be unique to the module type. For example, module.compiler.compile() should
1001// be defined so as to register build statements which are responsible for compiling the module.
1002//
1003// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
1004// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
1005// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
1006// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -08001007type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -07001008 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -07001009
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07001010 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -07001011 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -07001012 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -07001013
Colin Crossca860ac2016-01-04 14:34:37 -08001014 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +00001015 hod android.HostOrDeviceSupported
1016 multilib android.Multilib
1017 testModule bool
1018 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -07001019
Paul Duffina0843f62019-12-13 19:50:38 +00001020 // Allowable SdkMemberTypes of this module type.
1021 sdkMemberTypes []android.SdkMemberType
1022
Chris Parsonsef6e0cf2020-12-01 18:26:21 -05001023 // decorator delegates, initialize before calling Init
1024 // these may contain module-specific implementations, and effectively allow for custom
1025 // type-specific logic. These members may reference different objects or the same object.
1026 // Functions of these decorators will be invoked to initialize and register type-specific
1027 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -08001028 generators []Generator
1029 compiler compiler
1030 linker linker
1031 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -05001032
Spandan Dase12d2522023-09-12 21:42:31 +00001033 features []feature
1034 stl *stl
1035 sanitize *sanitize
1036 coverage *coverage
1037 fuzzer *fuzzer
1038 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +00001039 lto *lto
1040 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001041 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -08001042
Colin Cross31076b32020-10-23 17:22:06 -07001043 library libraryInterface
1044
Colin Cross635c3b02016-05-18 15:37:25 -07001045 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -08001046
Colin Crossb98c8b02016-07-29 13:44:28 -07001047 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -07001048
Yu Liue70976d2024-10-15 20:45:35 +00001049 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001050
1051 // Flags used to compile this module
1052 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -07001053
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001054 // Shared flags among build rules of this module
1055 sharedFlags SharedFlags
1056
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08001057 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -07001058 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001059
1060 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001061
1062 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001063 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001064
1065 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001066
Inseob Kim37e0bb02024-04-29 15:54:44 +09001067 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001068
1069 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001070
1071 hasAidl bool
1072 hasLex bool
1073 hasProto bool
1074 hasRenderscript bool
1075 hasSysprop bool
1076 hasWinMsg bool
1077 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001078
1079 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001080}
1081
Yu Liu76d94462024-10-31 23:32:36 +00001082func (c *Module) IncrementalSupported() bool {
1083 return c.incremental
1084}
1085
1086var _ blueprint.Incremental = (*Module)(nil)
1087
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001088func (c *Module) AddJSONData(d *map[string]interface{}) {
1089 c.AndroidModuleBase().AddJSONData(d)
1090 (*d)["Cc"] = map[string]interface{}{
1091 "SdkVersion": c.SdkVersion(),
1092 "MinSdkVersion": c.MinSdkVersion(),
1093 "VndkVersion": c.VndkVersion(),
1094 "ProductSpecific": c.ProductSpecific(),
1095 "SocSpecific": c.SocSpecific(),
1096 "DeviceSpecific": c.DeviceSpecific(),
1097 "InProduct": c.InProduct(),
1098 "InVendor": c.InVendor(),
1099 "InRamdisk": c.InRamdisk(),
1100 "InVendorRamdisk": c.InVendorRamdisk(),
1101 "InRecovery": c.InRecovery(),
1102 "VendorAvailable": c.VendorAvailable(),
1103 "ProductAvailable": c.ProductAvailable(),
1104 "RamdiskAvailable": c.RamdiskAvailable(),
1105 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1106 "RecoveryAvailable": c.RecoveryAvailable(),
1107 "OdmAvailable": c.OdmAvailable(),
1108 "InstallInData": c.InstallInData(),
1109 "InstallInRamdisk": c.InstallInRamdisk(),
1110 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1111 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1112 "InstallInRecovery": c.InstallInRecovery(),
1113 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001114 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001115 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1116 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001117 "AidlSrcs": c.hasAidl,
1118 "LexSrcs": c.hasLex,
1119 "ProtoSrcs": c.hasProto,
1120 "RenderscriptSrcs": c.hasRenderscript,
1121 "SyspropSrcs": c.hasSysprop,
1122 "WinMsgSrcs": c.hasWinMsg,
1123 "YaccSrsc": c.hasYacc,
1124 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001125 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001126 }
1127}
1128
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001129func (c *Module) SetPreventInstall() {
1130 c.Properties.PreventInstall = true
1131}
1132
1133func (c *Module) SetHideFromMake() {
1134 c.Properties.HideFromMake = true
1135}
1136
Ivan Lozanod7586b62021-04-01 09:49:36 -04001137func (c *Module) HiddenFromMake() bool {
1138 return c.Properties.HideFromMake
1139}
1140
Cole Fauste8a87832024-09-11 11:35:46 -07001141func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001142 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001143 if c.ImageVariation().Variation == android.CoreVariation {
1144 required = append(required, c.Properties.Target.Platform.Required...)
1145 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1146 } else if c.InRecovery() {
1147 required = append(required, c.Properties.Target.Recovery.Required...)
1148 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1149 }
1150 return android.FirstUniqueStrings(required)
1151}
1152
Ivan Lozano52767be2019-10-18 14:49:46 -07001153func (c *Module) Toc() android.OptionalPath {
1154 if c.linker != nil {
1155 if library, ok := c.linker.(libraryInterface); ok {
1156 return library.toc()
1157 }
1158 }
1159 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1160}
1161
1162func (c *Module) ApiLevel() string {
1163 if c.linker != nil {
1164 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001165 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001166 }
1167 }
1168 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1169}
1170
1171func (c *Module) Static() bool {
1172 if c.linker != nil {
1173 if library, ok := c.linker.(libraryInterface); ok {
1174 return library.static()
1175 }
1176 }
1177 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1178}
1179
1180func (c *Module) Shared() bool {
1181 if c.linker != nil {
1182 if library, ok := c.linker.(libraryInterface); ok {
1183 return library.shared()
1184 }
1185 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001186
Ivan Lozano52767be2019-10-18 14:49:46 -07001187 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1188}
1189
1190func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001191 if c.stl != nil {
1192 return c.stl.Properties.SelectedStl
1193 }
1194 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001195}
1196
Ivan Lozano52767be2019-10-18 14:49:46 -07001197func (c *Module) StubDecorator() bool {
1198 if _, ok := c.linker.(*stubDecorator); ok {
1199 return true
1200 }
1201 return false
1202}
1203
Yi Kong5786f5c2024-05-28 02:22:34 +09001204func (c *Module) OptimizeForSize() bool {
1205 return Bool(c.Properties.Optimize_for_size)
1206}
1207
Ivan Lozano52767be2019-10-18 14:49:46 -07001208func (c *Module) SdkVersion() string {
1209 return String(c.Properties.Sdk_version)
1210}
1211
Artur Satayev480e25b2020-04-27 18:53:18 +01001212func (c *Module) MinSdkVersion() string {
1213 return String(c.Properties.Min_sdk_version)
1214}
1215
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001216func (c *Module) SetSdkVersion(s string) {
1217 c.Properties.Sdk_version = StringPtr(s)
1218}
1219
1220func (c *Module) SetMinSdkVersion(s string) {
1221 c.Properties.Min_sdk_version = StringPtr(s)
1222}
1223
1224func (c *Module) SetStl(s string) {
1225 if c.stl != nil {
1226 c.stl.Properties.Stl = StringPtr(s)
1227 }
1228}
1229
1230func (c *Module) IsCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001231 if linker, ok := c.linker.(*objectLinker); ok {
1232 return linker.isCrt()
1233 }
1234 return false
1235}
1236
Jiyong Park5df7bd32021-08-25 16:18:46 +09001237func (c *Module) SplitPerApiLevel() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001238 return CanUseSdk(c) && c.IsCrt()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001239}
1240
Colin Crossc511bc52020-04-07 16:50:32 +00001241func (c *Module) AlwaysSdk() bool {
1242 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1243}
1244
Ivan Lozano183a3212019-10-18 14:18:45 -07001245func (c *Module) CcLibrary() bool {
1246 if c.linker != nil {
1247 if _, ok := c.linker.(*libraryDecorator); ok {
1248 return true
1249 }
Colin Crossd48fe732020-09-23 20:37:24 -07001250 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1251 return true
1252 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001253 }
1254 return false
1255}
1256
1257func (c *Module) CcLibraryInterface() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001258 if c.library != nil {
Ivan Lozano183a3212019-10-18 14:18:45 -07001259 return true
1260 }
1261 return false
1262}
1263
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001264func (c *Module) RlibStd() bool {
1265 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1266}
1267
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001268func (c *Module) RustLibraryInterface() bool {
1269 return false
1270}
1271
Ivan Lozano0a468a42024-05-13 21:03:34 -04001272func (c *Module) CrateName() string {
1273 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1274}
1275
1276func (c *Module) ExportedCrateLinkDirs() []string {
1277 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1278}
1279
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001280func (c *Module) IsFuzzModule() bool {
1281 if _, ok := c.compiler.(*fuzzBinary); ok {
1282 return true
1283 }
1284 return false
1285}
1286
1287func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1288 return c.FuzzModule
1289}
1290
1291func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1292 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1293 return fuzzer.fuzzPackagedModule
1294 }
1295 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1296}
1297
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001298func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001299 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1300 return fuzzer.sharedLibraries
1301 }
1302 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1303}
1304
Ivan Lozano2b262972019-11-21 12:30:50 -08001305func (c *Module) NonCcVariants() bool {
1306 return false
1307}
1308
Ivan Lozano183a3212019-10-18 14:18:45 -07001309func (c *Module) SetStatic() {
1310 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001311 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001312 library.setStatic()
1313 return
1314 }
1315 }
1316 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1317}
1318
1319func (c *Module) SetShared() {
1320 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001321 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001322 library.setShared()
1323 return
1324 }
1325 }
1326 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1327}
1328
1329func (c *Module) BuildStaticVariant() bool {
1330 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001331 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001332 return library.buildStatic()
1333 }
1334 }
1335 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1336}
1337
1338func (c *Module) BuildSharedVariant() bool {
1339 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001340 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001341 return library.buildShared()
1342 }
1343 }
1344 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1345}
1346
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001347func (c *Module) BuildRlibVariant() bool {
1348 // cc modules can never build rlib variants
1349 return false
1350}
1351
Ivan Lozano183a3212019-10-18 14:18:45 -07001352func (c *Module) Module() android.Module {
1353 return c
1354}
1355
Jiyong Parkc20eee32018-09-05 22:36:17 +09001356func (c *Module) OutputFile() android.OptionalPath {
1357 return c.outputFile
1358}
1359
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001360func (c *Module) CoverageFiles() android.Paths {
1361 if c.linker != nil {
1362 if library, ok := c.linker.(libraryInterface); ok {
1363 return library.objs().coverageFiles
1364 }
1365 }
1366 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1367}
1368
Ivan Lozano183a3212019-10-18 14:18:45 -07001369var _ LinkableInterface = (*Module)(nil)
1370
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001371func (c *Module) VersionedInterface() VersionedInterface {
1372 if c.library != nil {
1373 return c.library
1374 }
1375 return nil
1376}
1377
Jiyong Park719b4462019-01-13 00:39:51 +09001378func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001379 if c.linker != nil {
1380 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001381 }
1382 return nil
1383}
1384
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001385func (c *Module) CoverageOutputFile() android.OptionalPath {
1386 if c.linker != nil {
1387 return c.linker.coverageOutputFilePath()
1388 }
1389 return android.OptionalPath{}
1390}
1391
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001392func (c *Module) RelativeInstallPath() string {
1393 if c.installer != nil {
1394 return c.installer.relativeInstallPath()
1395 }
1396 return ""
1397}
1398
Jooyung Han344d5432019-08-23 11:17:39 +09001399func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001400 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001401}
1402
Colin Cross36242852017-06-23 15:06:31 -07001403func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001404 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001405 for _, generator := range c.generators {
1406 c.AddProperties(generator.GeneratorProps()...)
1407 }
Colin Crossca860ac2016-01-04 14:34:37 -08001408 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001409 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001410 }
1411 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001412 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001413 }
1414 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001415 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001416 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001417 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001418 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001419 }
Colin Cross16b23492016-01-06 14:41:07 -08001420 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001421 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001422 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001423 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001424 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001425 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001426 if c.fuzzer != nil {
1427 c.AddProperties(c.fuzzer.props()...)
1428 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001429 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001430 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001431 }
Stephen Craneba090d12017-05-09 15:44:35 -07001432 if c.lto != nil {
1433 c.AddProperties(c.lto.props()...)
1434 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001435 if c.afdo != nil {
1436 c.AddProperties(c.afdo.props()...)
1437 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001438 if c.orderfile != nil {
1439 c.AddProperties(c.orderfile.props()...)
1440 }
Colin Crossca860ac2016-01-04 14:34:37 -08001441 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001442 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001443 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001444 // Allow test-only on libraries that are not cc_test_library
1445 if c.library != nil && !c.testLibrary() {
1446 c.AddProperties(&c.sourceProperties)
1447 }
Colin Crossc472d572015-03-17 15:06:21 -07001448
Colin Cross36242852017-06-23 15:06:31 -07001449 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001450 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001451 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001452
Colin Cross36242852017-06-23 15:06:31 -07001453 return c
Colin Crossc472d572015-03-17 15:06:21 -07001454}
1455
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001456// UseVndk() returns true if this module is built against VNDK.
1457// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001458func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001459 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001460}
1461
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001462func CanUseSdk(c LinkableInterface) bool {
1463 return c.Module().Target().Os == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001464 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001465}
1466
1467func (c *Module) UseSdk() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001468 if CanUseSdk(c) {
Colin Cross1348ce32020-10-01 13:37:16 -07001469 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001470 }
1471 return false
1472}
1473
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001474func (c *Module) isCoverageVariant() bool {
1475 return c.coverage.Properties.IsCoverageVariant
1476}
1477
Colin Cross95f1ca02020-10-29 20:47:22 -07001478func (c *Module) IsNdk(config android.Config) bool {
1479 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001480}
1481
Colin Cross127bb8b2020-12-16 16:46:01 -08001482func (c *Module) IsLlndk() bool {
1483 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001484}
1485
Colin Cross1f3f1302021-04-26 18:37:44 -07001486func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001487 lib := moduleVersionedInterface(m)
1488 return lib != nil && (lib.HasLLNDKStubs() || lib.HasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001489}
1490
Colin Cross5271fea2021-04-27 13:06:04 -07001491func (m *Module) NeedsVendorPublicLibraryVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001492 lib := moduleVersionedInterface(m)
1493 return lib != nil && (lib.HasVendorPublicLibrary())
Colin Cross5271fea2021-04-27 13:06:04 -07001494}
1495
1496// IsVendorPublicLibrary returns true for vendor public libraries.
1497func (c *Module) IsVendorPublicLibrary() bool {
1498 return c.VendorProperties.IsVendorPublicLibrary
1499}
1500
Ivan Lozanof1868af2022-04-12 13:08:36 -04001501func (c *Module) IsVndkPrebuiltLibrary() bool {
1502 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1503 return true
1504 }
1505 return false
1506}
1507
1508func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1509 return c.Properties.SdkAndPlatformVariantVisibleToMake
1510}
1511
Ivan Lozanod7586b62021-04-01 09:49:36 -04001512func (c *Module) HasLlndkStubs() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001513 lib := moduleVersionedInterface(c)
1514 return lib != nil && lib.HasLLNDKStubs()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001515}
1516
1517func (c *Module) StubsVersion() string {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001518 if lib, ok := c.linker.(VersionedInterface); ok {
1519 return lib.StubsVersion()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001520 }
1521 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1522}
1523
Colin Cross127bb8b2020-12-16 16:46:01 -08001524// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1525// and does not set llndk.vendor_available: false.
1526func (c *Module) isImplementationForLLNDKPublic() bool {
1527 library, _ := c.library.(*libraryDecorator)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001528 return library != nil && library.HasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001529 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001530}
1531
Colin Cross3513fb12024-01-24 14:44:47 -08001532func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001533 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001534 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001535 }
1536 return false
1537}
1538
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001539func (c *Module) isOrderfileCompile() bool {
1540 if orderfile := c.orderfile; orderfile != nil {
1541 return orderfile.Properties.OrderfileLoad
1542 }
1543 return false
1544}
1545
Yi Kongc702ebd2022-08-19 16:02:45 +08001546func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001547 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001548}
1549
Yi Konged79fa32023-06-04 17:15:42 +09001550func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001551 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001552}
1553
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001554func (c *Module) isNDKStubLibrary() bool {
1555 if _, ok := c.compiler.(*stubDecorator); ok {
1556 return true
1557 }
1558 return false
1559}
1560
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001561func (c *Module) SubName() string {
1562 return c.Properties.SubName
1563}
1564
Jiyong Park25fc6a92018-11-18 18:02:45 +09001565func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001566 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001567 return lib.BuildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001568 }
1569 return false
1570}
1571
1572func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001573 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001574 return lib.HasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001575 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001576 return false
1577}
1578
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001579func (c *Module) RustApexExclude() bool {
1580 return false
1581}
1582
Alan Stokes73feba32022-11-14 12:21:24 +00001583func (c *Module) IsStubsImplementationRequired() bool {
1584 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001585 return lib.IsStubsImplementationRequired()
Alan Stokes73feba32022-11-14 12:21:24 +00001586 }
1587 return false
1588}
1589
Colin Cross0477b422020-10-13 18:43:54 -07001590// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1591// the implementation. If it is an implementation library it returns its own name.
1592func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1593 name := ctx.OtherModuleName(c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001594 if versioned, ok := c.linker.(VersionedInterface); ok {
1595 name = versioned.ImplementationModuleName(name)
Colin Cross0477b422020-10-13 18:43:54 -07001596 }
1597 return name
1598}
1599
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001600// Similar to ImplementationModuleNameByCtx, but uses the Make variant of the module
Martin Stjernholm2856c662020-12-02 15:03:42 +00001601// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1602// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1603// under the premise that the prebuilt module overrides its source counterpart
1604// if it is exposed to Make).
Yu Liu0a37d422025-02-13 02:05:00 +00001605func (c *Module) ImplementationModuleNameForMake() string {
Martin Stjernholm2856c662020-12-02 15:03:42 +00001606 name := c.BaseModuleName()
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001607 if versioned, ok := c.linker.(VersionedInterface); ok {
1608 name = versioned.ImplementationModuleName(name)
Martin Stjernholm2856c662020-12-02 15:03:42 +00001609 }
1610 return name
1611}
1612
Jiyong Park7d55b612021-06-11 17:22:09 +09001613func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001614 return Bool(c.Properties.Bootstrap)
1615}
1616
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001617func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001618 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1619 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1620 return false
1621 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001622 return c.linker != nil && c.linker.nativeCoverage()
1623}
1624
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001625func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001626 if p, ok := c.linker.(SnapshotInterface); ok {
1627 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001628 }
1629 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001630}
1631
Jiyong Parkf1194352019-02-25 11:05:47 +09001632func isBionic(name string) bool {
1633 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001634 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001635 return true
1636 }
1637 return false
1638}
1639
Martin Stjernholm279de572019-09-10 23:18:20 +01001640func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001641 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001642 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001643 }
1644 return isBionic(name)
1645}
1646
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001647func (c *Module) isCfiAssemblySupportEnabled() bool {
1648 return c.sanitize != nil &&
1649 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1650}
1651
Inseob Kim800d1142021-06-14 12:03:51 +09001652func (c *Module) InstallInRoot() bool {
1653 return c.installer != nil && c.installer.installInRoot()
1654}
1655
Colin Crossca860ac2016-01-04 14:34:37 -08001656type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001657 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001658 moduleContextImpl
1659}
1660
Colin Cross37047f12016-12-13 17:06:13 -08001661type depsContext struct {
1662 android.BottomUpMutatorContext
1663 moduleContextImpl
1664}
1665
Colin Crossca860ac2016-01-04 14:34:37 -08001666type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001667 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001668 moduleContextImpl
1669}
1670
1671type moduleContextImpl struct {
1672 mod *Module
1673 ctx BaseModuleContext
1674}
1675
Colin Crossb98c8b02016-07-29 13:44:28 -07001676func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001677 return ctx.mod.toolchain(ctx.ctx)
1678}
1679
1680func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001681 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001682}
1683
1684func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001685 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001686}
1687
Colin Cross6a730042024-12-05 13:53:43 -08001688func (ctx *moduleContextImpl) staticLibrary() bool {
1689 return ctx.mod.staticLibrary()
1690}
1691
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001692func (ctx *moduleContextImpl) testBinary() bool {
1693 return ctx.mod.testBinary()
1694}
1695
Yi Kong56fc1b62022-09-06 16:24:00 +08001696func (ctx *moduleContextImpl) testLibrary() bool {
1697 return ctx.mod.testLibrary()
1698}
1699
Jiyong Park1d1119f2019-07-29 21:27:18 +09001700func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001701 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001702}
1703
Inseob Kim7f283f42020-06-01 21:53:49 +09001704func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001705 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001706}
1707
Inseob Kim1042d292020-06-01 23:23:05 +09001708func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001709 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001710}
1711
Yi Kong5786f5c2024-05-28 02:22:34 +09001712func (ctx *moduleContextImpl) optimizeForSize() bool {
1713 return ctx.mod.OptimizeForSize()
1714}
1715
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001716func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001717 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001718}
1719
1720func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001721 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001722 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001723 }
1724 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001725}
1726
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001727func MinSdkVersion(mod VersionedLinkableInterface, ctxIsForPlatform bool, device bool,
1728 platformSdkVersion string) string {
1729
1730 ver := mod.MinSdkVersion()
1731 if ver == "apex_inherit" && !ctxIsForPlatform {
1732 ver = mod.ApexSdkVersion().String()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001733 }
1734 if ver == "apex_inherit" || ver == "" {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001735 ver = mod.SdkVersion()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001736 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001737
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001738 if device {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001739 // When building for vendor/product, use the latest _stable_ API as "current".
1740 // This is passed to clang/aidl compilers so that compiled/generated code works
1741 // with the system.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001742 if (mod.InVendor() || mod.InProduct()) && (ver == "" || ver == "current") {
1743 ver = platformSdkVersion
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001744 }
1745 }
1746
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001747 // For crt objects, the meaning of min_sdk_version is very different from other types of
1748 // module. For them, min_sdk_version defines the oldest version that the build system will
1749 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1750 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1751 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001752 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1753 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1754 // support such an old version. The version is set to the later version in case when the
1755 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1756 // it's for an APEX.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001757 if mod.IsCrt() && !mod.IsSdkVariant() {
1758 if ctxIsForPlatform {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001759 ver = strconv.Itoa(android.FutureApiLevelInt)
1760 } else { // for apex
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001761 ver = mod.ApexSdkVersion().String()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001762 if ver == "" { // in case when min_sdk_version was not set by the APEX
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001763 ver = mod.SdkVersion()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001764 }
1765 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001766 }
1767
Jiyong Parkb35a8192020-08-10 15:59:36 +09001768 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001769 sdkVersionInt, err := strconv.Atoi(mod.SdkVersion())
Jiyong Parkb35a8192020-08-10 15:59:36 +09001770 minSdkVersionInt, err2 := strconv.Atoi(ver)
1771 if err == nil && err2 == nil {
1772 if sdkVersionInt < minSdkVersionInt {
1773 return strconv.Itoa(sdkVersionInt)
1774 }
1775 }
1776 return ver
1777}
1778
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001779func (ctx *moduleContextImpl) minSdkVersion() string {
1780 platformSdkVersion := ""
1781 if ctx.ctx.Device() {
1782 platformSdkVersion = ctx.ctx.Config().PlatformSdkVersion().String()
1783 }
1784 return MinSdkVersion(ctx.mod, CtxIsForPlatform(ctx.ctx), ctx.ctx.Device(), platformSdkVersion)
1785}
1786
Jiyong Parkb35a8192020-08-10 15:59:36 +09001787func (ctx *moduleContextImpl) isSdkVariant() bool {
1788 return ctx.mod.IsSdkVariant()
1789}
1790
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001791func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001792 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001793}
Justin Yun8effde42017-06-23 19:24:43 +09001794
Kiyoung Kimaa394802024-01-08 12:55:45 +09001795func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1796 return ctx.mod.InVendorOrProduct()
1797}
1798
Colin Cross95f1ca02020-10-29 20:47:22 -07001799func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1800 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001801}
1802
Colin Cross127bb8b2020-12-16 16:46:01 -08001803func (ctx *moduleContextImpl) IsLlndk() bool {
1804 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001805}
1806
Colin Cross127bb8b2020-12-16 16:46:01 -08001807func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1808 return ctx.mod.isImplementationForLLNDKPublic()
1809}
1810
Colin Cross3513fb12024-01-24 14:44:47 -08001811func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1812 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001813}
1814
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001815func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1816 return ctx.mod.isOrderfileCompile()
1817}
1818
Yi Kongc702ebd2022-08-19 16:02:45 +08001819func (ctx *moduleContextImpl) isCfi() bool {
1820 return ctx.mod.isCfi()
1821}
1822
Yi Konged79fa32023-06-04 17:15:42 +09001823func (ctx *moduleContextImpl) isFuzzer() bool {
1824 return ctx.mod.isFuzzer()
1825}
1826
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001827func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1828 return ctx.mod.isNDKStubLibrary()
1829}
1830
Colin Cross5271fea2021-04-27 13:06:04 -07001831func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1832 return ctx.mod.IsVendorPublicLibrary()
1833}
1834
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001835func (ctx *moduleContextImpl) selectedStl() string {
1836 if stl := ctx.mod.stl; stl != nil {
1837 return stl.Properties.SelectedStl
1838 }
1839 return ""
1840}
1841
Ivan Lozanobd721262018-11-27 14:33:03 -08001842func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1843 return ctx.mod.linker.useClangLld(actx)
1844}
1845
Colin Crossce75d2c2016-10-06 16:12:58 -07001846func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001847 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001848}
1849
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001850func CtxIsForPlatform(ctx android.BaseModuleContext) bool {
1851 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Colin Crossff694a82023-12-13 15:54:49 -08001852 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001853}
1854
Colin Crosse07f2312020-08-13 11:24:56 -07001855func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001856 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1857 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001858}
1859
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001860func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001861 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001862}
1863
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001864func (ctx *moduleContextImpl) nativeCoverage() bool {
1865 return ctx.mod.nativeCoverage()
1866}
1867
Colin Cross95b07f22020-12-16 11:06:50 -08001868func (ctx *moduleContextImpl) isPreventInstall() bool {
1869 return ctx.mod.Properties.PreventInstall
1870}
1871
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001872func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1873 shared := &ctx.mod.sharedFlags
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001874 if shared.FlagsMap == nil {
1875 shared.NumSharedFlags = 0
1876 shared.FlagsMap = make(map[string]string)
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001877 }
1878 return shared
1879}
1880
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001881func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1882 return ctx.mod.isCfiAssemblySupportEnabled()
1883}
1884
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001885func (ctx *moduleContextImpl) notInPlatform() bool {
1886 return ctx.mod.NotInPlatform()
1887}
1888
Yu Liu76d94462024-10-31 23:32:36 +00001889func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1890 if ctx.mod.makeVarsInfo == nil {
1891 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1892 }
1893 return ctx.mod.makeVarsInfo
1894}
1895
Colin Cross635c3b02016-05-18 15:37:25 -07001896func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001897 return &Module{
1898 hod: hod,
1899 multilib: multilib,
1900 }
1901}
1902
Colin Cross635c3b02016-05-18 15:37:25 -07001903func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001904 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001905 module.features = []feature{
1906 &tidyFeature{},
1907 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001908 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001909 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001910 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001911 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001912 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001913 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001914 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001915 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001916 return module
1917}
1918
Colin Crossce75d2c2016-10-06 16:12:58 -07001919func (c *Module) Prebuilt() *android.Prebuilt {
1920 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1921 return p.prebuilt()
1922 }
1923 return nil
1924}
1925
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001926func (c *Module) IsPrebuilt() bool {
1927 return c.Prebuilt() != nil
1928}
1929
Colin Crossce75d2c2016-10-06 16:12:58 -07001930func (c *Module) Name() string {
1931 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001932 if p, ok := c.linker.(interface {
1933 Name(string) string
1934 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001935 name = p.Name(name)
1936 }
1937 return name
1938}
1939
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001940func (c *Module) Multilib() string {
1941 return c.Arch().ArchType.Multilib
1942}
1943
1944func (c *Module) ApexSdkVersion() android.ApiLevel {
1945 return c.apexSdkVersion
1946}
1947
Alex Light3d673592019-01-18 14:37:31 -08001948func (c *Module) Symlinks() []string {
1949 if p, ok := c.installer.(interface {
1950 symlinkList() []string
1951 }); ok {
1952 return p.symlinkList()
1953 }
1954 return nil
1955}
1956
Chris Parsons216e10a2020-07-09 17:12:52 -04001957func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001958 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001959 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001960 }); ok {
1961 return p.dataPaths()
1962 }
1963 return nil
1964}
1965
Ivan Lozanof1868af2022-04-12 13:08:36 -04001966func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001967 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1968 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001969 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001970 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001971 if c.ProductSpecific() {
1972 // If the module is product specific with 'product_specific: true',
1973 // do not add a name suffix because it is a base module.
1974 return ""
1975 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001976 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001977 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001978 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001979 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001980 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001981 // add version suffix only if the module is using different vndk version than the
1982 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001983 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001984 }
1985 return nameSuffix
1986}
1987
Ivan Lozanof1868af2022-04-12 13:08:36 -04001988func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1989 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001990
1991 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001992 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001993 }
1994
Colin Cross127bb8b2020-12-16 16:46:01 -08001995 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001996 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001997 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1998 // added for product variant only when we have vendor and product variants with core
1999 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04002000 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07002001 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002002 subName += vendorPublicLibrarySuffix
2003 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09002004 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
2005 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04002006 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08002007 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002008 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002009 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002010 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07002011 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002012 subName += RecoverySuffix
2013 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
2014 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07002015 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002016 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07002017 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00002018 } else if c.IsStubs() && c.IsSdkVariant() {
2019 // Public API surface (NDK)
2020 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
2021 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09002022 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04002023
2024 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05002025}
2026
Sam Delmerico75dbca22023-04-20 13:13:25 +00002027func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
2028 ctx := &moduleContext{
2029 ModuleContext: actx,
2030 moduleContextImpl: moduleContextImpl{
2031 mod: c,
2032 },
2033 }
2034 ctx.ctx = ctx
2035 return ctx
2036}
2037
Spandan Das20fce2d2023-04-12 17:21:39 +00002038// TODO (b/277651159): Remove this allowlist
2039var (
2040 skipStubLibraryMultipleApexViolation = map[string]bool{
2041 "libclang_rt.asan": true,
2042 "libclang_rt.hwasan": true,
2043 // runtime apex
2044 "libc": true,
2045 "libc_hwasan": true,
2046 "libdl_android": true,
2047 "libm": true,
2048 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00002049 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00002050 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01002051 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00002052 "libandroidio": true,
2053 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01002054 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00002055 "libnativebridge": true,
2056 "libnativehelper": true,
2057 "libnativeloader": true,
2058 "libsigchain": true,
2059 }
2060)
2061
2062// Returns true if a stub library could be installed in multiple apexes
2063func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2064 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08002065 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00002066 return false
2067 }
2068 // If this is not a stub library, no check necessary
2069 if !c.HasStubsVariants() {
2070 return false
2071 }
2072 // Skip the allowlist
2073 // Use BaseModuleName so that this matches prebuilts.
2074 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2075 return false
2076 }
2077
Spandan Das20fce2d2023-04-12 17:21:39 +00002078 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08002079 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
2080 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00002081 return true
2082 }
2083 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08002084 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00002085 return true
2086 }
2087 // Default: no violation
2088 return false
2089}
2090
Chris Parsons8d6e4332021-02-22 16:13:50 -05002091func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002092 ctx := moduleContextFromAndroidModuleContext(actx, c)
2093
Inseob Kim37e0bb02024-04-29 15:54:44 +09002094 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2095 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2096 Logtags: c.logtagsPaths,
2097 })
2098
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002099 // If Test_only is set on a module in bp file, respect the setting, otherwise
2100 // see if is a known test module type.
2101 testOnly := c.testModule || c.testLibrary()
2102 if c.sourceProperties.Test_only != nil {
2103 testOnly = Bool(c.sourceProperties.Test_only)
2104 }
2105 // Keep before any early returns.
2106 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2107 TestOnly: testOnly,
2108 TopLevelTarget: c.testModule,
2109 })
2110
Ivan Lozanof1868af2022-04-12 13:08:36 -04002111 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002112 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002113 if !apexInfo.IsForPlatform() {
2114 c.hideApexVariantFromMake = true
2115 }
2116
Chris Parsonseefc9e62021-04-02 17:36:47 -04002117 c.makeLinkType = GetMakeLinkType(actx, c)
2118
Colin Crossf18e1102017-11-16 14:33:08 -08002119 deps := c.depsToPaths(ctx)
2120 if ctx.Failed() {
2121 return
2122 }
2123
Joe Onorato37f900c2023-07-18 16:58:16 -07002124 for _, generator := range c.generators {
2125 gen := generator.GeneratorSources(ctx)
2126 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2127 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2128 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2129 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2130 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2131 if len(deps.Objs.objFiles) == 0 {
2132 // If we are reusuing object files (which happens when we're a shared library and we're
2133 // reusing our static variant's object files), then skip adding the actual source files,
2134 // because we already have the object for it.
2135 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2136 }
2137 }
2138
2139 if ctx.Failed() {
2140 return
2141 }
2142
Spandan Das20fce2d2023-04-12 17:21:39 +00002143 if c.stubLibraryMultipleApexViolation(actx) {
2144 actx.PropertyErrorf("apex_available",
2145 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2146 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002147 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2148 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002149 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2150 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002151 }
2152
Colin Crossca860ac2016-01-04 14:34:37 -08002153 flags := Flags{
2154 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002155 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002156 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002157 for _, generator := range c.generators {
2158 flags = generator.GeneratorFlags(ctx, flags, deps)
2159 }
Colin Crossca860ac2016-01-04 14:34:37 -08002160 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002161 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002162 }
2163 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002164 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002165 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002166 if c.stl != nil {
2167 flags = c.stl.flags(ctx, flags)
2168 }
Colin Cross16b23492016-01-06 14:41:07 -08002169 if c.sanitize != nil {
2170 flags = c.sanitize.flags(ctx, flags)
2171 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002172 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002173 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002174 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002175 if c.fuzzer != nil {
2176 flags = c.fuzzer.flags(ctx, flags)
2177 }
Stephen Craneba090d12017-05-09 15:44:35 -07002178 if c.lto != nil {
2179 flags = c.lto.flags(ctx, flags)
2180 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002181 if c.afdo != nil {
2182 flags = c.afdo.flags(ctx, flags)
2183 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002184 if c.orderfile != nil {
2185 flags = c.orderfile.flags(ctx, flags)
2186 }
Colin Crossca860ac2016-01-04 14:34:37 -08002187 for _, feature := range c.features {
2188 flags = feature.flags(ctx, flags)
2189 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002190 if ctx.Failed() {
2191 return
2192 }
2193
Colin Cross4af21ed2019-11-04 09:37:55 -08002194 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2195 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2196 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002197
Colin Cross4af21ed2019-11-04 09:37:55 -08002198 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002199
2200 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002201 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002202 }
2203 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002204 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002205 }
2206
Colin Cross3e5e7782022-06-17 22:17:05 +00002207 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2208
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002209 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002210 // We need access to all the flags seen by a source file.
2211 if c.sabi != nil {
2212 flags = c.sabi.flags(ctx, flags)
2213 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002214
Colin Cross4af21ed2019-11-04 09:37:55 -08002215 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002216
Joe Onorato37f900c2023-07-18 16:58:16 -07002217 for _, generator := range c.generators {
2218 generator.GeneratorBuildActions(ctx, flags, deps)
2219 }
2220
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002221 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002222 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002223 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002224 if ctx.Failed() {
2225 return
2226 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002227 }
2228
Colin Crossca860ac2016-01-04 14:34:37 -08002229 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002230 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002231 if ctx.Failed() {
2232 return
2233 }
Colin Cross635c3b02016-05-18 15:37:25 -07002234 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002235
Chris Parsons94a0bba2021-06-04 15:03:47 -04002236 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002237
2238 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2239 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2240 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002241 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002242
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002243 if Bool(c.Properties.Cmake_snapshot_supported) {
2244 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2245 }
2246
Chris Parsons94a0bba2021-06-04 15:03:47 -04002247 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002248
2249 if c.linker != nil {
2250 moduleInfoJSON := ctx.ModuleInfoJSON()
2251 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2252 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2253 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2254 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2255 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2256
2257 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2258 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2259 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2260 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2261
2262 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2263 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2264 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2265 moduleInfoJSON.SubName += ".cfi"
2266 }
2267 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2268 moduleInfoJSON.SubName += ".hwasan"
2269 }
2270 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2271 moduleInfoJSON.SubName += ".scs"
2272 }
2273 }
2274 moduleInfoJSON.SubName += c.Properties.SubName
2275
2276 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2277 moduleInfoJSON.Uninstallable = true
2278 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002279 }
Wei Lia1aa2972024-06-21 13:08:51 -07002280
2281 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002282
Cole Faust96a692b2024-08-08 14:47:51 -07002283 if b, ok := c.compiler.(*baseCompiler); ok {
2284 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2285 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2286 c.hasProto = b.hasSrcExt(ctx, ".proto")
2287 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2288 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2289 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2290 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2291 }
2292
Yu Liuec7043d2024-11-05 18:22:20 +00002293 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002294 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002295 }
2296 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002297 ccObjectInfo.ObjFiles = objs.objFiles
2298 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002299 }
Yu Liu4f825132024-12-18 00:35:39 +00002300 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002301 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2302 }
2303
Yu Liuf6f85492025-01-13 21:02:36 +00002304 linkableInfo := CreateCommonLinkableInfo(ctx, c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002305 if lib, ok := c.linker.(VersionedInterface); ok {
2306 linkableInfo.StubsVersion = lib.StubsVersion()
Yu Liu8024b922024-12-20 23:31:32 +00002307 }
2308 if c.linker != nil {
2309 if library, ok := c.linker.(libraryInterface); ok {
2310 linkableInfo.Static = library.static()
Yu Liu8a8d5b42025-01-07 00:48:08 +00002311 linkableInfo.Shared = library.shared()
Yu Liu8024b922024-12-20 23:31:32 +00002312 linkableInfo.CoverageFiles = library.objs().coverageFiles
2313 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2314 }
2315 }
2316 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002317
Yu Liu323d77a2024-12-16 23:13:57 +00002318 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002319 IsPrebuilt: c.IsPrebuilt(),
2320 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
Yu Liu68a70b72025-01-08 22:54:44 +00002321 HasLlndkStubs: c.HasLlndkStubs(),
Yu Liu0a37d422025-02-13 02:05:00 +00002322 DataPaths: c.DataPaths(),
Yu Liu323d77a2024-12-16 23:13:57 +00002323 }
2324 if c.compiler != nil {
Cole Faustc9b88c92025-02-06 17:58:26 -08002325 cflags := c.compiler.baseCompilerProps().Cflags
Yu Liu323d77a2024-12-16 23:13:57 +00002326 ccInfo.CompilerInfo = &CompilerInfo{
2327 Srcs: c.compiler.(CompiledInterface).Srcs(),
Cole Faustc9b88c92025-02-06 17:58:26 -08002328 Cflags: cflags.GetOrDefault(ctx, nil),
Yu Liu323d77a2024-12-16 23:13:57 +00002329 AidlInterfaceInfo: AidlInterfaceInfo{
2330 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2331 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2332 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2333 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2334 },
2335 }
2336 switch decorator := c.compiler.(type) {
2337 case *libraryDecorator:
2338 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Cole Faustc9b88c92025-02-06 17:58:26 -08002339 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs.GetOrDefault(ctx, nil),
Yu Liu323d77a2024-12-16 23:13:57 +00002340 }
2341 }
2342 }
2343 if c.linker != nil {
Cole Faustc9b88c92025-02-06 17:58:26 -08002344 baseLinkerProps := c.linker.baseLinkerProps()
Yu Liu323d77a2024-12-16 23:13:57 +00002345 ccInfo.LinkerInfo = &LinkerInfo{
Cole Faustc9b88c92025-02-06 17:58:26 -08002346 WholeStaticLibs: baseLinkerProps.Whole_static_libs.GetOrDefault(ctx, nil),
2347 StaticLibs: baseLinkerProps.Static_libs.GetOrDefault(ctx, nil),
2348 SharedLibs: baseLinkerProps.Shared_libs.GetOrDefault(ctx, nil),
2349 HeaderLibs: baseLinkerProps.Header_libs.GetOrDefault(ctx, nil),
Yu Liu323d77a2024-12-16 23:13:57 +00002350 }
2351 switch decorator := c.linker.(type) {
2352 case *binaryDecorator:
2353 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2354 case *libraryDecorator:
Yu Liu116610a2025-01-06 21:54:48 +00002355 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
2356 InjectBsslHash: Bool(c.linker.(*libraryDecorator).Properties.Inject_bssl_hash),
Yu Liu95cef3a2025-02-25 00:54:20 +00002357 NdkSysrootPath: c.linker.(*libraryDecorator).ndkSysrootPath,
Yu Liu116610a2025-01-06 21:54:48 +00002358 }
Yu Liu323d77a2024-12-16 23:13:57 +00002359 case *testBinary:
2360 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2361 Gtest: decorator.testDecorator.gtest(),
2362 }
2363 case *benchmarkDecorator:
2364 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2365 case *objectLinker:
Yu Liu95cef3a2025-02-25 00:54:20 +00002366 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{
2367 NdkSysrootPath: c.linker.(*objectLinker).ndkSysrootPath,
2368 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002369 case *stubDecorator:
2370 ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{}
Yu Liu323d77a2024-12-16 23:13:57 +00002371 }
Yu Liu8024b922024-12-20 23:31:32 +00002372
2373 if s, ok := c.linker.(SnapshotInterface); ok {
2374 ccInfo.SnapshotInfo = &SnapshotInfo{
2375 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2376 }
Yu Liuffe86322024-12-18 18:53:12 +00002377 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002378 if v, ok := c.linker.(VersionedInterface); ok {
2379 name := v.ImplementationModuleName(ctx.OtherModuleName(c))
Yu Liu68a70b72025-01-08 22:54:44 +00002380 ccInfo.LinkerInfo.ImplementationModuleName = &name
2381 }
Yu Liuffe86322024-12-18 18:53:12 +00002382 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002383 if c.library != nil {
2384 ccInfo.LibraryInfo = &LibraryInfo{
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002385 BuildStubs: c.library.BuildStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002386 }
2387 }
Yu Liu2a815b62025-02-21 20:46:25 +00002388 if c.installer != nil {
2389 ccInfo.InstallerInfo = &InstallerInfo{}
2390 if installer, ok := c.installer.(*stubDecorator); ok {
2391 ccInfo.InstallerInfo.StubDecoratorInfo = &StubDecoratorInfo{
2392 HasAbiDump: installer.hasAbiDump,
2393 AbiDumpPath: installer.abiDumpPath,
2394 AbiDiffPaths: installer.abiDiffPaths,
Yu Liu95cef3a2025-02-25 00:54:20 +00002395 InstallPath: installer.installPath,
Yu Liu2a815b62025-02-21 20:46:25 +00002396 }
2397 }
2398 }
Yu Liu8024b922024-12-20 23:31:32 +00002399 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002400
mrziwangabdb2932024-06-18 12:43:41 -07002401 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002402
2403 if c.makeVarsInfo != nil {
2404 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2405 }
mrziwangabdb2932024-06-18 12:43:41 -07002406}
2407
Yu Liuf6f85492025-01-13 21:02:36 +00002408func CreateCommonLinkableInfo(ctx android.ModuleContext, mod VersionedLinkableInterface) *LinkableInfo {
Yu Liu0a37d422025-02-13 02:05:00 +00002409 info := &LinkableInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002410 StaticExecutable: mod.StaticExecutable(),
2411 HasStubsVariants: mod.HasStubsVariants(),
2412 OutputFile: mod.OutputFile(),
2413 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
Yu Liuf6f85492025-01-13 21:02:36 +00002414 CoverageOutputFile: mod.CoverageOutputFile(),
2415 Partition: mod.Partition(),
Yu Liu8024b922024-12-20 23:31:32 +00002416 IsStubs: mod.IsStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002417 CcLibrary: mod.CcLibrary(),
Yu Liu8024b922024-12-20 23:31:32 +00002418 CcLibraryInterface: mod.CcLibraryInterface(),
2419 RustLibraryInterface: mod.RustLibraryInterface(),
Yu Liu8024b922024-12-20 23:31:32 +00002420 IsLlndk: mod.IsLlndk(),
Yu Liuf6f85492025-01-13 21:02:36 +00002421 IsNdk: mod.IsNdk(ctx.Config()),
Yu Liu8024b922024-12-20 23:31:32 +00002422 HasNonSystemVariants: mod.HasNonSystemVariants(),
2423 SubName: mod.SubName(),
2424 InVendorOrProduct: mod.InVendorOrProduct(),
2425 InRamdisk: mod.InRamdisk(),
2426 OnlyInRamdisk: mod.OnlyInRamdisk(),
2427 InVendorRamdisk: mod.InVendorRamdisk(),
2428 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2429 InRecovery: mod.InRecovery(),
2430 OnlyInRecovery: mod.OnlyInRecovery(),
Yu Liu367827f2025-02-15 00:18:33 +00002431 InVendor: mod.InVendor(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002432 Installable: mod.Installable(),
Yu Liu97880e12025-01-07 19:03:34 +00002433 RelativeInstallPath: mod.RelativeInstallPath(),
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002434 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
Yu Liu0a37d422025-02-13 02:05:00 +00002435 RustApexExclude: mod.RustApexExclude(),
2436 Bootstrap: mod.Bootstrap(),
2437 Multilib: mod.Multilib(),
2438 ImplementationModuleNameForMake: mod.ImplementationModuleNameForMake(),
2439 Symlinks: mod.Symlinks(),
Yu Liu8024b922024-12-20 23:31:32 +00002440 }
Yu Liu8024b922024-12-20 23:31:32 +00002441
Yu Liu367827f2025-02-15 00:18:33 +00002442 vi := mod.VersionedInterface()
2443 if vi != nil {
2444 info.IsStubsImplementationRequired = vi.IsStubsImplementationRequired()
2445 info.APIListCoverageXMLPath = vi.GetAPIListCoverageXMLPath()
Yu Liuec7043d2024-11-05 18:22:20 +00002446 }
Yu Liu367827f2025-02-15 00:18:33 +00002447
Yu Liu119d38c2025-02-25 22:25:11 +00002448 if !mod.PreventInstall() && fuzz.IsValid(ctx, mod.FuzzModuleStruct()) && mod.IsFuzzModule() {
2449 info.FuzzSharedLibraries = mod.FuzzSharedLibraries()
2450 fm := mod.FuzzPackagedModule()
2451 fuzz.SetFuzzPackagedModuleInfo(ctx, &fm)
2452 }
2453
Yu Liu367827f2025-02-15 00:18:33 +00002454 return info
Yu Liuec7043d2024-11-05 18:22:20 +00002455}
2456
mrziwangabdb2932024-06-18 12:43:41 -07002457func (c *Module) setOutputFiles(ctx ModuleContext) {
2458 if c.outputFile.Valid() {
2459 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2460 } else {
2461 ctx.SetOutputFiles(android.Paths{}, "")
2462 }
2463 if c.linker != nil {
2464 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2465 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2466 }
Wei Lia1aa2972024-06-21 13:08:51 -07002467}
2468
2469func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2470 // Dump metadata that can not be done in android/compliance-metadata.go
2471 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
Wei Li8ede4f72025-01-15 21:24:22 -08002472 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static() || ctx.ModuleType() == "cc_object"))
Wei Lia1aa2972024-06-21 13:08:51 -07002473 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2474
2475 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002476 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002477 staticDepNames := make([]string, 0, len(staticDeps))
2478 for _, dep := range staticDeps {
2479 staticDepNames = append(staticDepNames, dep.Name())
2480 }
Wei Li8ede4f72025-01-15 21:24:22 -08002481 // Process CrtBegin and CrtEnd as static libs
Yu Liu727204c2025-01-23 20:58:32 +00002482 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Wei Li8ede4f72025-01-15 21:24:22 -08002483 depName := ctx.OtherModuleName(dep)
2484 depTag := ctx.OtherModuleDependencyTag(dep)
2485 switch depTag {
2486 case CrtBeginDepTag:
2487 staticDepNames = append(staticDepNames, depName)
2488 case CrtEndDepTag:
2489 staticDepNames = append(staticDepNames, depName)
2490 }
2491 })
Wei Lia1aa2972024-06-21 13:08:51 -07002492
Wei Li8ede4f72025-01-15 21:24:22 -08002493 staticDepPaths := make([]string, 0, len(deps.StaticLibs)+len(deps.CrtBegin)+len(deps.CrtEnd))
Wei Lia1aa2972024-06-21 13:08:51 -07002494 for _, dep := range deps.StaticLibs {
2495 staticDepPaths = append(staticDepPaths, dep.String())
2496 }
Wei Li8ede4f72025-01-15 21:24:22 -08002497 for _, dep := range deps.CrtBegin {
2498 staticDepPaths = append(staticDepPaths, dep.String())
2499 }
2500 for _, dep := range deps.CrtEnd {
2501 staticDepPaths = append(staticDepPaths, dep.String())
2502 }
Wei Lia1aa2972024-06-21 13:08:51 -07002503 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2504 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2505
2506 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002507 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002508 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2509 for _, dep := range wholeStaticDeps {
2510 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2511 }
2512
2513 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2514 for _, dep := range deps.WholeStaticLibs {
2515 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2516 }
2517 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2518 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Wei Li8ede4f72025-01-15 21:24:22 -08002519
2520 // Header libs
2521 headerLibDeps := ctx.GetDirectDepsProxyWithTag(HeaderDepTag())
2522 headerLibDepNames := make([]string, 0, len(headerLibDeps))
2523 for _, dep := range headerLibDeps {
2524 headerLibDepNames = append(headerLibDepNames, dep.Name())
2525 }
2526 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.HEADER_LIBS, android.FirstUniqueStrings(headerLibDepNames))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002527}
2528
2529func (c *Module) maybeUnhideFromMake() {
2530 // If a lib is directly included in any of the APEXes or is not available to the
2531 // platform (which is often the case when the stub is provided as a prebuilt),
2532 // unhide the stubs variant having the latest version gets visible to make. In
2533 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2534 // force anything in the make world to link against the stubs library. (unless it
2535 // is explicitly referenced via .bootstrap suffix or the module is marked with
2536 // 'bootstrap: true').
2537 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002538 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002539 c.IsStubs() && !c.InVendorRamdisk() {
2540 c.Properties.HideFromMake = false // unhide
2541 // Note: this is still non-installable
2542 }
2543}
2544
Colin Cross8ff10582023-12-07 13:10:56 -08002545// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2546// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002547func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002548 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002549 // If the module has been specifically configure to not be installed then
2550 // hide from make as otherwise it will break when running inside make
2551 // as the output path to install will not be specified. Not all uninstallable
2552 // modules can be hidden from make as some are needed for resolving make side
2553 // dependencies.
2554 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002555 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002556 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002557 c.SkipInstall()
2558 }
2559
2560 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2561 // to allow using the outputs in a genrule.
2562 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002563 c.installer.install(ctx, c.outputFile.Path())
2564 if ctx.Failed() {
2565 return
Colin Crossca860ac2016-01-04 14:34:37 -08002566 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002567 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002568}
2569
Colin Cross0ea8ba82019-06-06 14:33:29 -07002570func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002571 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002572 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002573 }
Colin Crossca860ac2016-01-04 14:34:37 -08002574 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002575}
2576
Colin Crossca860ac2016-01-04 14:34:37 -08002577func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002578 for _, generator := range c.generators {
2579 generator.GeneratorInit(ctx)
2580 }
Colin Crossca860ac2016-01-04 14:34:37 -08002581 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002582 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002583 }
Colin Crossca860ac2016-01-04 14:34:37 -08002584 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002585 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002586 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002587 if c.stl != nil {
2588 c.stl.begin(ctx)
2589 }
Colin Cross16b23492016-01-06 14:41:07 -08002590 if c.sanitize != nil {
2591 c.sanitize.begin(ctx)
2592 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002593 if c.coverage != nil {
2594 c.coverage.begin(ctx)
2595 }
Yi Kong9723e332023-12-04 14:52:53 +09002596 if c.afdo != nil {
2597 c.afdo.begin(ctx)
2598 }
Stephen Craneba090d12017-05-09 15:44:35 -07002599 if c.lto != nil {
2600 c.lto.begin(ctx)
2601 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002602 if c.orderfile != nil {
2603 c.orderfile.begin(ctx)
2604 }
Dan Albert92fe7402020-07-15 13:33:30 -07002605 if ctx.useSdk() && c.IsSdkVariant() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002606 version, err := NativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002607 if err != nil {
2608 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002609 c.Properties.Sdk_version = nil
2610 } else {
2611 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002612 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002613 }
Colin Crossca860ac2016-01-04 14:34:37 -08002614}
2615
Colin Cross37047f12016-12-13 17:06:13 -08002616func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002617 deps := Deps{}
2618
Joe Onorato37f900c2023-07-18 16:58:16 -07002619 for _, generator := range c.generators {
2620 deps = generator.GeneratorDeps(ctx, deps)
2621 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002622 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002623 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002624 }
2625 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002626 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002627 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002628 if c.stl != nil {
2629 deps = c.stl.deps(ctx, deps)
2630 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002631 if c.coverage != nil {
2632 deps = c.coverage.deps(ctx, deps)
2633 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002634
Colin Crossb6715442017-10-24 11:13:31 -07002635 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2636 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2637 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2638 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2639 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2640 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002641 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002642 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002643
Colin Cross516c5452024-10-28 13:45:21 -07002644 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2645 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2646 }
2647
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002648 for _, lib := range deps.ReexportSharedLibHeaders {
2649 if !inList(lib, deps.SharedLibs) {
2650 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2651 }
2652 }
2653
2654 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002655 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2656 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 -07002657 }
2658 }
2659
Colin Cross5950f382016-12-13 12:50:57 -08002660 for _, lib := range deps.ReexportHeaderLibHeaders {
2661 if !inList(lib, deps.HeaderLibs) {
2662 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2663 }
2664 }
2665
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002666 for _, gen := range deps.ReexportGeneratedHeaders {
2667 if !inList(gen, deps.GeneratedHeaders) {
2668 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2669 }
2670 }
2671
Colin Crossc99deeb2016-04-11 15:06:20 -07002672 return deps
2673}
2674
Colin Cross516c5452024-10-28 13:45:21 -07002675func checkConflictingExplicitVersions(libs []string) error {
2676 withoutVersion := func(s string) string {
2677 name, _ := StubsLibNameAndVersion(s)
2678 return name
2679 }
2680 var errs []error
2681 for i, lib := range libs {
2682 libName := withoutVersion(lib)
2683 libsToCompare := libs[i+1:]
2684 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2685 return withoutVersion(s) == libName
2686 })
2687 if j >= 0 {
2688 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2689 lib, libsToCompare[j]))
2690 }
2691 }
2692 return errors.Join(errs...)
2693}
2694
Dan Albert7e9d2952016-08-04 13:02:36 -07002695func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002696 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002697 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002698 moduleContextImpl: moduleContextImpl{
2699 mod: c,
2700 },
2701 }
2702 ctx.ctx = ctx
2703
Colin Crossca860ac2016-01-04 14:34:37 -08002704 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002705}
2706
Jiyong Park7ed9de32018-10-15 22:25:07 +09002707// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002708func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002709 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2710 version := name[sharp+1:]
2711 libname := name[:sharp]
2712 return libname, version
2713 }
2714 return name, ""
2715}
2716
Dan Albert92fe7402020-07-15 13:33:30 -07002717func GetCrtVariations(ctx android.BottomUpMutatorContext,
2718 m LinkableInterface) []blueprint.Variation {
2719 if ctx.Os() != android.Android {
2720 return nil
2721 }
2722 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002723 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2724 minSdkVersion := m.MinSdkVersion()
2725 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2726 minSdkVersion = m.SdkVersion()
2727 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002728 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2729 if err != nil {
2730 ctx.PropertyErrorf("min_sdk_version", err.Error())
2731 }
Colin Cross363ec762023-01-13 13:45:14 -08002732
2733 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002734 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002735 if apiLevel.LessThan(minApiForArch) {
2736 apiLevel = minApiForArch
2737 }
2738
Dan Albert92fe7402020-07-15 13:33:30 -07002739 return []blueprint.Variation{
2740 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002741 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002742 }
2743 }
2744 return []blueprint.Variation{
2745 {Mutator: "sdk", Variation: ""},
2746 }
2747}
2748
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002749func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2750 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002751
2752 variations = append([]blueprint.Variation(nil), variations...)
2753
Liz Kammer23942242022-04-08 15:41:00 -04002754 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002755 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002756 if version == "impl" {
2757 version = ""
2758 }
Colin Crosse7257d22020-09-24 09:56:18 -07002759 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002760 if tag, ok := depTag.(libraryDependencyTag); ok {
2761 tag.explicitlyVersioned = true
Colin Crossbd930bc2025-02-03 12:17:42 -08002762 if version == "" {
2763 tag.explicitlyImpl = true
2764 }
Colin Crossafcdce82024-10-22 13:59:33 -07002765 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2766 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2767 // the modified copy to depTag.
2768 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002769 } else {
2770 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2771 }
Colin Crosse7257d22020-09-24 09:56:18 -07002772 }
Colin Crosse7257d22020-09-24 09:56:18 -07002773
Colin Cross0de8a1e2020-09-18 14:15:30 -07002774 if far {
2775 ctx.AddFarVariationDependencies(variations, depTag, name)
2776 } else {
2777 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002778 }
2779}
2780
Kiyoung Kim487689e2022-07-26 09:48:22 +09002781func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2782 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002783 return snapshot
2784 }
2785
2786 return lib
2787}
2788
Kiyoung Kim37693d02024-04-04 09:56:15 +09002789// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002790// of names:
2791//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002792// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002793//
2794// For each of these, it adds the name of the ndk_library module to the list of
2795// variant libs.
2796//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002797// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002798//
2799// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002800//
2801// The caller can then know to add the variantLibs dependencies differently from the
2802// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002803func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002804 variantLibs = []string{}
2805
2806 nonvariantLibs = []string{}
2807 for _, entry := range list {
2808 // strip #version suffix out
2809 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002810 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002811 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002812 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002813 nonvariantLibs = append(nonvariantLibs, entry)
2814 }
2815 }
2816 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002817
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002818}
2819
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002820func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2821 nonVariantLibs := []string{}
2822 variantLibs := []string{}
2823
2824 for _, lib := range libs {
2825 replaceLibName := GetReplaceModuleName(lib, replaceList)
2826 if replaceLibName == lib {
2827 // Do not handle any libs which are not in API imports
2828 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2829 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2830 variantLibs = append(variantLibs, replaceLibName)
2831 } else {
2832 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2833 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002834 }
2835
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002836 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002837}
2838
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002839func (c *Module) shouldUseApiSurface() bool {
2840 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2841 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2842 // LLNDK Variant
2843 return true
2844 }
2845
2846 if c.Properties.IsSdkVariant {
2847 // NDK Variant
2848 return true
2849 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002850 }
2851
2852 return false
2853}
2854
Colin Cross1e676be2016-10-12 14:38:15 -07002855func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002856 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002857 return
2858 }
2859
Colin Cross37047f12016-12-13 17:06:13 -08002860 ctx := &depsContext{
2861 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002862 moduleContextImpl: moduleContextImpl{
2863 mod: c,
2864 },
2865 }
2866 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002867
Colin Crossc99deeb2016-04-11 15:06:20 -07002868 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002869
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002870 apiNdkLibs := []string{}
2871 apiLateNdkLibs := []string{}
2872
Yo Chiang219968c2020-09-22 18:45:04 +08002873 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2874
Dan Albert914449f2016-06-17 16:45:24 -07002875 variantNdkLibs := []string{}
2876 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002877 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002878 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2879 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2880 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002881 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002882
Colin Cross32ec36c2016-12-15 07:39:51 -08002883 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002884 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002885 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002886 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002887 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002888
Spandan Das73bcafc2022-08-18 23:26:00 +00002889 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002890 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2891 if variationExists {
2892 actx.AddVariationDependencies(nil, depTag, lib)
2893 } else {
2894 // dependencies to ndk_headers fall here as ndk_headers do not have
2895 // any variants.
2896 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2897 }
Spandan Dasff665182024-09-11 18:48:44 +00002898 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002899 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002900 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002901 } else {
2902 actx.AddVariationDependencies(nil, depTag, lib)
2903 }
2904 }
2905
Dan Albertf1d14c72020-07-30 14:32:55 -07002906 if c.isNDKStubLibrary() {
2907 // NDK stubs depend on their implementation because the ABI dumps are
2908 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002909
Spandan Das8b08aea2023-03-14 19:29:34 +00002910 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2911 c.ImageVariation(),
2912 blueprint.Variation{Mutator: "link", Variation: "shared"},
2913 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002914 }
2915
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002916 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2917 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2918 c.Target().NativeBridge == android.NativeBridgeDisabled {
2919 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002920 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002921 llndkHeaderLibTag,
2922 deps.LlndkHeaderLibs...)
2923 }
2924
Jiyong Park5d1598f2019-02-25 22:14:17 +09002925 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002926 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002927
Jiyong Park5d1598f2019-02-25 22:14:17 +09002928 actx.AddVariationDependencies([]blueprint.Variation{
2929 {Mutator: "link", Variation: "static"},
2930 }, depTag, lib)
2931 }
2932
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002933 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002934 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002935 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002936
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002937 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002938 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002939 }
Jiyong Parke3867542020-12-03 17:28:25 +09002940 if inList(lib, deps.ExcludeLibsForApex) {
2941 depTag.excludeInApex = true
2942 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002943 actx.AddVariationDependencies([]blueprint.Variation{
2944 {Mutator: "link", Variation: "static"},
2945 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002946 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002947
Jooyung Han75568392020-03-20 04:29:24 +09002948 // staticUnwinderDep is treated as staticDep for Q apexes
2949 // so that native libraries/binaries are linked with static unwinder
2950 // because Q libc doesn't have unwinder APIs
2951 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002952 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002953 actx.AddVariationDependencies([]blueprint.Variation{
2954 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002955 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002956 }
2957
Jiyong Park7ed9de32018-10-15 22:25:07 +09002958 // shared lib names without the #version suffix
2959 var sharedLibNames []string
2960
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002961 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002962 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002963 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002964 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002965 }
Jiyong Parke3867542020-12-03 17:28:25 +09002966 if inList(lib, deps.ExcludeLibsForApex) {
2967 depTag.excludeInApex = true
2968 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002969 if inList(lib, deps.ExcludeLibsForNonApex) {
2970 depTag.excludeInNonApex = true
2971 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002972
Jiyong Park73c54ee2019-10-22 20:31:18 +09002973 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002974 sharedLibNames = append(sharedLibNames, name)
2975
Colin Crosse7257d22020-09-24 09:56:18 -07002976 variations := []blueprint.Variation{
2977 {Mutator: "link", Variation: "shared"},
2978 }
Spandan Dasff665182024-09-11 18:48:44 +00002979 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002980 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002981
Colin Crossfe9acfe2021-06-14 16:13:03 -07002982 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002983 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002984 actx.AddVariationDependencies([]blueprint.Variation{
2985 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002986 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002987 }
2988
Colin Cross3e5e7782022-06-17 22:17:05 +00002989 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002990 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002991 actx.AddVariationDependencies([]blueprint.Variation{
2992 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002993 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002994 }
2995
Jiyong Park7ed9de32018-10-15 22:25:07 +09002996 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002997 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002998 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2999 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
3000 // linking against both the stubs lib and the non-stubs lib at the same time.
3001 continue
3002 }
Colin Cross8acea3e2024-12-12 14:53:30 -08003003 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07003004 variations := []blueprint.Variation{
3005 {Mutator: "link", Variation: "shared"},
3006 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003007 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09003008 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003009
Dan Willemsen59339a22018-07-22 21:18:45 -07003010 actx.AddVariationDependencies([]blueprint.Variation{
3011 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04003012 }, dataLibDepTag, deps.DataLibs...)
3013
Colin Crossc8caa062021-09-24 16:50:14 -07003014 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
3015
Chris Parsons79d66a52020-06-05 17:26:16 -04003016 actx.AddVariationDependencies([]blueprint.Variation{
3017 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07003018 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08003019
Colin Cross68861832016-07-08 10:41:41 -07003020 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003021
3022 for _, gen := range deps.GeneratedHeaders {
3023 depTag := genHeaderDepTag
3024 if inList(gen, deps.ReexportGeneratedHeaders) {
3025 depTag = genHeaderExportDepTag
3026 }
3027 actx.AddDependency(c, depTag, gen)
3028 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003029
Cole Faust65cb40a2024-10-21 15:41:42 -07003030 for _, gen := range deps.DeviceFirstGeneratedHeaders {
3031 depTag := genHeaderDepTag
3032 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
3033 }
3034
Dan Albert92fe7402020-07-15 13:33:30 -07003035 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07003036 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07003037 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07003038 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09003039 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08003040 }
Colin Crossc465efd2021-06-11 18:00:04 -07003041 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07003042 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09003043 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07003044 }
Dan Willemsena0790e32018-10-12 00:24:23 -07003045 if deps.DynamicLinker != "" {
3046 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07003047 }
Dan Albert914449f2016-06-17 16:45:24 -07003048
3049 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07003050
Colin Cross8acea3e2024-12-12 14:53:30 -08003051 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07003052 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07003053 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07003054 {Mutator: "link", Variation: "shared"},
3055 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003056 actx.AddVariationDependencies([]blueprint.Variation{
3057 {Mutator: "version", Variation: version},
3058 {Mutator: "link", Variation: "shared"},
3059 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07003060
Colin Cross8acea3e2024-12-12 14:53:30 -08003061 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07003062 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07003063 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07003064 {Mutator: "link", Variation: "shared"},
3065 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003066 actx.AddVariationDependencies([]blueprint.Variation{
3067 {Mutator: "version", Variation: version},
3068 {Mutator: "link", Variation: "shared"},
3069 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08003070
Vinh Tran367d89d2023-04-28 11:21:25 -04003071 if len(deps.AidlLibs) > 0 {
3072 actx.AddDependency(
3073 c,
3074 aidlLibraryTag,
3075 deps.AidlLibs...,
3076 )
3077 }
3078
Colin Cross6362e272015-10-29 15:25:03 -07003079}
Colin Cross21b9a242015-03-24 14:15:58 -07003080
Colin Crosse40b4ea2018-10-02 22:25:58 -07003081func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07003082 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07003083 c.beginMutator(ctx)
3084 }
3085}
3086
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003087// Whether a module can link to another module, taking into
3088// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09003089func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07003090 tag blueprint.DependencyTag) {
3091
3092 switch t := tag.(type) {
3093 case dependencyTag:
3094 if t != vndkExtDepTag {
3095 return
3096 }
3097 case libraryDependencyTag:
3098 default:
3099 return
3100 }
3101
Ivan Lozanof9e21722020-12-02 09:00:51 -05003102 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003103 // Host code is not restricted
3104 return
3105 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003106
Ivan Lozano52767be2019-10-18 14:49:46 -07003107 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003108 // Platform code can link to anything
3109 return
3110 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08003111 if from.InRamdisk() {
3112 // Ramdisk code is not NDK
3113 return
3114 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003115 if from.InVendorRamdisk() {
3116 // Vendor ramdisk code is not NDK
3117 return
3118 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003119 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09003120 // Recovery code is not NDK
3121 return
3122 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003123 // Change this to LinkableInterface if Rust gets NDK support, which stubDecorators are for
Colin Cross31076b32020-10-23 17:22:06 -07003124 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003125 if c.StubDecorator() {
3126 // These aren't real libraries, but are the stub shared libraries that are included in
3127 // the NDK.
3128 return
3129 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003130 }
Logan Chien834b9a62019-01-14 15:39:03 +08003131
Ivan Lozano52767be2019-10-18 14:49:46 -07003132 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003133 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3134 // to link to libc++ (non-NDK and without sdk_version).
3135 return
3136 }
3137
Ivan Lozano52767be2019-10-18 14:49:46 -07003138 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003139 // NDK code linking to platform code is never okay.
3140 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003141 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003142 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003143 }
3144
3145 // At this point we know we have two NDK libraries, but we need to
3146 // check that we're not linking against anything built against a higher
3147 // API level, as it is only valid to link against older or equivalent
3148 // APIs.
3149
Inseob Kim01a28722018-04-11 09:48:45 +09003150 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003151 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003152 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003153 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003154 // Current can't be linked against by anything else.
3155 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003156 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003157 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003158 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003159 if err != nil {
3160 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003161 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003162 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003163 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003164 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003165 if err != nil {
3166 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003167 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003168 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003169 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003170
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003171 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003172 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003173 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003174 }
3175 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003176 }
Dan Albert202fe492017-12-15 13:56:59 -08003177
3178 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003179 fromStl := from.SelectedStl()
3180 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003181 if fromStl == "" || toStl == "" {
3182 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003183 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003184 // We can be permissive with the system "STL" since it is only the C++
3185 // ABI layer, but in the future we should make sure that everyone is
3186 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003187 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003188 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003189 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3190 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003191 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003192}
3193
Jooyung Han479ca172020-10-19 18:51:07 +09003194func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3195 if c, ok := ctx.Module().(*Module); ok {
3196 ctx.VisitDirectDeps(func(dep android.Module) {
3197 depTag := ctx.OtherModuleDependencyTag(dep)
3198 ccDep, ok := dep.(LinkableInterface)
3199 if ok {
3200 checkLinkType(ctx, c, ccDep, depTag)
3201 }
3202 })
3203 }
3204}
3205
Jiyong Park5fb8c102018-04-09 12:03:06 +09003206// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003207// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3208// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003209// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003210func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003211 check := func(child, parent android.Module) bool {
3212 to, ok := child.(*Module)
3213 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003214 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003215 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003216
Jooyung Hana70f0672019-01-18 15:20:43 +09003217 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3218 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003219 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003220
Jiyong Park0474e1f2021-01-14 14:26:06 +09003221 // These dependencies are not excercised at runtime. Tracking these will give us
3222 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003223 depTag := ctx.OtherModuleDependencyTag(child)
3224 if IsHeaderDepTag(depTag) {
3225 return false
3226 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003227 if depTag == staticVariantTag {
3228 return false
3229 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003230 if depTag == StubImplDepTag {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003231 return false
3232 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003233 if depTag == android.RequiredDepTag {
3234 return false
3235 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003236
Justin Yun63e9ec72020-10-29 16:49:43 +09003237 // Even if target lib has no vendor variant, keep checking dependency
3238 // graph in case it depends on vendor_available or product_available
3239 // but not double_loadable transtively.
3240 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003241 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003242 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003243
Jiyong Park0474e1f2021-01-14 14:26:06 +09003244 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3245 // one.
3246 if Bool(to.VendorProperties.Double_loadable) {
3247 return true
3248 }
3249
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003250 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003251 return false
3252 }
3253
Jooyung Hana70f0672019-01-18 15:20:43 +09003254 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3255 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003256 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003257 return false
3258 }
3259 if module, ok := ctx.Module().(*Module); ok {
3260 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003261 if lib.HasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003262 ctx.WalkDeps(check)
3263 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003264 }
3265 }
3266}
3267
Yu Liue4312402023-01-18 09:15:31 -08003268func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3269 // For the dependency from platform to apex, use the latest stubs
3270 apexSdkVersion := android.FutureApiLevel
3271 if !apexInfo.IsForPlatform() {
3272 apexSdkVersion = apexInfo.MinSdkVersion
3273 }
3274
3275 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3276 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3277 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3278 // (b/144430859)
3279 apexSdkVersion = android.FutureApiLevel
3280 }
3281
3282 return apexSdkVersion
3283}
3284
Colin Crossc99deeb2016-04-11 15:06:20 -07003285// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003286func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003287 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003288
Colin Cross0de8a1e2020-09-18 14:15:30 -07003289 var directStaticDeps []StaticLibraryInfo
3290 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003291
Colin Cross0de8a1e2020-09-18 14:15:30 -07003292 reexportExporter := func(exporter FlagExporterInfo) {
3293 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3294 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3295 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3296 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3297 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003298 }
3299
Colin Crossff694a82023-12-13 15:54:49 -08003300 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003301 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003302
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003303 skipModuleList := map[string]bool{}
3304
Yu Liu8024b922024-12-20 23:31:32 +00003305 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003306 depName := ctx.OtherModuleName(dep)
3307 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003308
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003309 if _, ok := skipModuleList[depName]; ok {
3310 // skip this module because original module or API imported module matching with this should be used instead.
3311 return
3312 }
3313
Yu Liu8024b922024-12-20 23:31:32 +00003314 var ccInfo *CcInfo
3315 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3316 if hasCcInfo {
3317 ccInfo = v
3318 }
3319 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003320 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003321 if !hasCcInfo {
3322 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3323 }
3324 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003325 return
3326 }
3327
Vinh Tran367d89d2023-04-28 11:21:25 -04003328 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003329 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003330 depPaths.AidlLibraryInfos = append(
3331 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003332 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003333 )
3334 }
3335 }
3336
Yu Liu8024b922024-12-20 23:31:32 +00003337 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003338 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003339 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003340 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003341 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003342 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003343 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003344 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003345 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003346 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003347 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003348 // Support exported headers from a generated_sources dependency
3349 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003350 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003351 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003352 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003353 genRule.GeneratedDeps...)
3354 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003355 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003356 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003357 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003358 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003359 genRule.GeneratedSourceFiles...)
3360 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003361 // 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 +09003362 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003363 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003364 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003365 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003366 }
Colin Crosscef792e2021-06-11 18:01:26 -07003367 case CrtBeginDepTag:
3368 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3369 case CrtEndDepTag:
3370 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003371 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003372 return
3373 }
3374
Colin Crossfe17f6f2019-03-28 19:30:56 -07003375 if depTag == android.ProtoPluginDepTag {
3376 return
3377 }
3378
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003379 if depTag == android.RequiredDepTag {
3380 return
3381 }
3382
Yu Liu8024b922024-12-20 23:31:32 +00003383 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3384 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003385 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 -07003386 return
3387 }
Yu Liu8024b922024-12-20 23:31:32 +00003388 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003389 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003390 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003391 return
3392 }
3393
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003394 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003395 // Skip reused objects for stub libraries, they use their own stub object file instead.
3396 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3397 // version mutator, so the stubs variant is created from the shared variant that
3398 // already has the reuseObjTag dependency on the static variant.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003399 if !c.library.BuildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003400 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003401 objs := staticAnalogue.ReuseObjects
3402 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003403 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003404 reexportExporter(depExporterInfo)
3405 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003406 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003407 }
3408
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003409 if depTag == llndkHeaderLibTag {
3410 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3411 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3412 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3413 }
3414
Yu Liu8024b922024-12-20 23:31:32 +00003415 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003416
3417 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3418 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003419 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003420 return
3421 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003422
Jiyong Parke3867542020-12-03 17:28:25 +09003423 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3424 return
3425 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003426 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3427 return
3428 }
Jiyong Parke3867542020-12-03 17:28:25 +09003429
Colin Cross313aa542023-12-13 13:47:44 -08003430 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003431
Colin Cross6e511a92020-07-27 21:26:48 -07003432 var ptr *android.Paths
3433 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003434
Colin Cross6e511a92020-07-27 21:26:48 -07003435 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003436
Colin Cross6e511a92020-07-27 21:26:48 -07003437 switch {
3438 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003439 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003440 if !ctx.Config().AllowMissingDependencies() {
3441 ctx.ModuleErrorf("module %q is not a header library", depName)
3442 } else {
3443 ctx.AddMissingDependencies([]string{depName})
3444 }
3445 return
3446 }
Colin Cross6e511a92020-07-27 21:26:48 -07003447 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003448 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003449 if !ctx.Config().AllowMissingDependencies() {
3450 ctx.ModuleErrorf("module %q is not a shared library", depName)
3451 } else {
3452 ctx.AddMissingDependencies([]string{depName})
3453 }
3454 return
3455 }
Jiyong Parke3867542020-12-03 17:28:25 +09003456
Jiyong Park7d55b612021-06-11 17:22:09 +09003457 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3458 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003459
Jiyong Park1ad8e162020-12-01 23:40:09 +09003460 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3461 // linkFile, depFile, and ptr.
3462 if c.IsStubs() {
3463 break
3464 }
3465
Colin Cross0de8a1e2020-09-18 14:15:30 -07003466 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3467 depFile = sharedLibraryInfo.TableOfContents
3468
Colin Crossb614cd42024-10-11 12:52:21 -07003469 if !sharedLibraryInfo.IsStubs {
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003470 // TODO(b/362509506): remove this additional check once all apex_exclude uses are switched to stubs.
3471 if !linkableInfo.RustApexExclude {
3472 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3473 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3474 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3475 }
Colin Crossb614cd42024-10-11 12:52:21 -07003476 }
3477 }
3478
Colin Cross6e511a92020-07-27 21:26:48 -07003479 ptr = &depPaths.SharedLibs
3480 switch libDepTag.Order {
3481 case earlyLibraryDependency:
3482 ptr = &depPaths.EarlySharedLibs
3483 depPtr = &depPaths.EarlySharedLibsDeps
3484 case normalLibraryDependency:
3485 ptr = &depPaths.SharedLibs
3486 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003487 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003488 case lateLibraryDependency:
3489 ptr = &depPaths.LateSharedLibs
3490 depPtr = &depPaths.LateSharedLibsDeps
3491 default:
3492 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003493 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003494
Colin Cross6e511a92020-07-27 21:26:48 -07003495 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003496 if linkableInfo.RustLibraryInterface {
3497 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003498 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3499 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3500 if libDepTag.wholeStatic {
3501 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3502 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003503
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003504 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3505 // exported functions from the rust generated staticlib still exported.
3506 if c.CcLibrary() && c.Shared() {
3507 c.WholeRustStaticlib = true
3508 }
Colin Cross6e511a92020-07-27 21:26:48 -07003509 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003510
Colin Cross6e511a92020-07-27 21:26:48 -07003511 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003512 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3513 if !isStaticLib {
3514 if !ctx.Config().AllowMissingDependencies() {
3515 ctx.ModuleErrorf("module %q is not a static library", depName)
3516 } else {
3517 ctx.AddMissingDependencies([]string{depName})
3518 }
3519 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003520 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003521
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003522 // Stubs lib doesn't link to the static lib dependencies. Don't set
3523 // linkFile, depFile, and ptr.
3524 if c.IsStubs() {
3525 break
3526 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003527
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003528 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3529 if libDepTag.wholeStatic {
3530 ptr = &depPaths.WholeStaticLibs
3531 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3532 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3533 } else {
3534 // This case normally catches prebuilt static
3535 // libraries, but it can also occur when
3536 // AllowMissingDependencies is on and the
3537 // dependencies has no sources of its own
3538 // but has a whole_static_libs dependency
3539 // on a missing library. We want to depend
3540 // on the .a file so that there is something
3541 // in the dependency tree that contains the
3542 // error rule for the missing transitive
3543 // dependency.
3544 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3545 }
3546 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3547 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3548 } else {
3549 switch libDepTag.Order {
3550 case earlyLibraryDependency:
3551 panic(fmt.Errorf("early static libs not supported"))
3552 case normalLibraryDependency:
3553 // static dependencies will be handled separately so they can be ordered
3554 // using transitive dependencies.
3555 ptr = nil
3556 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3557 case lateLibraryDependency:
3558 ptr = &depPaths.LateStaticLibs
3559 default:
3560 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3561 }
3562 }
3563
3564 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3565 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3566
3567 if libDepTag.unexportedSymbols {
3568 depPaths.LdFlags = append(depPaths.LdFlags,
3569 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3570 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003571 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003572 }
3573
Yu Liu8024b922024-12-20 23:31:32 +00003574 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3575 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003576 ctx.ModuleErrorf("module %q not a static library", depName)
3577 return
3578 }
Logan Chien43d34c32017-12-20 01:17:32 +08003579
Colin Cross6e511a92020-07-27 21:26:48 -07003580 // When combining coverage files for shared libraries and executables, coverage files
3581 // in static libraries act as if they were whole static libraries. The same goes for
3582 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003583 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003584 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003585 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003586 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003587 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003588 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003589 // Handle non-CC modules here
3590 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003591 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003592 }
3593 }
3594
Colin Cross6e511a92020-07-27 21:26:48 -07003595 if ptr != nil {
3596 if !linkFile.Valid() {
3597 if !ctx.Config().AllowMissingDependencies() {
3598 ctx.ModuleErrorf("module %q missing output file", depName)
3599 } else {
3600 ctx.AddMissingDependencies([]string{depName})
3601 }
3602 return
3603 }
3604 *ptr = append(*ptr, linkFile.Path())
3605 }
3606
3607 if depPtr != nil {
3608 dep := depFile
3609 if !dep.Valid() {
3610 dep = linkFile
3611 }
3612 *depPtr = append(*depPtr, dep.Path())
3613 }
3614
Colin Cross0de8a1e2020-09-18 14:15:30 -07003615 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3616 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3617 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3618 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003619 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3620
3621 // Only re-export RustRlibDeps for cc static libs
3622 if c.static() {
3623 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3624 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003625
3626 if libDepTag.reexportFlags {
3627 reexportExporter(depExporterInfo)
3628 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3629 // Re-exported shared library headers must be included as well since they can help us with type information
3630 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003631 c.sabi.Properties.ReexportedIncludes = append(
3632 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003633 c.sabi.Properties.ReexportedSystemIncludes = append(
3634 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003635 }
3636
Yu Liu0a37d422025-02-13 02:05:00 +00003637 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, commonInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003638 switch {
3639 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003640 c.Properties.AndroidMkHeaderLibs = append(
3641 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003642 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003643 // Note: the order of libs in this list is not important because
3644 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003645 c.Properties.AndroidMkSharedLibs = append(
3646 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003647 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003648 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003649 if libDepTag.wholeStatic {
3650 c.Properties.AndroidMkWholeStaticLibs = append(
3651 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3652 } else {
3653 c.Properties.AndroidMkStaticLibs = append(
3654 c.Properties.AndroidMkStaticLibs, makeLibName)
3655 }
Colin Cross6e511a92020-07-27 21:26:48 -07003656 }
3657 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003658 } else if !c.IsStubs() {
3659 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3660
Colin Cross6e511a92020-07-27 21:26:48 -07003661 switch depTag {
3662 case runtimeDepTag:
3663 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu0a37d422025-02-13 02:05:00 +00003664 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo,
3665 commonInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003666 case objDepTag:
3667 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3668 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003669 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003670 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003671 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003672 case dynamicLinkerDepTag:
3673 depPaths.DynamicLinker = linkFile
3674 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003675 }
Colin Crossca860ac2016-01-04 14:34:37 -08003676 })
3677
Jeff Gaston294356f2017-09-27 17:05:30 -07003678 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003679 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3680 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3681 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003682
Colin Crossdd84e052017-05-17 13:44:16 -07003683 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003684 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003685 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3686 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003687 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003688 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3689
Jiyong Park74955042019-10-22 20:19:51 +09003690 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3691 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003692 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003693 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003694 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003695 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003696
3697 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003698 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003699 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003700 }
Colin Crossdd84e052017-05-17 13:44:16 -07003701
Colin Crossca860ac2016-01-04 14:34:37 -08003702 return depPaths
3703}
3704
Yu Liuf6f85492025-01-13 21:02:36 +00003705func ShouldUseStubForApex(ctx android.ModuleContext, parent android.Module, dep android.ModuleProxy) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003706 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003707 bootstrap := false
Yu Liuf6f85492025-01-13 21:02:36 +00003708 if ctx.EqualModules(ctx.Module(), parent) {
3709 if linkable, ok := parent.(LinkableInterface); !ok {
3710 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3711 } else {
3712 inVendorOrProduct = linkable.InVendorOrProduct()
3713 bootstrap = linkable.Bootstrap()
3714 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003715 } else {
Yu Liuf6f85492025-01-13 21:02:36 +00003716 if linkable, ok := android.OtherModuleProvider(ctx, parent, LinkableInfoProvider); !ok {
3717 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3718 } else {
3719 inVendorOrProduct = linkable.InVendorOrProduct
3720 bootstrap = linkable.Bootstrap
3721 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003722 }
3723
Spandan Das10c41362024-12-03 01:33:09 +00003724 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003725
3726 useStubs := false
3727
Yu Liu8024b922024-12-20 23:31:32 +00003728 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003729 if !apexInfo.IsForPlatform() {
3730 // For platform libraries, use current version of LLNDK
3731 // If this is for use_vendor apex we will apply the same rules
3732 // of apex sdk enforcement below to choose right version.
3733 useStubs = true
3734 }
3735 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3736 // If not building for APEX or the containing APEX allows the use of
3737 // platform APIs, use stubs only when it is from an APEX (and not from
3738 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3739 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003740 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003741
Spandan Dasff665182024-09-11 18:48:44 +00003742 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003743 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003744 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3745 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003746 }
3747
3748 return useStubs
3749}
3750
3751// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3752// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3753// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3754// has different level of updatability. For example, if a library foo in an APEX depends on a
3755// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3756// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3757// same APEX as foo, the non-stub variant of bar is used.
Yu Liuf6f85492025-01-13 21:02:36 +00003758func ChooseStubOrImpl(ctx android.ModuleContext, dep android.ModuleProxy) (SharedLibraryInfo, FlagExporterInfo) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003759 depTag := ctx.OtherModuleDependencyTag(dep)
3760 libDepTag, ok := depTag.(libraryDependencyTag)
3761 if !ok || !libDepTag.shared() {
3762 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3763 }
3764
Colin Cross313aa542023-12-13 13:47:44 -08003765 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3766 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3767 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003768
3769 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003770 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003771 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003772 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3773 toUse := stubs[len(stubs)-1]
3774 sharedLibraryInfo = toUse.SharedLibraryInfo
3775 depExporterInfo = toUse.FlagExporterInfo
3776 }
3777 }
3778 return sharedLibraryInfo, depExporterInfo
3779}
3780
Colin Cross0de8a1e2020-09-18 14:15:30 -07003781// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3782// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003783// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003784// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003785func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3786 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003787 var staticPaths android.Paths
3788 for _, staticDep := range staticDeps {
3789 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3790 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3791 }
3792 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003793 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003794 }
3795 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3796
3797 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3798
3799 // reorder the dependencies based on transitive dependencies
3800 staticPaths = android.FirstUniquePaths(staticPaths)
3801 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3802
3803 if len(orderedStaticPaths) != len(staticPaths) {
3804 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3805 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3806 }
3807
3808 return orderedStaticPaths, transitiveStaticLibs
3809}
3810
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003811// BaseLibName trims known prefixes and suffixes
3812func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003813 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3814 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003815 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003816 return libName
3817}
3818
Yu Liu8024b922024-12-20 23:31:32 +00003819func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003820 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003821 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3822 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003823
Yu Liu8024b922024-12-20 23:31:32 +00003824 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003825 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003826 if ccInfo.SnapshotInfo != nil {
Yu Liu0a37d422025-02-13 02:05:00 +00003827 return commonInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003828 }
3829 }
3830
Yu Liu8024b922024-12-20 23:31:32 +00003831 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003832 // The vendor and product modules in Make will have been renamed to not conflict with the
3833 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003834 return libName + linkableInfo.SubName
3835 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003836 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003837 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003838 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003839 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003840 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003841 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003842 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003843 } else {
3844 return libName
3845 }
3846}
3847
Colin Crossca860ac2016-01-04 14:34:37 -08003848func (c *Module) InstallInData() bool {
3849 if c.installer == nil {
3850 return false
3851 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003852 return c.installer.inData()
3853}
3854
3855func (c *Module) InstallInSanitizerDir() bool {
3856 if c.installer == nil {
3857 return false
3858 }
3859 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003860 return true
3861 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003862 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003863}
3864
Yifan Hong1b3348d2020-01-21 15:53:22 -08003865func (c *Module) InstallInRamdisk() bool {
3866 return c.InRamdisk()
3867}
3868
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003869func (c *Module) InstallInVendorRamdisk() bool {
3870 return c.InVendorRamdisk()
3871}
3872
Jiyong Parkf9332f12018-02-01 00:54:12 +09003873func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003874 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003875}
3876
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003877func (c *Module) MakeUninstallable() {
3878 if c.installer == nil {
3879 c.ModuleBase.MakeUninstallable()
3880 return
3881 }
3882 c.installer.makeUninstallable(c)
3883}
3884
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003885func (c *Module) HostToolPath() android.OptionalPath {
3886 if c.installer == nil {
3887 return android.OptionalPath{}
3888 }
3889 return c.installer.hostToolPath()
3890}
3891
Nan Zhangd4e641b2017-07-12 12:55:28 -07003892func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3893 return c.outputFile
3894}
3895
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003896func (c *Module) static() bool {
3897 if static, ok := c.linker.(interface {
3898 static() bool
3899 }); ok {
3900 return static.static()
3901 }
3902 return false
3903}
3904
Colin Cross6a730042024-12-05 13:53:43 -08003905func (c *Module) staticLibrary() bool {
3906 if static, ok := c.linker.(interface {
3907 staticLibrary() bool
3908 }); ok {
3909 return static.staticLibrary()
3910 }
3911 return false
3912}
3913
Jiyong Park379de2f2018-12-19 02:47:14 +09003914func (c *Module) staticBinary() bool {
3915 if static, ok := c.linker.(interface {
3916 staticBinary() bool
3917 }); ok {
3918 return static.staticBinary()
3919 }
3920 return false
3921}
3922
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003923func (c *Module) testBinary() bool {
3924 if test, ok := c.linker.(interface {
3925 testBinary() bool
3926 }); ok {
3927 return test.testBinary()
3928 }
3929 return false
3930}
3931
Jingwen Chen537242c2022-08-24 11:53:27 +00003932func (c *Module) testLibrary() bool {
3933 if test, ok := c.linker.(interface {
3934 testLibrary() bool
3935 }); ok {
3936 return test.testLibrary()
3937 }
3938 return false
3939}
3940
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003941func (c *Module) benchmarkBinary() bool {
3942 if b, ok := c.linker.(interface {
3943 benchmarkBinary() bool
3944 }); ok {
3945 return b.benchmarkBinary()
3946 }
3947 return false
3948}
3949
3950func (c *Module) fuzzBinary() bool {
3951 if f, ok := c.linker.(interface {
3952 fuzzBinary() bool
3953 }); ok {
3954 return f.fuzzBinary()
3955 }
3956 return false
3957}
3958
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003959// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3960func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003961 if h, ok := c.linker.(interface {
3962 header() bool
3963 }); ok {
3964 return h.header()
3965 }
3966 return false
3967}
3968
Ivan Lozanod7586b62021-04-01 09:49:36 -04003969func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003970 if b, ok := c.linker.(interface {
3971 binary() bool
3972 }); ok {
3973 return b.binary()
3974 }
3975 return false
3976}
3977
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003978func (c *Module) ForceDisableSanitizers() {
3979 c.sanitize.Properties.ForceDisable = true
3980}
3981
Justin Yun5e035862021-06-29 20:50:37 +09003982func (c *Module) StaticExecutable() bool {
3983 if b, ok := c.linker.(*binaryDecorator); ok {
3984 return b.static()
3985 }
3986 return false
3987}
3988
Ivan Lozanod7586b62021-04-01 09:49:36 -04003989func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003990 if o, ok := c.linker.(interface {
3991 object() bool
3992 }); ok {
3993 return o.object()
3994 }
3995 return false
3996}
3997
Kiyoung Kim37693d02024-04-04 09:56:15 +09003998func (m *Module) Dylib() bool {
3999 return false
4000}
4001
4002func (m *Module) Rlib() bool {
4003 return false
4004}
4005
Ivan Lozanof9e21722020-12-02 09:00:51 -05004006func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09004007 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08004008 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05004009 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09004010 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05004011 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09004012 return "native:product"
4013 }
Jooyung Han38002912019-05-16 04:01:54 +09004014 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08004015 } else if c.InRamdisk() {
4016 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07004017 } else if c.InVendorRamdisk() {
4018 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07004019 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07004020 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05004021 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07004022 return "native:ndk:none:none"
4023 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
4024 //family, link := getNdkStlFamilyAndLinkType(c)
4025 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
4026 } else {
4027 return "native:platform"
4028 }
4029}
4030
Jiyong Park9d452992018-10-03 00:38:19 +09004031// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07004032// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09004033func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07004034 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09004035 // Stub libs and prebuilt libs in a versioned SDK are not
4036 // installable to APEX even though they are shared libs.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004037 return lib.shared() && !lib.BuildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09004038 }
4039 return false
4040}
4041
Jiyong Parka90ca002019-10-07 15:47:24 +09004042func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00004043 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
4044}
4045
4046func (c *Module) ApexAvailableFor() []string {
4047 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09004048 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00004049 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09004050 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00004051 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09004052 }
Yu Liub73c3a62024-12-10 00:58:06 +00004053
4054 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09004055}
4056
Paul Duffin0cb37b92020-03-04 14:52:46 +00004057func (c *Module) EverInstallable() bool {
4058 return c.installer != nil &&
4059 // Check to see whether the module is actually ever installable.
4060 c.installer.everInstallable()
4061}
4062
Ivan Lozanod7586b62021-04-01 09:49:36 -04004063func (c *Module) PreventInstall() bool {
4064 return c.Properties.PreventInstall
4065}
4066
4067func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07004068 if c.library != nil {
4069 if i := c.library.installable(); i != nil {
4070 return i
4071 }
4072 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04004073 return c.Properties.Installable
4074}
4075
4076func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00004077 ret := c.EverInstallable() &&
4078 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04004079 proptools.BoolDefault(c.Installable(), true) &&
4080 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004081
4082 // The platform variant doesn't need further condition. Apex variants however might not
4083 // be installable because it will likely to be included in the APEX and won't appear
4084 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07004085 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004086 return ret
4087 }
4088
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004089 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09004090}
4091
Logan Chien41eabe62019-04-10 13:33:58 +08004092func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
4093 if c.linker != nil {
4094 if library, ok := c.linker.(*libraryDecorator); ok {
4095 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
4096 }
4097 }
4098}
4099
Jiyong Park45bf82e2020-12-15 22:29:02 +09004100var _ android.ApexModule = (*Module)(nil)
4101
4102// Implements android.ApexModule
Yu Liuf1806032025-02-07 00:23:34 +00004103func (c *Module) GetDepInSameApexChecker() android.DepInSameApexChecker {
4104 return CcDepInSameApexChecker{
4105 Static: c.static(),
4106 HasStubsVariants: c.HasStubsVariants(),
4107 IsLlndk: c.IsLlndk(),
4108 Host: c.Host(),
4109 }
4110}
4111
4112type CcDepInSameApexChecker struct {
4113 Static bool
4114 HasStubsVariants bool
4115 IsLlndk bool
4116 Host bool
4117}
4118
4119func (c CcDepInSameApexChecker) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004120 if depTag == StubImplDepTag {
Colin Crossc1b36442021-05-06 13:42:48 -07004121 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004122 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004123 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004124 if depTag == staticVariantTag {
4125 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4126 // actually mean that the static lib (and its dependencies) are copied into the
4127 // APEX.
4128 return false
4129 }
Colin Cross8acea3e2024-12-12 14:53:30 -08004130
4131 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
Yu Liuf1806032025-02-07 00:23:34 +00004132 if isLibDepTag && c.Static && libDepTag.shared() {
Colin Cross8acea3e2024-12-12 14:53:30 -08004133 // shared_lib dependency from a static lib is considered as crossing
4134 // the APEX boundary because the dependency doesn't actually is
4135 // linked; the dependency is used only during the compilation phase.
4136 return false
4137 }
4138
4139 if isLibDepTag && libDepTag.excludeInApex {
4140 return false
4141 }
4142
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004143 return true
4144}
4145
Yu Liuf1806032025-02-07 00:23:34 +00004146func (c CcDepInSameApexChecker) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
4147 if c.Host {
Colin Cross1cea5302024-12-03 16:40:08 -08004148 return false
4149 }
Yu Liuf1806032025-02-07 00:23:34 +00004150 if c.HasStubsVariants {
Colin Crossbd930bc2025-02-03 12:17:42 -08004151 if IsSharedDepTag(depTag) && !IsExplicitImplSharedDepTag(depTag) {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004152 // dynamic dep to a stubs lib crosses APEX boundary
4153 return false
4154 }
4155 if IsRuntimeDepTag(depTag) {
4156 // runtime dep to a stubs lib also crosses APEX boundary
4157 return false
4158 }
4159 if IsHeaderDepTag(depTag) {
4160 return false
4161 }
4162 }
Yu Liuf1806032025-02-07 00:23:34 +00004163 if c.IsLlndk {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004164 return false
4165 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004166
4167 return true
4168}
4169
Jiyong Park45bf82e2020-12-15 22:29:02 +09004170// Implements android.ApexModule
Yu Liudf0b8392025-02-12 18:27:03 +00004171func (c *Module) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel {
Jooyung Han749dc692020-04-15 11:03:39 +09004172 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4173 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
Yu Liudf0b8392025-02-12 18:27:03 +00004174 return android.MinApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004175 }
Jooyung Han749dc692020-04-15 11:03:39 +09004176 // We don't check for prebuilt modules
4177 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
Yu Liudf0b8392025-02-12 18:27:03 +00004178 return android.MinApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004179 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004180
Jooyung Han749dc692020-04-15 11:03:39 +09004181 minSdkVersion := c.MinSdkVersion()
4182 if minSdkVersion == "apex_inherit" {
Yu Liudf0b8392025-02-12 18:27:03 +00004183 return android.MinApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004184 }
4185 if minSdkVersion == "" {
4186 // JNI libs within APK-in-APEX fall into here
4187 // Those are okay to set sdk_version instead
4188 // We don't have to check if this is a SDK variant because
4189 // non-SDK variant resets sdk_version, which works too.
4190 minSdkVersion = c.SdkVersion()
4191 }
Yu Liudf0b8392025-02-12 18:27:03 +00004192
Dan Albertc8060532020-07-22 22:32:17 -07004193 if minSdkVersion == "" {
Yu Liudf0b8392025-02-12 18:27:03 +00004194 return android.NoneApiLevel
Dan Albertc8060532020-07-22 22:32:17 -07004195 }
Yu Liudf0b8392025-02-12 18:27:03 +00004196
Dan Albertc8060532020-07-22 22:32:17 -07004197 // Not using nativeApiLevelFromUser because the context here is not
4198 // necessarily a native context.
Yu Liudf0b8392025-02-12 18:27:03 +00004199 ver, err := android.ApiLevelFromUserWithConfig(ctx.Config(), minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004200 if err != nil {
Yu Liudf0b8392025-02-12 18:27:03 +00004201 return android.NoneApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004202 }
Dan Albertc8060532020-07-22 22:32:17 -07004203
Colin Cross8ca61c12022-10-06 21:00:14 -07004204 // A dependency only needs to support a min_sdk_version at least
4205 // as high as the api level that the architecture was introduced in.
4206 // This allows introducing new architectures in the platform that
4207 // need to be included in apexes that normally require an older
4208 // min_sdk_version.
Yu Liudf0b8392025-02-12 18:27:03 +00004209 if c.Enabled(ctx) {
4210 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
4211 if ver.LessThanOrEqualTo(minApiForArch) {
4212 ver = android.MinApiLevel
4213 }
Colin Cross8ca61c12022-10-06 21:00:14 -07004214 }
4215
Yu Liudf0b8392025-02-12 18:27:03 +00004216 return ver
Jooyung Han749dc692020-04-15 11:03:39 +09004217}
4218
Paul Duffinb5769c12021-05-12 16:16:51 +01004219// Implements android.ApexModule
4220func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4221 // stub libraries and native bridge libraries are always available to platform
4222 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4223}
4224
Inseob Kima1888ce2022-10-04 14:42:02 +09004225func (c *Module) overriddenModules() []string {
4226 if o, ok := c.linker.(overridable); ok {
4227 return o.overriddenModules()
4228 }
4229 return nil
4230}
4231
Liz Kammer35ca77e2021-12-22 15:31:40 -05004232type moduleType int
4233
4234const (
4235 unknownType moduleType = iota
4236 binary
4237 object
4238 fullLibrary
4239 staticLibrary
4240 sharedLibrary
4241 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004242 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004243 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004244)
4245
4246func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004247 if c.testBinary() {
4248 // testBinary is also a binary, so this comes before the c.Binary()
4249 // conditional. A testBinary has additional implicit dependencies and
4250 // other test-only semantics.
4251 return testBin
4252 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004253 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004254 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004255 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004256 } else if c.testLibrary() {
4257 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4258 // will let them add implicit compile deps on gtest, for example.
4259 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004260 // For now, treat them as regular libraries.
4261 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004262 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004263 static := false
4264 shared := false
4265 if library, ok := c.linker.(*libraryDecorator); ok {
4266 static = library.MutatedProperties.BuildStatic
4267 shared = library.MutatedProperties.BuildShared
4268 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4269 static = library.MutatedProperties.BuildStatic
4270 shared = library.MutatedProperties.BuildShared
4271 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004272 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004273 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004274 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004275 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004276 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004277 return staticLibrary
4278 }
4279 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004280 } else if c.isNDKStubLibrary() {
4281 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004282 }
4283 return unknownType
4284}
4285
Colin Crosscfad1192015-11-02 16:43:11 -08004286// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004287type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004288 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004289 android.DefaultsModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004290}
4291
Patrice Arrudac249c712019-03-19 17:00:29 -07004292// cc_defaults provides a set of properties that can be inherited by other cc
4293// modules. A module can use the properties from a cc_defaults using
4294// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4295// merged (when possible) by prepending the default module's values to the
4296// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004297func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004298 return DefaultsFactory()
4299}
4300
Colin Cross36242852017-06-23 15:06:31 -07004301func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004302 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004303
Colin Cross36242852017-06-23 15:06:31 -07004304 module.AddProperties(props...)
4305 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004306 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004307 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004308 &BaseCompilerProperties{},
4309 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004310 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004311 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004312 &StaticProperties{},
4313 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004314 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004315 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004316 &TestLinkerProperties{},
4317 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004318 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004319 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004320 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004321 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004322 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004323 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004324 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004325 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004326 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004327 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004328 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004329 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004330 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004331 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004332 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4333 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004334 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004335 )
Colin Crosscfad1192015-11-02 16:43:11 -08004336
Jooyung Hancc372c52019-09-25 15:18:44 +09004337 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004338
4339 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004340}
4341
Jiyong Park2286afd2020-06-16 21:58:53 +09004342func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004343 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004344}
4345
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004346func kytheExtractAllFactory() android.Singleton {
4347 return &kytheExtractAllSingleton{}
4348}
4349
4350type kytheExtractAllSingleton struct {
4351}
4352
4353func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4354 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004355 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004356 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004357 if len(files) > 0 {
4358 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004359 }
4360 })
4361 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4362 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004363 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004364 }
4365}
4366
Jihoon Kangf78a8902022-09-01 22:47:07 +00004367func (c *Module) Partition() string {
4368 if p, ok := c.installer.(interface {
4369 getPartition() string
4370 }); ok {
4371 return p.getPartition()
4372 }
4373 return ""
4374}
4375
Spandan Das2b6dfb52024-01-19 00:22:22 +00004376type sourceModuleName interface {
4377 sourceModuleName() string
4378}
4379
4380func (c *Module) BaseModuleName() string {
4381 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4382 // if the prebuilt module sets a source_module_name in Android.bp, use that
4383 return smn.sourceModuleName()
4384 }
4385 return c.ModuleBase.BaseModuleName()
4386}
4387
Spandan Dase20c56c2024-07-23 21:34:24 +00004388func (c *Module) stubsSymbolFilePath() android.Path {
4389 if library, ok := c.linker.(*libraryDecorator); ok {
4390 return library.stubsSymbolFilePath
4391 }
4392 return android.OptionalPath{}.Path()
4393}
4394
Colin Cross06a931b2015-10-28 17:23:31 -07004395var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004396var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004397var BoolPtr = proptools.BoolPtr
4398var String = proptools.String
4399var StringPtr = proptools.StringPtr