blob: f9ff065181c4b36b5cac3c0b6b3e1712536097c4 [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 Liu986d98c2024-11-12 00:28:11 +0000196}
197
Yu Liu8024b922024-12-20 23:31:32 +0000198var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
Yu Liu986d98c2024-11-12 00:28:11 +0000199
Colin Cross463a90e2015-06-17 14:20:06 -0700200func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000201 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700202
Inseob Kim3b244062023-07-11 13:31:36 +0900203 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000204 pctx.Import("android/soong/cc/config")
205}
206
207func RegisterCCBuildComponents(ctx android.RegistrationContext) {
208 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
209
210 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700211 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700212 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700213 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700214 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700215 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700216 })
Colin Cross16b23492016-01-06 14:41:07 -0800217
Paul Duffin036e7002019-12-19 19:16:28 +0000218 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400219 for _, san := range Sanitizers {
220 san.registerMutators(ctx)
221 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800222
Colin Cross8a962802024-10-09 15:29:27 -0700223 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
224 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800225
Colin Cross597bad62024-10-08 15:10:55 -0700226 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000227
Colin Crossf5f4ad32024-01-19 15:41:48 -0800228 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700229
Colin Crossd38feb02024-01-23 16:38:06 -0800230 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800231
Colin Cross33e0c812024-01-23 16:36:07 -0800232 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000233
Colin Cross6ac83a82024-01-23 11:23:10 -0800234 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900235
Colin Cross8a962802024-10-09 15:29:27 -0700236 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
237 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700238 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700239
Colin Cross91ae5ec2024-10-01 14:03:40 -0700240 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800241 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700242 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800243 })
244
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000245 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700246}
247
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500248// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
249// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
250// edges to these modules.
251// This object is constructed in DepsMutator, by calling to various module delegates to set
252// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
253// dependencies.
254// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
255// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800256type Deps struct {
257 SharedLibs, LateSharedLibs []string
258 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800259 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800260 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700261
Colin Cross3e5e7782022-06-17 22:17:05 +0000262 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
263 // prevent automatically exporting symbols.
264 UnexportedStaticLibs []string
265
Chris Parsons79d66a52020-06-05 17:26:16 -0400266 // Used for data dependencies adjacent to tests
267 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700268 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400269
Yo Chiang219968c2020-09-22 18:45:04 +0800270 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
271 SystemSharedLibs []string
272
Vinh Tran367d89d2023-04-28 11:21:25 -0400273 // Used by DepMutator to pass aidl_library modules to aidl compiler
274 AidlLibs []string
275
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500276 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800277 StaticUnwinderIfLegacy bool
278
Colin Cross5950f382016-12-13 12:50:57 -0800279 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700280
Colin Cross81413472016-04-11 14:37:39 -0700281 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700282
Cole Faust65cb40a2024-10-21 15:41:42 -0700283 GeneratedSources []string
284 GeneratedHeaders []string
285 DeviceFirstGeneratedHeaders []string
286 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700287
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700288 ReexportGeneratedHeaders []string
289
Colin Crossc465efd2021-06-11 18:00:04 -0700290 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700291
292 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700293 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900294
295 // List of libs that need to be excluded for APEX variant
296 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900297 // List of libs that need to be excluded for non-APEX variant
298 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800299
300 // LLNDK headers for the ABI checker to check LLNDK implementation library.
301 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700302 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800303 // Instead, the LLNDK implementation depends on the LLNDK header libs.
304 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700305}
306
Ivan Lozano0a468a42024-05-13 21:03:34 -0400307// A struct which to collect flags for rlib dependencies
308type RustRlibDep struct {
309 LibPath android.Path // path to the rlib
310 LinkDirs []string // flags required for dependency (e.g. -L flags)
311 CrateName string // crateNames associated with rlibDeps
312}
313
314func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
315 return a.LibPath == b.LibPath
316}
317
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500318// PathDeps is a struct containing file paths to dependencies of a module.
319// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
320// It's used to construct flags for various build statements (such as for compiling and linking).
321// It is then passed to module decorator functions responsible for registering build statements
322// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800323type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700324 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900325 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700326 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900327 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700328 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700329 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400330 // Paths and crateNames for RustStaticLib dependencies
331 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700332
Colin Cross0de8a1e2020-09-18 14:15:30 -0700333 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700334 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700335
Colin Cross26c34ed2016-09-30 17:10:16 -0700336 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100337 Objs Objects
338 // Paths to .o files in dependencies that provide them. Note that these lists
339 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800340 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700341 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700342
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100343 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
344 // the libs from all whole_static_lib dependencies.
345 WholeStaticLibsFromPrebuilts android.Paths
346
Colin Cross26c34ed2016-09-30 17:10:16 -0700347 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700348 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900349 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700350
Inseob Kimd110f872019-12-06 13:15:38 +0900351 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000352 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900353 IncludeDirs android.Paths
354 SystemIncludeDirs android.Paths
355 ReexportedDirs android.Paths
356 ReexportedSystemDirs android.Paths
357 ReexportedFlags []string
358 ReexportedGeneratedHeaders android.Paths
359 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400360 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700361
Colin Cross26c34ed2016-09-30 17:10:16 -0700362 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700363 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700364
Dan Willemsena0790e32018-10-12 00:24:23 -0700365 // Path to the dynamic linker binary
366 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700367
368 // For Darwin builds, the path to the second architecture's output that should
369 // be combined with this architectures's output into a FAT MachO file.
370 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400371
372 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
373 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800374
375 // LLNDK headers for the ABI checker to check LLNDK implementation library.
376 LlndkIncludeDirs android.Paths
377 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700378
379 directImplementationDeps android.Paths
380 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700381}
382
Colin Cross4af21ed2019-11-04 09:37:55 -0800383// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
384// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
385// command line so they can be overridden by the local module flags).
386type LocalOrGlobalFlags struct {
387 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700388 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800389 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700390 CFlags []string // Flags that apply to C and C++ source files
391 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
392 ConlyFlags []string // Flags that apply to C source files
393 CppFlags []string // Flags that apply to C++ source files
394 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700395 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800396}
397
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500398// Flags contains various types of command line flags (and settings) for use in building build
399// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800400type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500401 // Local flags (which individual modules are responsible for). These may override global flags.
402 Local LocalOrGlobalFlags
403 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700404 Global LocalOrGlobalFlags
405 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800406
407 aidlFlags []string // Flags that apply to aidl source files
408 rsFlags []string // Flags that apply to renderscript source files
409 libFlags []string // Flags to add libraries early to the link order
410 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
411 TidyFlags []string // Flags that apply to clang-tidy
412 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700413
Colin Crossc3199482017-03-30 15:03:04 -0700414 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800415 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700416 SystemIncludeFlags []string
417
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800418 Toolchain config.Toolchain
419 Tidy bool // True if ninja .tidy rules should be generated.
420 NeedTidyFiles bool // True if module link should depend on .tidy files
421 GcovCoverage bool // True if coverage files should be generated.
422 SAbiDump bool // True if header abi dumps should be generated.
423 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800424 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800425
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500426 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800427 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500428 // The target-device system path to the dynamic linker.
429 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800430
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700431 CFlagsDeps android.Paths // Files depended on by compiler flags
432 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800433
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500434 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700435 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800436
Colin Cross19878da2019-03-28 14:45:07 -0700437 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700438 protoC bool // Whether to use C instead of C++
439 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700440
441 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200442 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700443}
444
Colin Crossca860ac2016-01-04 14:34:37 -0800445// Properties used to compile all C or C++ modules
446type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700447 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800448 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700449
Yi Kong5786f5c2024-05-28 02:22:34 +0900450 // Aggresively trade performance for smaller binary size.
451 // This should only be used for on-device binaries that are rarely executed and not
452 // performance critical.
453 Optimize_for_size *bool `android:"arch_variant"`
454
Jiyong Parkb35a8192020-08-10 15:59:36 +0900455 // The API level that this module is built against. The APIs of this API level will be
456 // visible at build time, but use of any APIs newer than min_sdk_version will render the
457 // module unloadable on older devices. In the future it will be possible to weakly-link new
458 // APIs, making the behavior match Java: such modules will load on older devices, but
459 // calling new APIs on devices that do not support them will result in a crash.
460 //
461 // This property has the same behavior as sdk_version does for Java modules. For those
462 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
463 // does for Java code.
464 //
465 // In addition, setting this property causes two variants to be built, one for the platform
466 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800467 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700468
Jiyong Parkb35a8192020-08-10 15:59:36 +0900469 // Minimum OS API level supported by this C or C++ module. This property becomes the value
470 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
471 // this property is also used to ensure that the min_sdk_version of the containing module is
472 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
473 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
474 // min_sdk_version of the containing APEX. When the module
475 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900476 Min_sdk_version *string
477
Colin Crossc511bc52020-04-07 16:50:32 +0000478 // If true, always create an sdk variant and don't create a platform variant.
479 Sdk_variant_only *bool
480
Colin Cross4297f402024-11-20 15:20:09 -0800481 AndroidMkSharedLibs []string `blueprint:"mutated"`
482 AndroidMkStaticLibs []string `blueprint:"mutated"`
483 AndroidMkRlibs []string `blueprint:"mutated"`
484 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
485 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
486 AndroidMkHeaderLibs []string `blueprint:"mutated"`
487 HideFromMake bool `blueprint:"mutated"`
488 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700489
Yo Chiang219968c2020-09-22 18:45:04 +0800490 // Set by DepsMutator.
491 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
492
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900493 // The name of the image this module is built for
494 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200495
496 // The VNDK version this module is built against. If empty, the module is not
497 // build against the VNDK.
498 VndkVersion string `blueprint:"mutated"`
499
500 // Suffix for the name of Android.mk entries generated by this module
501 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800502
503 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
504 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900505 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900506
Yifan Hong39143a92020-10-26 12:43:12 -0700507 // Make this module available when building for ramdisk.
508 // On device without a dedicated recovery partition, the module is only
509 // available after switching root into
510 // /first_stage_ramdisk. To expose the module before switching root, install
511 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800512 Ramdisk_available *bool
513
Yifan Hong39143a92020-10-26 12:43:12 -0700514 // Make this module available when building for vendor ramdisk.
515 // On device without a dedicated recovery partition, the module is only
516 // available after switching root into
517 // /first_stage_ramdisk. To expose the module before switching root, install
518 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700519 Vendor_ramdisk_available *bool
520
Jiyong Parkf9332f12018-02-01 00:54:12 +0900521 // Make this module available when building for recovery
522 Recovery_available *bool
523
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200524 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000525 VendorVariantNeeded bool `blueprint:"mutated"`
526 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200527 CoreVariantNeeded bool `blueprint:"mutated"`
528 RamdiskVariantNeeded bool `blueprint:"mutated"`
529 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
530 RecoveryVariantNeeded bool `blueprint:"mutated"`
531
532 // A list of variations for the "image" mutator of the form
533 //<image name> '.' <version char>, for example, 'vendor.S'
534 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900535
536 // Allows this module to use non-APEX version of libraries. Useful
537 // for building binaries that are started before APEXes are activated.
538 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900539
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000540 // Allows this module to be included in CMake release snapshots to be built outside of Android
541 // build system and source tree.
542 Cmake_snapshot_supported *bool
543
Colin Cross1bc94122021-10-28 13:25:54 -0700544 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000545
546 // Set by factories of module types that can only be referenced from variants compiled against
547 // the SDK.
548 AlwaysSdk bool `blueprint:"mutated"`
549
550 // Variant is an SDK variant created by sdkMutator
551 IsSdkVariant bool `blueprint:"mutated"`
552 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
553 // variant to have a ".sdk" suffix.
554 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700555
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800556 Target struct {
557 Platform struct {
558 // List of modules required by the core variant.
559 Required []string `android:"arch_variant"`
560
561 // List of modules not required by the core variant.
562 Exclude_required []string `android:"arch_variant"`
563 } `android:"arch_variant"`
564
565 Recovery struct {
566 // List of modules required by the recovery variant.
567 Required []string `android:"arch_variant"`
568
569 // List of modules not required by the recovery variant.
570 Exclude_required []string `android:"arch_variant"`
571 } `android:"arch_variant"`
572 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700573}
574
575type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900576 // whether this module should be allowed to be directly depended by other
577 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900578 // If set to true, two variants will be built separately, one like
579 // normal, and the other limited to the set of libraries and headers
580 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700581 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900582 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700583 // so it shouldn't have any unversioned runtime dependencies, or
584 // make assumptions about the system that may not be true in the
585 // future.
586 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900587 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900588 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900589 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900590 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900591 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700592 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
593 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900594
Justin Yunebcf0c52021-01-08 18:00:19 +0900595 // This is the same as the "vendor_available" except that the install path
596 // of the vendor variant is /odm or /vendor/odm.
597 // By replacing "vendor_available: true" with "odm_available: true", the
598 // module will install its vendor variant to the /odm partition or /vendor/odm.
599 // As the modules with "odm_available: true" still create the vendor variants,
600 // they can link to the other vendor modules as the vendor_available modules do.
601 // Also, the vendor modules can link to odm_available modules.
602 //
603 // It may not be used for VNDK modules.
604 Odm_available *bool
605
Justin Yun63e9ec72020-10-29 16:49:43 +0900606 // whether this module should be allowed to be directly depended by other
607 // modules with `product_specific: true` or `product_available: true`.
608 // If set to true, an additional product variant will be built separately
609 // that is limited to the set of libraries and headers that are exposed to
610 // /product modules.
611 //
612 // The product variant may be used with a different (newer) /system,
613 // so it shouldn't have any unversioned runtime dependencies, or
614 // make assumptions about the system that may not be true in the
615 // future.
616 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900617 // If set to false, this module becomes inaccessible from /product modules.
618 //
619 // Different from the 'vendor_available' property, the modules with
620 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
621 // library without 'product_available' may not be depended on by any other
622 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900623 //
624 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
625 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
626 Product_available *bool
627
Jiyong Park5fb8c102018-04-09 12:03:06 +0900628 // whether this module is capable of being loaded with other instance
629 // (possibly an older version) of the same module in the same process.
630 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
631 // can be double loaded in a vendor process if the library is also a
632 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
633 // explicitly marked as `double_loadable: true` by the owner, or the dependency
634 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
635 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800636
637 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
638 IsLLNDK bool `blueprint:"mutated"`
639
Colin Cross5271fea2021-04-27 13:06:04 -0700640 // IsVendorPublicLibrary is set for the core and product variants of a library that has
641 // vendor_public_library stubs.
642 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800643}
644
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500645// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
646// to understanding details about the type of the current module.
647// For example, one might call these functions to determine whether the current module is a static
648// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800649type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800650 static() bool
651 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800652 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700653 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800654 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900655 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900656 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900657 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700658 toolchain() config.Toolchain
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700659 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800660 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900661 minSdkVersion() string
662 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700663 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700664 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800665 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800666 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700667 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900668 inProduct() bool
669 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800670 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700671 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900672 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900673 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700674 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700675 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800676 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000677 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800678 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900679 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800680 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800681 useClangLld(actx ModuleContext) bool
Colin Crosse07f2312020-08-13 11:24:56 -0700682 apexVariationName() string
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900683 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700684 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800685 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800686 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800687 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800688 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900689 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000690 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800691}
692
693type SharedFlags struct {
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000694 NumSharedFlags int
695 FlagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800696}
697
698type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700699 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800700 ModuleContextIntf
701}
702
703type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700704 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800705 ModuleContextIntf
706}
707
Colin Cross37047f12016-12-13 17:06:13 -0800708type DepsContext interface {
709 android.BottomUpMutatorContext
710 ModuleContextIntf
711}
712
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500713// feature represents additional (optional) steps to building cc-related modules, such as invocation
714// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800715type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800716 flags(ctx ModuleContext, flags Flags) Flags
717 props() []interface{}
718}
719
Joe Onorato37f900c2023-07-18 16:58:16 -0700720// Information returned from Generator about the source code it's generating
721type GeneratedSource struct {
722 IncludeDirs android.Paths
723 Sources android.Paths
724 Headers android.Paths
725 ReexportedDirs android.Paths
726}
727
728// generator allows injection of generated code
729type Generator interface {
730 GeneratorProps() []interface{}
731 GeneratorInit(ctx BaseModuleContext)
732 GeneratorDeps(ctx DepsContext, deps Deps) Deps
733 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
734 GeneratorSources(ctx ModuleContext) GeneratedSource
735 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
736}
737
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500738// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500739// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800740type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700741 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800742 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800743 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700744 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000745 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700746
Colin Cross76fada02016-07-27 10:31:13 -0700747 appendCflags([]string)
748 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700749 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800750}
751
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500752// linker is the interface for a linker decorator object. Individual module types can provide
753// their own implementation for this decorator, and thus specify custom logic regarding build
754// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800755type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700756 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800757 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700758 linkerFlags(ctx ModuleContext, flags Flags) Flags
759 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000760 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800761 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700762
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700763 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700764 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900765 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800766 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700767
768 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900769 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000770
771 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700772 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800773
774 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000775}
776
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500777// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000778type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500779 sharedLibs []string
780 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
781 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700782 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800783}
784
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500785// installer is the interface for an installer helper object. This helper is responsible for
786// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800787type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700788 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700789 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000790 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800791 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700792 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700793 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900794 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000795 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900796 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800797}
798
Inseob Kima1888ce2022-10-04 14:42:02 +0900799type overridable interface {
800 overriddenModules() []string
801}
802
Colin Cross6e511a92020-07-27 21:26:48 -0700803type libraryDependencyKind int
804
805const (
806 headerLibraryDependency = iota
807 sharedLibraryDependency
808 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400809 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700810)
811
812func (k libraryDependencyKind) String() string {
813 switch k {
814 case headerLibraryDependency:
815 return "headerLibraryDependency"
816 case sharedLibraryDependency:
817 return "sharedLibraryDependency"
818 case staticLibraryDependency:
819 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400820 case rlibLibraryDependency:
821 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700822 default:
823 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
824 }
825}
826
827type libraryDependencyOrder int
828
829const (
830 earlyLibraryDependency = -1
831 normalLibraryDependency = 0
832 lateLibraryDependency = 1
833)
834
835func (o libraryDependencyOrder) String() string {
836 switch o {
837 case earlyLibraryDependency:
838 return "earlyLibraryDependency"
839 case normalLibraryDependency:
840 return "normalLibraryDependency"
841 case lateLibraryDependency:
842 return "lateLibraryDependency"
843 default:
844 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
845 }
846}
847
848// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
849// tags that have a set of predefined tag objects that are reused for each dependency, a
850// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
851// That means that comparing a libraryDependencyTag for equality will only be equal if all
852// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
853// then check individual metadata fields instead.
854type libraryDependencyTag struct {
855 blueprint.BaseDependencyTag
856
857 // These are exported so that fmt.Printf("%#v") can call their String methods.
858 Kind libraryDependencyKind
859 Order libraryDependencyOrder
860
861 wholeStatic bool
862
863 reexportFlags bool
864 explicitlyVersioned bool
Colin Crossbd930bc2025-02-03 12:17:42 -0800865 explicitlyImpl bool
Colin Cross6e511a92020-07-27 21:26:48 -0700866 dataLib bool
867 ndk bool
868
869 staticUnwinder bool
870
871 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900872
Cindy Zhou18417cb2020-12-10 07:12:38 -0800873 // Whether or not this dependency should skip the apex dependency check
874 skipApexAllowedDependenciesCheck bool
875
Jiyong Parke3867542020-12-03 17:28:25 +0900876 // Whether or not this dependency has to be followed for the apex variants
877 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900878 // Whether or not this dependency has to be followed for the non-apex variants
879 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000880
881 // If true, don't automatically export symbols from the static library into a shared library.
882 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700883}
884
885// header returns true if the libraryDependencyTag is tagging a header lib dependency.
886func (d libraryDependencyTag) header() bool {
887 return d.Kind == headerLibraryDependency
888}
889
890// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
891func (d libraryDependencyTag) shared() bool {
892 return d.Kind == sharedLibraryDependency
893}
894
895// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
896func (d libraryDependencyTag) static() bool {
897 return d.Kind == staticLibraryDependency
898}
899
Colin Cross65cb3142021-12-10 23:05:02 +0000900func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
901 if d.shared() {
902 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
903 }
904 return nil
905}
906
907var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
908
Colin Crosse9fe2942020-11-10 18:12:15 -0800909// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
910// binaries or other shared libraries are installed as dependencies.
911func (d libraryDependencyTag) InstallDepNeeded() bool {
912 return d.shared()
913}
914
915var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
916
Yu Liu67a28422024-03-05 00:36:31 +0000917func (d libraryDependencyTag) PropagateAconfigValidation() bool {
918 return d.static()
919}
920
921var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
922
Colin Crosse9fe2942020-11-10 18:12:15 -0800923// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700924// libraryDependencyTag. Each tag object is created globally and reused for multiple
925// dependencies (although since the object contains no references, assigning a tag to a
926// variable and modifying it will not modify the original). Users can compare the tag
927// returned by ctx.OtherModuleDependencyTag against the global original
928type dependencyTag struct {
929 blueprint.BaseDependencyTag
930 name string
931}
932
Colin Crosse9fe2942020-11-10 18:12:15 -0800933// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
934// libraryDependencyTag, but where the dependency needs to be installed when the parent is
935// installed.
936type installDependencyTag struct {
937 blueprint.BaseDependencyTag
938 android.InstallAlwaysNeededDependencyTag
939 name string
940}
941
Colin Crossc99deeb2016-04-11 15:06:20 -0700942var (
Colin Cross6e511a92020-07-27 21:26:48 -0700943 genSourceDepTag = dependencyTag{name: "gen source"}
944 genHeaderDepTag = dependencyTag{name: "gen header"}
945 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
946 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900947 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700948 reuseObjTag = dependencyTag{name: "reuse objects"}
949 staticVariantTag = dependencyTag{name: "static variant"}
950 vndkExtDepTag = dependencyTag{name: "vndk extends"}
951 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700952 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800953 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000954 StubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000955 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500956 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400957 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800958 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700959)
960
Colin Crossbd930bc2025-02-03 12:17:42 -0800961func IsExplicitImplSharedDepTag(depTag blueprint.DependencyTag) bool {
962 ccLibDepTag, ok := depTag.(libraryDependencyTag)
963 return ok && ccLibDepTag.shared() && ccLibDepTag.explicitlyImpl
964}
965
Roland Levillainf89cd092019-07-29 16:22:59 +0100966func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700967 ccLibDepTag, ok := depTag.(libraryDependencyTag)
968 return ok && ccLibDepTag.shared()
969}
970
971func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
972 ccLibDepTag, ok := depTag.(libraryDependencyTag)
973 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100974}
975
Zach Johnson3df4e632020-11-06 11:56:27 -0800976func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
977 ccLibDepTag, ok := depTag.(libraryDependencyTag)
978 return ok && ccLibDepTag.header()
979}
980
Roland Levillainf89cd092019-07-29 16:22:59 +0100981func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800982 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100983}
984
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000985func ExcludeInApexDepTag(depTag blueprint.DependencyTag) bool {
986 ccLibDepTag, ok := depTag.(libraryDependencyTag)
987 return ok && ccLibDepTag.excludeInApex
988}
989
Colin Crossca860ac2016-01-04 14:34:37 -0800990// Module contains the properties and members used by all C/C++ module types, and implements
991// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500992// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
993// interface.
994//
995// To define a C/C++ related module, construct a new Module object and point its delegates to
996// type-specific structs. These delegates will be invoked to register module-specific build
997// statements which may be unique to the module type. For example, module.compiler.compile() should
998// be defined so as to register build statements which are responsible for compiling the module.
999//
1000// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
1001// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
1002// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
1003// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -08001004type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -07001005 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -07001006
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07001007 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -07001008 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -07001009 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -07001010
Colin Crossca860ac2016-01-04 14:34:37 -08001011 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +00001012 hod android.HostOrDeviceSupported
1013 multilib android.Multilib
1014 testModule bool
1015 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -07001016
Paul Duffina0843f62019-12-13 19:50:38 +00001017 // Allowable SdkMemberTypes of this module type.
1018 sdkMemberTypes []android.SdkMemberType
1019
Chris Parsonsef6e0cf2020-12-01 18:26:21 -05001020 // decorator delegates, initialize before calling Init
1021 // these may contain module-specific implementations, and effectively allow for custom
1022 // type-specific logic. These members may reference different objects or the same object.
1023 // Functions of these decorators will be invoked to initialize and register type-specific
1024 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -08001025 generators []Generator
1026 compiler compiler
1027 linker linker
1028 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -05001029
Spandan Dase12d2522023-09-12 21:42:31 +00001030 features []feature
1031 stl *stl
1032 sanitize *sanitize
1033 coverage *coverage
1034 fuzzer *fuzzer
1035 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +00001036 lto *lto
1037 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001038 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -08001039
Colin Cross31076b32020-10-23 17:22:06 -07001040 library libraryInterface
1041
Colin Cross635c3b02016-05-18 15:37:25 -07001042 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -08001043
Colin Crossb98c8b02016-07-29 13:44:28 -07001044 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -07001045
Yu Liue70976d2024-10-15 20:45:35 +00001046 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001047
1048 // Flags used to compile this module
1049 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -07001050
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001051 // Shared flags among build rules of this module
1052 sharedFlags SharedFlags
1053
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08001054 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -07001055 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001056
1057 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001058
1059 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001060 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001061
1062 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001063
Inseob Kim37e0bb02024-04-29 15:54:44 +09001064 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001065
1066 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001067
1068 hasAidl bool
1069 hasLex bool
1070 hasProto bool
1071 hasRenderscript bool
1072 hasSysprop bool
1073 hasWinMsg bool
1074 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001075
1076 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001077}
1078
Yu Liu76d94462024-10-31 23:32:36 +00001079func (c *Module) IncrementalSupported() bool {
1080 return c.incremental
1081}
1082
1083var _ blueprint.Incremental = (*Module)(nil)
1084
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001085func (c *Module) AddJSONData(d *map[string]interface{}) {
1086 c.AndroidModuleBase().AddJSONData(d)
1087 (*d)["Cc"] = map[string]interface{}{
1088 "SdkVersion": c.SdkVersion(),
1089 "MinSdkVersion": c.MinSdkVersion(),
1090 "VndkVersion": c.VndkVersion(),
1091 "ProductSpecific": c.ProductSpecific(),
1092 "SocSpecific": c.SocSpecific(),
1093 "DeviceSpecific": c.DeviceSpecific(),
1094 "InProduct": c.InProduct(),
1095 "InVendor": c.InVendor(),
1096 "InRamdisk": c.InRamdisk(),
1097 "InVendorRamdisk": c.InVendorRamdisk(),
1098 "InRecovery": c.InRecovery(),
1099 "VendorAvailable": c.VendorAvailable(),
1100 "ProductAvailable": c.ProductAvailable(),
1101 "RamdiskAvailable": c.RamdiskAvailable(),
1102 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1103 "RecoveryAvailable": c.RecoveryAvailable(),
1104 "OdmAvailable": c.OdmAvailable(),
1105 "InstallInData": c.InstallInData(),
1106 "InstallInRamdisk": c.InstallInRamdisk(),
1107 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1108 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1109 "InstallInRecovery": c.InstallInRecovery(),
1110 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001111 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001112 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1113 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001114 "AidlSrcs": c.hasAidl,
1115 "LexSrcs": c.hasLex,
1116 "ProtoSrcs": c.hasProto,
1117 "RenderscriptSrcs": c.hasRenderscript,
1118 "SyspropSrcs": c.hasSysprop,
1119 "WinMsgSrcs": c.hasWinMsg,
1120 "YaccSrsc": c.hasYacc,
1121 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001122 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001123 }
1124}
1125
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001126func (c *Module) SetPreventInstall() {
1127 c.Properties.PreventInstall = true
1128}
1129
1130func (c *Module) SetHideFromMake() {
1131 c.Properties.HideFromMake = true
1132}
1133
Ivan Lozanod7586b62021-04-01 09:49:36 -04001134func (c *Module) HiddenFromMake() bool {
1135 return c.Properties.HideFromMake
1136}
1137
Cole Fauste8a87832024-09-11 11:35:46 -07001138func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001139 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001140 if c.ImageVariation().Variation == android.CoreVariation {
1141 required = append(required, c.Properties.Target.Platform.Required...)
1142 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1143 } else if c.InRecovery() {
1144 required = append(required, c.Properties.Target.Recovery.Required...)
1145 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1146 }
1147 return android.FirstUniqueStrings(required)
1148}
1149
Ivan Lozano52767be2019-10-18 14:49:46 -07001150func (c *Module) Toc() android.OptionalPath {
1151 if c.linker != nil {
1152 if library, ok := c.linker.(libraryInterface); ok {
1153 return library.toc()
1154 }
1155 }
1156 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1157}
1158
1159func (c *Module) ApiLevel() string {
1160 if c.linker != nil {
1161 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001162 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001163 }
1164 }
1165 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1166}
1167
1168func (c *Module) Static() bool {
1169 if c.linker != nil {
1170 if library, ok := c.linker.(libraryInterface); ok {
1171 return library.static()
1172 }
1173 }
1174 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1175}
1176
1177func (c *Module) Shared() bool {
1178 if c.linker != nil {
1179 if library, ok := c.linker.(libraryInterface); ok {
1180 return library.shared()
1181 }
1182 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001183
Ivan Lozano52767be2019-10-18 14:49:46 -07001184 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1185}
1186
1187func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001188 if c.stl != nil {
1189 return c.stl.Properties.SelectedStl
1190 }
1191 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001192}
1193
Ivan Lozano52767be2019-10-18 14:49:46 -07001194func (c *Module) StubDecorator() bool {
1195 if _, ok := c.linker.(*stubDecorator); ok {
1196 return true
1197 }
1198 return false
1199}
1200
Yi Kong5786f5c2024-05-28 02:22:34 +09001201func (c *Module) OptimizeForSize() bool {
1202 return Bool(c.Properties.Optimize_for_size)
1203}
1204
Ivan Lozano52767be2019-10-18 14:49:46 -07001205func (c *Module) SdkVersion() string {
1206 return String(c.Properties.Sdk_version)
1207}
1208
Artur Satayev480e25b2020-04-27 18:53:18 +01001209func (c *Module) MinSdkVersion() string {
1210 return String(c.Properties.Min_sdk_version)
1211}
1212
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001213func (c *Module) SetSdkVersion(s string) {
1214 c.Properties.Sdk_version = StringPtr(s)
1215}
1216
1217func (c *Module) SetMinSdkVersion(s string) {
1218 c.Properties.Min_sdk_version = StringPtr(s)
1219}
1220
1221func (c *Module) SetStl(s string) {
1222 if c.stl != nil {
1223 c.stl.Properties.Stl = StringPtr(s)
1224 }
1225}
1226
1227func (c *Module) IsCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001228 if linker, ok := c.linker.(*objectLinker); ok {
1229 return linker.isCrt()
1230 }
1231 return false
1232}
1233
Jiyong Park5df7bd32021-08-25 16:18:46 +09001234func (c *Module) SplitPerApiLevel() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001235 return CanUseSdk(c) && c.IsCrt()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001236}
1237
Colin Crossc511bc52020-04-07 16:50:32 +00001238func (c *Module) AlwaysSdk() bool {
1239 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1240}
1241
Ivan Lozano183a3212019-10-18 14:18:45 -07001242func (c *Module) CcLibrary() bool {
1243 if c.linker != nil {
1244 if _, ok := c.linker.(*libraryDecorator); ok {
1245 return true
1246 }
Colin Crossd48fe732020-09-23 20:37:24 -07001247 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1248 return true
1249 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001250 }
1251 return false
1252}
1253
1254func (c *Module) CcLibraryInterface() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001255 if c.library != nil {
Ivan Lozano183a3212019-10-18 14:18:45 -07001256 return true
1257 }
1258 return false
1259}
1260
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001261func (c *Module) RlibStd() bool {
1262 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1263}
1264
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001265func (c *Module) RustLibraryInterface() bool {
1266 return false
1267}
1268
Ivan Lozano0a468a42024-05-13 21:03:34 -04001269func (c *Module) CrateName() string {
1270 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1271}
1272
1273func (c *Module) ExportedCrateLinkDirs() []string {
1274 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1275}
1276
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001277func (c *Module) IsFuzzModule() bool {
1278 if _, ok := c.compiler.(*fuzzBinary); ok {
1279 return true
1280 }
1281 return false
1282}
1283
1284func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1285 return c.FuzzModule
1286}
1287
1288func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1289 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1290 return fuzzer.fuzzPackagedModule
1291 }
1292 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1293}
1294
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001295func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001296 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1297 return fuzzer.sharedLibraries
1298 }
1299 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1300}
1301
Ivan Lozano2b262972019-11-21 12:30:50 -08001302func (c *Module) NonCcVariants() bool {
1303 return false
1304}
1305
Ivan Lozano183a3212019-10-18 14:18:45 -07001306func (c *Module) SetStatic() {
1307 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001308 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001309 library.setStatic()
1310 return
1311 }
1312 }
1313 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1314}
1315
1316func (c *Module) SetShared() {
1317 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001318 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001319 library.setShared()
1320 return
1321 }
1322 }
1323 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1324}
1325
1326func (c *Module) BuildStaticVariant() bool {
1327 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001328 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001329 return library.buildStatic()
1330 }
1331 }
1332 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1333}
1334
1335func (c *Module) BuildSharedVariant() bool {
1336 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001337 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001338 return library.buildShared()
1339 }
1340 }
1341 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1342}
1343
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001344func (c *Module) BuildRlibVariant() bool {
1345 // cc modules can never build rlib variants
1346 return false
1347}
1348
Ivan Lozano183a3212019-10-18 14:18:45 -07001349func (c *Module) Module() android.Module {
1350 return c
1351}
1352
Jiyong Parkc20eee32018-09-05 22:36:17 +09001353func (c *Module) OutputFile() android.OptionalPath {
1354 return c.outputFile
1355}
1356
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001357func (c *Module) CoverageFiles() android.Paths {
1358 if c.linker != nil {
1359 if library, ok := c.linker.(libraryInterface); ok {
1360 return library.objs().coverageFiles
1361 }
1362 }
1363 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1364}
1365
Ivan Lozano183a3212019-10-18 14:18:45 -07001366var _ LinkableInterface = (*Module)(nil)
1367
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001368func (c *Module) VersionedInterface() VersionedInterface {
1369 if c.library != nil {
1370 return c.library
1371 }
1372 return nil
1373}
1374
Jiyong Park719b4462019-01-13 00:39:51 +09001375func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001376 if c.linker != nil {
1377 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001378 }
1379 return nil
1380}
1381
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001382func (c *Module) CoverageOutputFile() android.OptionalPath {
1383 if c.linker != nil {
1384 return c.linker.coverageOutputFilePath()
1385 }
1386 return android.OptionalPath{}
1387}
1388
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001389func (c *Module) RelativeInstallPath() string {
1390 if c.installer != nil {
1391 return c.installer.relativeInstallPath()
1392 }
1393 return ""
1394}
1395
Jooyung Han344d5432019-08-23 11:17:39 +09001396func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001397 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001398}
1399
Colin Cross36242852017-06-23 15:06:31 -07001400func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001401 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001402 for _, generator := range c.generators {
1403 c.AddProperties(generator.GeneratorProps()...)
1404 }
Colin Crossca860ac2016-01-04 14:34:37 -08001405 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001406 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001407 }
1408 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001409 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001410 }
1411 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001412 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001413 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001414 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001415 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001416 }
Colin Cross16b23492016-01-06 14:41:07 -08001417 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001418 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001419 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001420 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001421 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001422 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001423 if c.fuzzer != nil {
1424 c.AddProperties(c.fuzzer.props()...)
1425 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001426 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001427 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001428 }
Stephen Craneba090d12017-05-09 15:44:35 -07001429 if c.lto != nil {
1430 c.AddProperties(c.lto.props()...)
1431 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001432 if c.afdo != nil {
1433 c.AddProperties(c.afdo.props()...)
1434 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001435 if c.orderfile != nil {
1436 c.AddProperties(c.orderfile.props()...)
1437 }
Colin Crossca860ac2016-01-04 14:34:37 -08001438 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001439 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001440 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001441 // Allow test-only on libraries that are not cc_test_library
1442 if c.library != nil && !c.testLibrary() {
1443 c.AddProperties(&c.sourceProperties)
1444 }
Colin Crossc472d572015-03-17 15:06:21 -07001445
Colin Cross36242852017-06-23 15:06:31 -07001446 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001447 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001448 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001449
Colin Cross36242852017-06-23 15:06:31 -07001450 return c
Colin Crossc472d572015-03-17 15:06:21 -07001451}
1452
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001453// UseVndk() returns true if this module is built against VNDK.
1454// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001455func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001456 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001457}
1458
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001459func CanUseSdk(c LinkableInterface) bool {
1460 return c.Module().Target().Os == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001461 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001462}
1463
1464func (c *Module) UseSdk() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001465 if CanUseSdk(c) {
Colin Cross1348ce32020-10-01 13:37:16 -07001466 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001467 }
1468 return false
1469}
1470
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001471func (c *Module) isCoverageVariant() bool {
1472 return c.coverage.Properties.IsCoverageVariant
1473}
1474
Colin Cross95f1ca02020-10-29 20:47:22 -07001475func (c *Module) IsNdk(config android.Config) bool {
1476 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001477}
1478
Colin Cross127bb8b2020-12-16 16:46:01 -08001479func (c *Module) IsLlndk() bool {
1480 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001481}
1482
Colin Cross1f3f1302021-04-26 18:37:44 -07001483func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001484 lib := moduleVersionedInterface(m)
1485 return lib != nil && (lib.HasLLNDKStubs() || lib.HasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001486}
1487
Colin Cross5271fea2021-04-27 13:06:04 -07001488func (m *Module) NeedsVendorPublicLibraryVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001489 lib := moduleVersionedInterface(m)
1490 return lib != nil && (lib.HasVendorPublicLibrary())
Colin Cross5271fea2021-04-27 13:06:04 -07001491}
1492
1493// IsVendorPublicLibrary returns true for vendor public libraries.
1494func (c *Module) IsVendorPublicLibrary() bool {
1495 return c.VendorProperties.IsVendorPublicLibrary
1496}
1497
Ivan Lozanof1868af2022-04-12 13:08:36 -04001498func (c *Module) IsVndkPrebuiltLibrary() bool {
1499 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1500 return true
1501 }
1502 return false
1503}
1504
1505func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1506 return c.Properties.SdkAndPlatformVariantVisibleToMake
1507}
1508
Ivan Lozanod7586b62021-04-01 09:49:36 -04001509func (c *Module) HasLlndkStubs() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001510 lib := moduleVersionedInterface(c)
1511 return lib != nil && lib.HasLLNDKStubs()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001512}
1513
1514func (c *Module) StubsVersion() string {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001515 if lib, ok := c.linker.(VersionedInterface); ok {
1516 return lib.StubsVersion()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001517 }
1518 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1519}
1520
Colin Cross127bb8b2020-12-16 16:46:01 -08001521// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1522// and does not set llndk.vendor_available: false.
1523func (c *Module) isImplementationForLLNDKPublic() bool {
1524 library, _ := c.library.(*libraryDecorator)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001525 return library != nil && library.HasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001526 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001527}
1528
Colin Cross3513fb12024-01-24 14:44:47 -08001529func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001530 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001531 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001532 }
1533 return false
1534}
1535
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001536func (c *Module) isOrderfileCompile() bool {
1537 if orderfile := c.orderfile; orderfile != nil {
1538 return orderfile.Properties.OrderfileLoad
1539 }
1540 return false
1541}
1542
Yi Kongc702ebd2022-08-19 16:02:45 +08001543func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001544 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001545}
1546
Yi Konged79fa32023-06-04 17:15:42 +09001547func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001548 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001549}
1550
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001551func (c *Module) isNDKStubLibrary() bool {
1552 if _, ok := c.compiler.(*stubDecorator); ok {
1553 return true
1554 }
1555 return false
1556}
1557
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001558func (c *Module) SubName() string {
1559 return c.Properties.SubName
1560}
1561
Jiyong Park25fc6a92018-11-18 18:02:45 +09001562func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001563 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001564 return lib.BuildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001565 }
1566 return false
1567}
1568
1569func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001570 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001571 return lib.HasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001572 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001573 return false
1574}
1575
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001576func (c *Module) RustApexExclude() bool {
1577 return false
1578}
1579
Alan Stokes73feba32022-11-14 12:21:24 +00001580func (c *Module) IsStubsImplementationRequired() bool {
1581 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001582 return lib.IsStubsImplementationRequired()
Alan Stokes73feba32022-11-14 12:21:24 +00001583 }
1584 return false
1585}
1586
Colin Cross0477b422020-10-13 18:43:54 -07001587// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1588// the implementation. If it is an implementation library it returns its own name.
1589func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1590 name := ctx.OtherModuleName(c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001591 if versioned, ok := c.linker.(VersionedInterface); ok {
1592 name = versioned.ImplementationModuleName(name)
Colin Cross0477b422020-10-13 18:43:54 -07001593 }
1594 return name
1595}
1596
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001597// Similar to ImplementationModuleNameByCtx, but uses the Make variant of the module
Martin Stjernholm2856c662020-12-02 15:03:42 +00001598// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1599// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1600// under the premise that the prebuilt module overrides its source counterpart
1601// if it is exposed to Make).
Yu Liu0a37d422025-02-13 02:05:00 +00001602func (c *Module) ImplementationModuleNameForMake() string {
Martin Stjernholm2856c662020-12-02 15:03:42 +00001603 name := c.BaseModuleName()
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001604 if versioned, ok := c.linker.(VersionedInterface); ok {
1605 name = versioned.ImplementationModuleName(name)
Martin Stjernholm2856c662020-12-02 15:03:42 +00001606 }
1607 return name
1608}
1609
Jiyong Park7d55b612021-06-11 17:22:09 +09001610func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001611 return Bool(c.Properties.Bootstrap)
1612}
1613
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001614func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001615 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1616 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1617 return false
1618 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001619 return c.linker != nil && c.linker.nativeCoverage()
1620}
1621
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001622func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001623 if p, ok := c.linker.(SnapshotInterface); ok {
1624 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001625 }
1626 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001627}
1628
Jiyong Parkf1194352019-02-25 11:05:47 +09001629func isBionic(name string) bool {
1630 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001631 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001632 return true
1633 }
1634 return false
1635}
1636
Martin Stjernholm279de572019-09-10 23:18:20 +01001637func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001638 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001639 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001640 }
1641 return isBionic(name)
1642}
1643
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001644func (c *Module) isCfiAssemblySupportEnabled() bool {
1645 return c.sanitize != nil &&
1646 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1647}
1648
Inseob Kim800d1142021-06-14 12:03:51 +09001649func (c *Module) InstallInRoot() bool {
1650 return c.installer != nil && c.installer.installInRoot()
1651}
1652
Colin Crossca860ac2016-01-04 14:34:37 -08001653type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001654 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001655 moduleContextImpl
1656}
1657
Colin Cross37047f12016-12-13 17:06:13 -08001658type depsContext struct {
1659 android.BottomUpMutatorContext
1660 moduleContextImpl
1661}
1662
Colin Crossca860ac2016-01-04 14:34:37 -08001663type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001664 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001665 moduleContextImpl
1666}
1667
1668type moduleContextImpl struct {
1669 mod *Module
1670 ctx BaseModuleContext
1671}
1672
Colin Crossb98c8b02016-07-29 13:44:28 -07001673func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001674 return ctx.mod.toolchain(ctx.ctx)
1675}
1676
1677func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001678 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001679}
1680
1681func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001682 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001683}
1684
Colin Cross6a730042024-12-05 13:53:43 -08001685func (ctx *moduleContextImpl) staticLibrary() bool {
1686 return ctx.mod.staticLibrary()
1687}
1688
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001689func (ctx *moduleContextImpl) testBinary() bool {
1690 return ctx.mod.testBinary()
1691}
1692
Yi Kong56fc1b62022-09-06 16:24:00 +08001693func (ctx *moduleContextImpl) testLibrary() bool {
1694 return ctx.mod.testLibrary()
1695}
1696
Jiyong Park1d1119f2019-07-29 21:27:18 +09001697func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001698 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001699}
1700
Inseob Kim7f283f42020-06-01 21:53:49 +09001701func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001702 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001703}
1704
Inseob Kim1042d292020-06-01 23:23:05 +09001705func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001706 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001707}
1708
Yi Kong5786f5c2024-05-28 02:22:34 +09001709func (ctx *moduleContextImpl) optimizeForSize() bool {
1710 return ctx.mod.OptimizeForSize()
1711}
1712
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001713func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001714 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001715}
1716
1717func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001718 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001719 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001720 }
1721 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001722}
1723
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001724func MinSdkVersion(mod VersionedLinkableInterface, ctxIsForPlatform bool, device bool,
1725 platformSdkVersion string) string {
1726
1727 ver := mod.MinSdkVersion()
1728 if ver == "apex_inherit" && !ctxIsForPlatform {
1729 ver = mod.ApexSdkVersion().String()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001730 }
1731 if ver == "apex_inherit" || ver == "" {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001732 ver = mod.SdkVersion()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001733 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001734
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001735 if device {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001736 // When building for vendor/product, use the latest _stable_ API as "current".
1737 // This is passed to clang/aidl compilers so that compiled/generated code works
1738 // with the system.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001739 if (mod.InVendor() || mod.InProduct()) && (ver == "" || ver == "current") {
1740 ver = platformSdkVersion
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001741 }
1742 }
1743
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001744 // For crt objects, the meaning of min_sdk_version is very different from other types of
1745 // module. For them, min_sdk_version defines the oldest version that the build system will
1746 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1747 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1748 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001749 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1750 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1751 // support such an old version. The version is set to the later version in case when the
1752 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1753 // it's for an APEX.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001754 if mod.IsCrt() && !mod.IsSdkVariant() {
1755 if ctxIsForPlatform {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001756 ver = strconv.Itoa(android.FutureApiLevelInt)
1757 } else { // for apex
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001758 ver = mod.ApexSdkVersion().String()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001759 if ver == "" { // in case when min_sdk_version was not set by the APEX
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001760 ver = mod.SdkVersion()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001761 }
1762 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001763 }
1764
Jiyong Parkb35a8192020-08-10 15:59:36 +09001765 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001766 sdkVersionInt, err := strconv.Atoi(mod.SdkVersion())
Jiyong Parkb35a8192020-08-10 15:59:36 +09001767 minSdkVersionInt, err2 := strconv.Atoi(ver)
1768 if err == nil && err2 == nil {
1769 if sdkVersionInt < minSdkVersionInt {
1770 return strconv.Itoa(sdkVersionInt)
1771 }
1772 }
1773 return ver
1774}
1775
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001776func (ctx *moduleContextImpl) minSdkVersion() string {
1777 platformSdkVersion := ""
1778 if ctx.ctx.Device() {
1779 platformSdkVersion = ctx.ctx.Config().PlatformSdkVersion().String()
1780 }
1781 return MinSdkVersion(ctx.mod, CtxIsForPlatform(ctx.ctx), ctx.ctx.Device(), platformSdkVersion)
1782}
1783
Jiyong Parkb35a8192020-08-10 15:59:36 +09001784func (ctx *moduleContextImpl) isSdkVariant() bool {
1785 return ctx.mod.IsSdkVariant()
1786}
1787
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001788func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001789 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001790}
Justin Yun8effde42017-06-23 19:24:43 +09001791
Kiyoung Kimaa394802024-01-08 12:55:45 +09001792func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1793 return ctx.mod.InVendorOrProduct()
1794}
1795
Colin Cross95f1ca02020-10-29 20:47:22 -07001796func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1797 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001798}
1799
Colin Cross127bb8b2020-12-16 16:46:01 -08001800func (ctx *moduleContextImpl) IsLlndk() bool {
1801 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001802}
1803
Colin Cross127bb8b2020-12-16 16:46:01 -08001804func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1805 return ctx.mod.isImplementationForLLNDKPublic()
1806}
1807
Colin Cross3513fb12024-01-24 14:44:47 -08001808func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1809 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001810}
1811
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001812func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1813 return ctx.mod.isOrderfileCompile()
1814}
1815
Yi Kongc702ebd2022-08-19 16:02:45 +08001816func (ctx *moduleContextImpl) isCfi() bool {
1817 return ctx.mod.isCfi()
1818}
1819
Yi Konged79fa32023-06-04 17:15:42 +09001820func (ctx *moduleContextImpl) isFuzzer() bool {
1821 return ctx.mod.isFuzzer()
1822}
1823
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001824func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1825 return ctx.mod.isNDKStubLibrary()
1826}
1827
Colin Cross5271fea2021-04-27 13:06:04 -07001828func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1829 return ctx.mod.IsVendorPublicLibrary()
1830}
1831
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001832func (ctx *moduleContextImpl) selectedStl() string {
1833 if stl := ctx.mod.stl; stl != nil {
1834 return stl.Properties.SelectedStl
1835 }
1836 return ""
1837}
1838
Ivan Lozanobd721262018-11-27 14:33:03 -08001839func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1840 return ctx.mod.linker.useClangLld(actx)
1841}
1842
Colin Crossce75d2c2016-10-06 16:12:58 -07001843func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001844 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001845}
1846
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001847func CtxIsForPlatform(ctx android.BaseModuleContext) bool {
1848 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Colin Crossff694a82023-12-13 15:54:49 -08001849 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001850}
1851
Colin Crosse07f2312020-08-13 11:24:56 -07001852func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001853 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1854 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001855}
1856
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001857func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001858 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001859}
1860
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001861func (ctx *moduleContextImpl) nativeCoverage() bool {
1862 return ctx.mod.nativeCoverage()
1863}
1864
Colin Cross95b07f22020-12-16 11:06:50 -08001865func (ctx *moduleContextImpl) isPreventInstall() bool {
1866 return ctx.mod.Properties.PreventInstall
1867}
1868
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001869func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1870 shared := &ctx.mod.sharedFlags
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001871 if shared.FlagsMap == nil {
1872 shared.NumSharedFlags = 0
1873 shared.FlagsMap = make(map[string]string)
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001874 }
1875 return shared
1876}
1877
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001878func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1879 return ctx.mod.isCfiAssemblySupportEnabled()
1880}
1881
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001882func (ctx *moduleContextImpl) notInPlatform() bool {
1883 return ctx.mod.NotInPlatform()
1884}
1885
Yu Liu76d94462024-10-31 23:32:36 +00001886func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1887 if ctx.mod.makeVarsInfo == nil {
1888 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1889 }
1890 return ctx.mod.makeVarsInfo
1891}
1892
Colin Cross635c3b02016-05-18 15:37:25 -07001893func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001894 return &Module{
1895 hod: hod,
1896 multilib: multilib,
1897 }
1898}
1899
Colin Cross635c3b02016-05-18 15:37:25 -07001900func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001901 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001902 module.features = []feature{
1903 &tidyFeature{},
1904 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001905 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001906 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001907 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001908 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001909 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001910 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001911 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001912 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001913 return module
1914}
1915
Colin Crossce75d2c2016-10-06 16:12:58 -07001916func (c *Module) Prebuilt() *android.Prebuilt {
1917 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1918 return p.prebuilt()
1919 }
1920 return nil
1921}
1922
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001923func (c *Module) IsPrebuilt() bool {
1924 return c.Prebuilt() != nil
1925}
1926
Colin Crossce75d2c2016-10-06 16:12:58 -07001927func (c *Module) Name() string {
1928 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001929 if p, ok := c.linker.(interface {
1930 Name(string) string
1931 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001932 name = p.Name(name)
1933 }
1934 return name
1935}
1936
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001937func (c *Module) Multilib() string {
1938 return c.Arch().ArchType.Multilib
1939}
1940
1941func (c *Module) ApexSdkVersion() android.ApiLevel {
1942 return c.apexSdkVersion
1943}
1944
Alex Light3d673592019-01-18 14:37:31 -08001945func (c *Module) Symlinks() []string {
1946 if p, ok := c.installer.(interface {
1947 symlinkList() []string
1948 }); ok {
1949 return p.symlinkList()
1950 }
1951 return nil
1952}
1953
Chris Parsons216e10a2020-07-09 17:12:52 -04001954func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001955 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001956 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001957 }); ok {
1958 return p.dataPaths()
1959 }
1960 return nil
1961}
1962
Ivan Lozanof1868af2022-04-12 13:08:36 -04001963func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001964 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1965 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001966 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001967 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001968 if c.ProductSpecific() {
1969 // If the module is product specific with 'product_specific: true',
1970 // do not add a name suffix because it is a base module.
1971 return ""
1972 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001973 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001974 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001975 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001976 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001977 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001978 // add version suffix only if the module is using different vndk version than the
1979 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001980 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001981 }
1982 return nameSuffix
1983}
1984
Ivan Lozanof1868af2022-04-12 13:08:36 -04001985func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1986 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001987
1988 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001989 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001990 }
1991
Colin Cross127bb8b2020-12-16 16:46:01 -08001992 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001993 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001994 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1995 // added for product variant only when we have vendor and product variants with core
1996 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001997 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001998 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001999 subName += vendorPublicLibrarySuffix
2000 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09002001 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
2002 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04002003 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08002004 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002005 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002006 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002007 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07002008 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002009 subName += RecoverySuffix
2010 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
2011 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07002012 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002013 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07002014 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00002015 } else if c.IsStubs() && c.IsSdkVariant() {
2016 // Public API surface (NDK)
2017 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
2018 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09002019 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04002020
2021 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05002022}
2023
Sam Delmerico75dbca22023-04-20 13:13:25 +00002024func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
2025 ctx := &moduleContext{
2026 ModuleContext: actx,
2027 moduleContextImpl: moduleContextImpl{
2028 mod: c,
2029 },
2030 }
2031 ctx.ctx = ctx
2032 return ctx
2033}
2034
Spandan Das20fce2d2023-04-12 17:21:39 +00002035// TODO (b/277651159): Remove this allowlist
2036var (
2037 skipStubLibraryMultipleApexViolation = map[string]bool{
2038 "libclang_rt.asan": true,
2039 "libclang_rt.hwasan": true,
2040 // runtime apex
2041 "libc": true,
2042 "libc_hwasan": true,
2043 "libdl_android": true,
2044 "libm": true,
2045 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00002046 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00002047 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01002048 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00002049 "libandroidio": true,
2050 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01002051 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00002052 "libnativebridge": true,
2053 "libnativehelper": true,
2054 "libnativeloader": true,
2055 "libsigchain": true,
2056 }
2057)
2058
2059// Returns true if a stub library could be installed in multiple apexes
2060func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2061 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08002062 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00002063 return false
2064 }
2065 // If this is not a stub library, no check necessary
2066 if !c.HasStubsVariants() {
2067 return false
2068 }
2069 // Skip the allowlist
2070 // Use BaseModuleName so that this matches prebuilts.
2071 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2072 return false
2073 }
2074
Spandan Das20fce2d2023-04-12 17:21:39 +00002075 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08002076 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
2077 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00002078 return true
2079 }
2080 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08002081 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00002082 return true
2083 }
2084 // Default: no violation
2085 return false
2086}
2087
Chris Parsons8d6e4332021-02-22 16:13:50 -05002088func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002089 ctx := moduleContextFromAndroidModuleContext(actx, c)
2090
Inseob Kim37e0bb02024-04-29 15:54:44 +09002091 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2092 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2093 Logtags: c.logtagsPaths,
2094 })
2095
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002096 // If Test_only is set on a module in bp file, respect the setting, otherwise
2097 // see if is a known test module type.
2098 testOnly := c.testModule || c.testLibrary()
2099 if c.sourceProperties.Test_only != nil {
2100 testOnly = Bool(c.sourceProperties.Test_only)
2101 }
2102 // Keep before any early returns.
2103 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2104 TestOnly: testOnly,
2105 TopLevelTarget: c.testModule,
2106 })
2107
Ivan Lozanof1868af2022-04-12 13:08:36 -04002108 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002109 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002110 if !apexInfo.IsForPlatform() {
2111 c.hideApexVariantFromMake = true
2112 }
2113
Chris Parsonseefc9e62021-04-02 17:36:47 -04002114 c.makeLinkType = GetMakeLinkType(actx, c)
2115
Colin Crossf18e1102017-11-16 14:33:08 -08002116 deps := c.depsToPaths(ctx)
2117 if ctx.Failed() {
2118 return
2119 }
2120
Joe Onorato37f900c2023-07-18 16:58:16 -07002121 for _, generator := range c.generators {
2122 gen := generator.GeneratorSources(ctx)
2123 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2124 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2125 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2126 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2127 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2128 if len(deps.Objs.objFiles) == 0 {
2129 // If we are reusuing object files (which happens when we're a shared library and we're
2130 // reusing our static variant's object files), then skip adding the actual source files,
2131 // because we already have the object for it.
2132 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2133 }
2134 }
2135
2136 if ctx.Failed() {
2137 return
2138 }
2139
Spandan Das20fce2d2023-04-12 17:21:39 +00002140 if c.stubLibraryMultipleApexViolation(actx) {
2141 actx.PropertyErrorf("apex_available",
2142 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2143 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002144 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2145 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002146 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2147 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002148 }
2149
Colin Crossca860ac2016-01-04 14:34:37 -08002150 flags := Flags{
2151 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002152 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002153 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002154 for _, generator := range c.generators {
2155 flags = generator.GeneratorFlags(ctx, flags, deps)
2156 }
Colin Crossca860ac2016-01-04 14:34:37 -08002157 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002158 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002159 }
2160 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002161 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002162 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002163 if c.stl != nil {
2164 flags = c.stl.flags(ctx, flags)
2165 }
Colin Cross16b23492016-01-06 14:41:07 -08002166 if c.sanitize != nil {
2167 flags = c.sanitize.flags(ctx, flags)
2168 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002169 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002170 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002171 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002172 if c.fuzzer != nil {
2173 flags = c.fuzzer.flags(ctx, flags)
2174 }
Stephen Craneba090d12017-05-09 15:44:35 -07002175 if c.lto != nil {
2176 flags = c.lto.flags(ctx, flags)
2177 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002178 if c.afdo != nil {
2179 flags = c.afdo.flags(ctx, flags)
2180 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002181 if c.orderfile != nil {
2182 flags = c.orderfile.flags(ctx, flags)
2183 }
Colin Crossca860ac2016-01-04 14:34:37 -08002184 for _, feature := range c.features {
2185 flags = feature.flags(ctx, flags)
2186 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002187 if ctx.Failed() {
2188 return
2189 }
2190
Colin Cross4af21ed2019-11-04 09:37:55 -08002191 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2192 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2193 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002194
Colin Cross4af21ed2019-11-04 09:37:55 -08002195 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002196
2197 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002198 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002199 }
2200 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002201 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002202 }
2203
Colin Cross3e5e7782022-06-17 22:17:05 +00002204 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2205
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002206 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002207 // We need access to all the flags seen by a source file.
2208 if c.sabi != nil {
2209 flags = c.sabi.flags(ctx, flags)
2210 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002211
Colin Cross4af21ed2019-11-04 09:37:55 -08002212 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002213
Joe Onorato37f900c2023-07-18 16:58:16 -07002214 for _, generator := range c.generators {
2215 generator.GeneratorBuildActions(ctx, flags, deps)
2216 }
2217
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002218 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002219 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002220 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002221 if ctx.Failed() {
2222 return
2223 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002224 }
2225
Colin Crossca860ac2016-01-04 14:34:37 -08002226 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002227 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002228 if ctx.Failed() {
2229 return
2230 }
Colin Cross635c3b02016-05-18 15:37:25 -07002231 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002232
Chris Parsons94a0bba2021-06-04 15:03:47 -04002233 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002234
2235 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2236 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2237 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002238 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002239
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002240 if Bool(c.Properties.Cmake_snapshot_supported) {
2241 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2242 }
2243
Chris Parsons94a0bba2021-06-04 15:03:47 -04002244 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002245
2246 if c.linker != nil {
2247 moduleInfoJSON := ctx.ModuleInfoJSON()
2248 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2249 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2250 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2251 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2252 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2253
2254 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2255 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2256 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2257 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2258
2259 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2260 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2261 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2262 moduleInfoJSON.SubName += ".cfi"
2263 }
2264 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2265 moduleInfoJSON.SubName += ".hwasan"
2266 }
2267 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2268 moduleInfoJSON.SubName += ".scs"
2269 }
2270 }
2271 moduleInfoJSON.SubName += c.Properties.SubName
2272
2273 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2274 moduleInfoJSON.Uninstallable = true
2275 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002276 }
Wei Lia1aa2972024-06-21 13:08:51 -07002277
2278 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002279
Cole Faust96a692b2024-08-08 14:47:51 -07002280 if b, ok := c.compiler.(*baseCompiler); ok {
2281 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2282 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2283 c.hasProto = b.hasSrcExt(ctx, ".proto")
2284 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2285 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2286 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2287 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2288 }
2289
Yu Liuec7043d2024-11-05 18:22:20 +00002290 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002291 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002292 }
2293 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002294 ccObjectInfo.ObjFiles = objs.objFiles
2295 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002296 }
Yu Liu4f825132024-12-18 00:35:39 +00002297 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002298 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2299 }
2300
Yu Liuf6f85492025-01-13 21:02:36 +00002301 linkableInfo := CreateCommonLinkableInfo(ctx, c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002302 if lib, ok := c.linker.(VersionedInterface); ok {
2303 linkableInfo.StubsVersion = lib.StubsVersion()
Yu Liu8024b922024-12-20 23:31:32 +00002304 }
2305 if c.linker != nil {
2306 if library, ok := c.linker.(libraryInterface); ok {
2307 linkableInfo.Static = library.static()
Yu Liu8a8d5b42025-01-07 00:48:08 +00002308 linkableInfo.Shared = library.shared()
Yu Liu8024b922024-12-20 23:31:32 +00002309 linkableInfo.CoverageFiles = library.objs().coverageFiles
2310 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2311 }
2312 }
2313 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002314
Yu Liu323d77a2024-12-16 23:13:57 +00002315 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002316 IsPrebuilt: c.IsPrebuilt(),
2317 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
Yu Liu68a70b72025-01-08 22:54:44 +00002318 HasLlndkStubs: c.HasLlndkStubs(),
Yu Liu0a37d422025-02-13 02:05:00 +00002319 DataPaths: c.DataPaths(),
Yu Liu323d77a2024-12-16 23:13:57 +00002320 }
2321 if c.compiler != nil {
Cole Faustc9b88c92025-02-06 17:58:26 -08002322 cflags := c.compiler.baseCompilerProps().Cflags
Yu Liu323d77a2024-12-16 23:13:57 +00002323 ccInfo.CompilerInfo = &CompilerInfo{
2324 Srcs: c.compiler.(CompiledInterface).Srcs(),
Cole Faustc9b88c92025-02-06 17:58:26 -08002325 Cflags: cflags.GetOrDefault(ctx, nil),
Yu Liu323d77a2024-12-16 23:13:57 +00002326 AidlInterfaceInfo: AidlInterfaceInfo{
2327 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2328 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2329 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2330 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2331 },
2332 }
2333 switch decorator := c.compiler.(type) {
2334 case *libraryDecorator:
2335 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Cole Faustc9b88c92025-02-06 17:58:26 -08002336 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs.GetOrDefault(ctx, nil),
Yu Liu323d77a2024-12-16 23:13:57 +00002337 }
2338 }
2339 }
2340 if c.linker != nil {
Cole Faustc9b88c92025-02-06 17:58:26 -08002341 baseLinkerProps := c.linker.baseLinkerProps()
Yu Liu323d77a2024-12-16 23:13:57 +00002342 ccInfo.LinkerInfo = &LinkerInfo{
Cole Faustc9b88c92025-02-06 17:58:26 -08002343 WholeStaticLibs: baseLinkerProps.Whole_static_libs.GetOrDefault(ctx, nil),
2344 StaticLibs: baseLinkerProps.Static_libs.GetOrDefault(ctx, nil),
2345 SharedLibs: baseLinkerProps.Shared_libs.GetOrDefault(ctx, nil),
2346 HeaderLibs: baseLinkerProps.Header_libs.GetOrDefault(ctx, nil),
Yu Liu323d77a2024-12-16 23:13:57 +00002347 }
2348 switch decorator := c.linker.(type) {
2349 case *binaryDecorator:
2350 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2351 case *libraryDecorator:
Yu Liu116610a2025-01-06 21:54:48 +00002352 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
2353 InjectBsslHash: Bool(c.linker.(*libraryDecorator).Properties.Inject_bssl_hash),
Yu Liu95cef3a2025-02-25 00:54:20 +00002354 NdkSysrootPath: c.linker.(*libraryDecorator).ndkSysrootPath,
Yu Liu116610a2025-01-06 21:54:48 +00002355 }
Yu Liu323d77a2024-12-16 23:13:57 +00002356 case *testBinary:
2357 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2358 Gtest: decorator.testDecorator.gtest(),
2359 }
2360 case *benchmarkDecorator:
2361 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2362 case *objectLinker:
Yu Liu95cef3a2025-02-25 00:54:20 +00002363 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{
2364 NdkSysrootPath: c.linker.(*objectLinker).ndkSysrootPath,
2365 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002366 case *stubDecorator:
2367 ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{}
Yu Liu323d77a2024-12-16 23:13:57 +00002368 }
Yu Liu8024b922024-12-20 23:31:32 +00002369
2370 if s, ok := c.linker.(SnapshotInterface); ok {
2371 ccInfo.SnapshotInfo = &SnapshotInfo{
2372 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2373 }
Yu Liuffe86322024-12-18 18:53:12 +00002374 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002375 if v, ok := c.linker.(VersionedInterface); ok {
2376 name := v.ImplementationModuleName(ctx.OtherModuleName(c))
Yu Liu68a70b72025-01-08 22:54:44 +00002377 ccInfo.LinkerInfo.ImplementationModuleName = &name
2378 }
Yu Liuffe86322024-12-18 18:53:12 +00002379 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002380 if c.library != nil {
2381 ccInfo.LibraryInfo = &LibraryInfo{
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002382 BuildStubs: c.library.BuildStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002383 }
2384 }
Yu Liu2a815b62025-02-21 20:46:25 +00002385 if c.installer != nil {
2386 ccInfo.InstallerInfo = &InstallerInfo{}
2387 if installer, ok := c.installer.(*stubDecorator); ok {
2388 ccInfo.InstallerInfo.StubDecoratorInfo = &StubDecoratorInfo{
2389 HasAbiDump: installer.hasAbiDump,
2390 AbiDumpPath: installer.abiDumpPath,
2391 AbiDiffPaths: installer.abiDiffPaths,
Yu Liu95cef3a2025-02-25 00:54:20 +00002392 InstallPath: installer.installPath,
Yu Liu2a815b62025-02-21 20:46:25 +00002393 }
2394 }
2395 }
Yu Liu8024b922024-12-20 23:31:32 +00002396 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002397
mrziwangabdb2932024-06-18 12:43:41 -07002398 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002399
2400 if c.makeVarsInfo != nil {
2401 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2402 }
mrziwangabdb2932024-06-18 12:43:41 -07002403}
2404
Yu Liuf6f85492025-01-13 21:02:36 +00002405func CreateCommonLinkableInfo(ctx android.ModuleContext, mod VersionedLinkableInterface) *LinkableInfo {
Yu Liu0a37d422025-02-13 02:05:00 +00002406 info := &LinkableInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002407 StaticExecutable: mod.StaticExecutable(),
2408 HasStubsVariants: mod.HasStubsVariants(),
2409 OutputFile: mod.OutputFile(),
2410 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
Yu Liuf6f85492025-01-13 21:02:36 +00002411 CoverageOutputFile: mod.CoverageOutputFile(),
2412 Partition: mod.Partition(),
Yu Liu8024b922024-12-20 23:31:32 +00002413 IsStubs: mod.IsStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002414 CcLibrary: mod.CcLibrary(),
Yu Liu8024b922024-12-20 23:31:32 +00002415 CcLibraryInterface: mod.CcLibraryInterface(),
2416 RustLibraryInterface: mod.RustLibraryInterface(),
Yu Liu8024b922024-12-20 23:31:32 +00002417 IsLlndk: mod.IsLlndk(),
Yu Liuf6f85492025-01-13 21:02:36 +00002418 IsNdk: mod.IsNdk(ctx.Config()),
Yu Liu8024b922024-12-20 23:31:32 +00002419 HasNonSystemVariants: mod.HasNonSystemVariants(),
2420 SubName: mod.SubName(),
2421 InVendorOrProduct: mod.InVendorOrProduct(),
2422 InRamdisk: mod.InRamdisk(),
2423 OnlyInRamdisk: mod.OnlyInRamdisk(),
2424 InVendorRamdisk: mod.InVendorRamdisk(),
2425 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2426 InRecovery: mod.InRecovery(),
2427 OnlyInRecovery: mod.OnlyInRecovery(),
Yu Liu367827f2025-02-15 00:18:33 +00002428 InVendor: mod.InVendor(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002429 Installable: mod.Installable(),
Yu Liu97880e12025-01-07 19:03:34 +00002430 RelativeInstallPath: mod.RelativeInstallPath(),
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002431 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
Yu Liu0a37d422025-02-13 02:05:00 +00002432 RustApexExclude: mod.RustApexExclude(),
2433 Bootstrap: mod.Bootstrap(),
2434 Multilib: mod.Multilib(),
2435 ImplementationModuleNameForMake: mod.ImplementationModuleNameForMake(),
2436 Symlinks: mod.Symlinks(),
Yu Liu8024b922024-12-20 23:31:32 +00002437 }
Yu Liu8024b922024-12-20 23:31:32 +00002438
Yu Liu367827f2025-02-15 00:18:33 +00002439 vi := mod.VersionedInterface()
2440 if vi != nil {
2441 info.IsStubsImplementationRequired = vi.IsStubsImplementationRequired()
2442 info.APIListCoverageXMLPath = vi.GetAPIListCoverageXMLPath()
Yu Liuec7043d2024-11-05 18:22:20 +00002443 }
Yu Liu367827f2025-02-15 00:18:33 +00002444
2445 return info
Yu Liuec7043d2024-11-05 18:22:20 +00002446}
2447
mrziwangabdb2932024-06-18 12:43:41 -07002448func (c *Module) setOutputFiles(ctx ModuleContext) {
2449 if c.outputFile.Valid() {
2450 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2451 } else {
2452 ctx.SetOutputFiles(android.Paths{}, "")
2453 }
2454 if c.linker != nil {
2455 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2456 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2457 }
Wei Lia1aa2972024-06-21 13:08:51 -07002458}
2459
2460func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2461 // Dump metadata that can not be done in android/compliance-metadata.go
2462 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
Wei Li8ede4f72025-01-15 21:24:22 -08002463 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static() || ctx.ModuleType() == "cc_object"))
Wei Lia1aa2972024-06-21 13:08:51 -07002464 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2465
2466 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002467 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002468 staticDepNames := make([]string, 0, len(staticDeps))
2469 for _, dep := range staticDeps {
2470 staticDepNames = append(staticDepNames, dep.Name())
2471 }
Wei Li8ede4f72025-01-15 21:24:22 -08002472 // Process CrtBegin and CrtEnd as static libs
Yu Liu727204c2025-01-23 20:58:32 +00002473 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Wei Li8ede4f72025-01-15 21:24:22 -08002474 depName := ctx.OtherModuleName(dep)
2475 depTag := ctx.OtherModuleDependencyTag(dep)
2476 switch depTag {
2477 case CrtBeginDepTag:
2478 staticDepNames = append(staticDepNames, depName)
2479 case CrtEndDepTag:
2480 staticDepNames = append(staticDepNames, depName)
2481 }
2482 })
Wei Lia1aa2972024-06-21 13:08:51 -07002483
Wei Li8ede4f72025-01-15 21:24:22 -08002484 staticDepPaths := make([]string, 0, len(deps.StaticLibs)+len(deps.CrtBegin)+len(deps.CrtEnd))
Wei Lia1aa2972024-06-21 13:08:51 -07002485 for _, dep := range deps.StaticLibs {
2486 staticDepPaths = append(staticDepPaths, dep.String())
2487 }
Wei Li8ede4f72025-01-15 21:24:22 -08002488 for _, dep := range deps.CrtBegin {
2489 staticDepPaths = append(staticDepPaths, dep.String())
2490 }
2491 for _, dep := range deps.CrtEnd {
2492 staticDepPaths = append(staticDepPaths, dep.String())
2493 }
Wei Lia1aa2972024-06-21 13:08:51 -07002494 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2495 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2496
2497 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002498 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002499 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2500 for _, dep := range wholeStaticDeps {
2501 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2502 }
2503
2504 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2505 for _, dep := range deps.WholeStaticLibs {
2506 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2507 }
2508 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2509 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Wei Li8ede4f72025-01-15 21:24:22 -08002510
2511 // Header libs
2512 headerLibDeps := ctx.GetDirectDepsProxyWithTag(HeaderDepTag())
2513 headerLibDepNames := make([]string, 0, len(headerLibDeps))
2514 for _, dep := range headerLibDeps {
2515 headerLibDepNames = append(headerLibDepNames, dep.Name())
2516 }
2517 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.HEADER_LIBS, android.FirstUniqueStrings(headerLibDepNames))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002518}
2519
2520func (c *Module) maybeUnhideFromMake() {
2521 // If a lib is directly included in any of the APEXes or is not available to the
2522 // platform (which is often the case when the stub is provided as a prebuilt),
2523 // unhide the stubs variant having the latest version gets visible to make. In
2524 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2525 // force anything in the make world to link against the stubs library. (unless it
2526 // is explicitly referenced via .bootstrap suffix or the module is marked with
2527 // 'bootstrap: true').
2528 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002529 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002530 c.IsStubs() && !c.InVendorRamdisk() {
2531 c.Properties.HideFromMake = false // unhide
2532 // Note: this is still non-installable
2533 }
2534}
2535
Colin Cross8ff10582023-12-07 13:10:56 -08002536// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2537// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002538func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002539 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002540 // If the module has been specifically configure to not be installed then
2541 // hide from make as otherwise it will break when running inside make
2542 // as the output path to install will not be specified. Not all uninstallable
2543 // modules can be hidden from make as some are needed for resolving make side
2544 // dependencies.
2545 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002546 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002547 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002548 c.SkipInstall()
2549 }
2550
2551 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2552 // to allow using the outputs in a genrule.
2553 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002554 c.installer.install(ctx, c.outputFile.Path())
2555 if ctx.Failed() {
2556 return
Colin Crossca860ac2016-01-04 14:34:37 -08002557 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002558 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002559}
2560
Colin Cross0ea8ba82019-06-06 14:33:29 -07002561func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002562 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002563 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002564 }
Colin Crossca860ac2016-01-04 14:34:37 -08002565 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002566}
2567
Colin Crossca860ac2016-01-04 14:34:37 -08002568func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002569 for _, generator := range c.generators {
2570 generator.GeneratorInit(ctx)
2571 }
Colin Crossca860ac2016-01-04 14:34:37 -08002572 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002573 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002574 }
Colin Crossca860ac2016-01-04 14:34:37 -08002575 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002576 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002577 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002578 if c.stl != nil {
2579 c.stl.begin(ctx)
2580 }
Colin Cross16b23492016-01-06 14:41:07 -08002581 if c.sanitize != nil {
2582 c.sanitize.begin(ctx)
2583 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002584 if c.coverage != nil {
2585 c.coverage.begin(ctx)
2586 }
Yi Kong9723e332023-12-04 14:52:53 +09002587 if c.afdo != nil {
2588 c.afdo.begin(ctx)
2589 }
Stephen Craneba090d12017-05-09 15:44:35 -07002590 if c.lto != nil {
2591 c.lto.begin(ctx)
2592 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002593 if c.orderfile != nil {
2594 c.orderfile.begin(ctx)
2595 }
Dan Albert92fe7402020-07-15 13:33:30 -07002596 if ctx.useSdk() && c.IsSdkVariant() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002597 version, err := NativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002598 if err != nil {
2599 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002600 c.Properties.Sdk_version = nil
2601 } else {
2602 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002603 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002604 }
Colin Crossca860ac2016-01-04 14:34:37 -08002605}
2606
Colin Cross37047f12016-12-13 17:06:13 -08002607func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002608 deps := Deps{}
2609
Joe Onorato37f900c2023-07-18 16:58:16 -07002610 for _, generator := range c.generators {
2611 deps = generator.GeneratorDeps(ctx, deps)
2612 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002613 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002614 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002615 }
2616 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002617 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002618 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002619 if c.stl != nil {
2620 deps = c.stl.deps(ctx, deps)
2621 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002622 if c.coverage != nil {
2623 deps = c.coverage.deps(ctx, deps)
2624 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002625
Colin Crossb6715442017-10-24 11:13:31 -07002626 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2627 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2628 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2629 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2630 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2631 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002632 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002633 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002634
Colin Cross516c5452024-10-28 13:45:21 -07002635 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2636 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2637 }
2638
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002639 for _, lib := range deps.ReexportSharedLibHeaders {
2640 if !inList(lib, deps.SharedLibs) {
2641 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2642 }
2643 }
2644
2645 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002646 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2647 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 -07002648 }
2649 }
2650
Colin Cross5950f382016-12-13 12:50:57 -08002651 for _, lib := range deps.ReexportHeaderLibHeaders {
2652 if !inList(lib, deps.HeaderLibs) {
2653 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2654 }
2655 }
2656
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002657 for _, gen := range deps.ReexportGeneratedHeaders {
2658 if !inList(gen, deps.GeneratedHeaders) {
2659 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2660 }
2661 }
2662
Colin Crossc99deeb2016-04-11 15:06:20 -07002663 return deps
2664}
2665
Colin Cross516c5452024-10-28 13:45:21 -07002666func checkConflictingExplicitVersions(libs []string) error {
2667 withoutVersion := func(s string) string {
2668 name, _ := StubsLibNameAndVersion(s)
2669 return name
2670 }
2671 var errs []error
2672 for i, lib := range libs {
2673 libName := withoutVersion(lib)
2674 libsToCompare := libs[i+1:]
2675 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2676 return withoutVersion(s) == libName
2677 })
2678 if j >= 0 {
2679 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2680 lib, libsToCompare[j]))
2681 }
2682 }
2683 return errors.Join(errs...)
2684}
2685
Dan Albert7e9d2952016-08-04 13:02:36 -07002686func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002687 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002688 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002689 moduleContextImpl: moduleContextImpl{
2690 mod: c,
2691 },
2692 }
2693 ctx.ctx = ctx
2694
Colin Crossca860ac2016-01-04 14:34:37 -08002695 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002696}
2697
Jiyong Park7ed9de32018-10-15 22:25:07 +09002698// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002699func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002700 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2701 version := name[sharp+1:]
2702 libname := name[:sharp]
2703 return libname, version
2704 }
2705 return name, ""
2706}
2707
Dan Albert92fe7402020-07-15 13:33:30 -07002708func GetCrtVariations(ctx android.BottomUpMutatorContext,
2709 m LinkableInterface) []blueprint.Variation {
2710 if ctx.Os() != android.Android {
2711 return nil
2712 }
2713 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002714 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2715 minSdkVersion := m.MinSdkVersion()
2716 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2717 minSdkVersion = m.SdkVersion()
2718 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002719 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2720 if err != nil {
2721 ctx.PropertyErrorf("min_sdk_version", err.Error())
2722 }
Colin Cross363ec762023-01-13 13:45:14 -08002723
2724 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002725 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002726 if apiLevel.LessThan(minApiForArch) {
2727 apiLevel = minApiForArch
2728 }
2729
Dan Albert92fe7402020-07-15 13:33:30 -07002730 return []blueprint.Variation{
2731 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002732 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002733 }
2734 }
2735 return []blueprint.Variation{
2736 {Mutator: "sdk", Variation: ""},
2737 }
2738}
2739
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002740func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2741 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002742
2743 variations = append([]blueprint.Variation(nil), variations...)
2744
Liz Kammer23942242022-04-08 15:41:00 -04002745 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002746 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002747 if version == "impl" {
2748 version = ""
2749 }
Colin Crosse7257d22020-09-24 09:56:18 -07002750 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002751 if tag, ok := depTag.(libraryDependencyTag); ok {
2752 tag.explicitlyVersioned = true
Colin Crossbd930bc2025-02-03 12:17:42 -08002753 if version == "" {
2754 tag.explicitlyImpl = true
2755 }
Colin Crossafcdce82024-10-22 13:59:33 -07002756 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2757 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2758 // the modified copy to depTag.
2759 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002760 } else {
2761 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2762 }
Colin Crosse7257d22020-09-24 09:56:18 -07002763 }
Colin Crosse7257d22020-09-24 09:56:18 -07002764
Colin Cross0de8a1e2020-09-18 14:15:30 -07002765 if far {
2766 ctx.AddFarVariationDependencies(variations, depTag, name)
2767 } else {
2768 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002769 }
2770}
2771
Kiyoung Kim487689e2022-07-26 09:48:22 +09002772func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2773 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002774 return snapshot
2775 }
2776
2777 return lib
2778}
2779
Kiyoung Kim37693d02024-04-04 09:56:15 +09002780// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002781// of names:
2782//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002783// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002784//
2785// For each of these, it adds the name of the ndk_library module to the list of
2786// variant libs.
2787//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002788// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002789//
2790// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002791//
2792// The caller can then know to add the variantLibs dependencies differently from the
2793// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002794func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002795 variantLibs = []string{}
2796
2797 nonvariantLibs = []string{}
2798 for _, entry := range list {
2799 // strip #version suffix out
2800 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002801 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002802 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002803 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002804 nonvariantLibs = append(nonvariantLibs, entry)
2805 }
2806 }
2807 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002808
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002809}
2810
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002811func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2812 nonVariantLibs := []string{}
2813 variantLibs := []string{}
2814
2815 for _, lib := range libs {
2816 replaceLibName := GetReplaceModuleName(lib, replaceList)
2817 if replaceLibName == lib {
2818 // Do not handle any libs which are not in API imports
2819 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2820 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2821 variantLibs = append(variantLibs, replaceLibName)
2822 } else {
2823 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2824 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002825 }
2826
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002827 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002828}
2829
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002830func (c *Module) shouldUseApiSurface() bool {
2831 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2832 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2833 // LLNDK Variant
2834 return true
2835 }
2836
2837 if c.Properties.IsSdkVariant {
2838 // NDK Variant
2839 return true
2840 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002841 }
2842
2843 return false
2844}
2845
Colin Cross1e676be2016-10-12 14:38:15 -07002846func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002847 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002848 return
2849 }
2850
Colin Cross37047f12016-12-13 17:06:13 -08002851 ctx := &depsContext{
2852 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002853 moduleContextImpl: moduleContextImpl{
2854 mod: c,
2855 },
2856 }
2857 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002858
Colin Crossc99deeb2016-04-11 15:06:20 -07002859 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002860
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002861 apiNdkLibs := []string{}
2862 apiLateNdkLibs := []string{}
2863
Yo Chiang219968c2020-09-22 18:45:04 +08002864 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2865
Dan Albert914449f2016-06-17 16:45:24 -07002866 variantNdkLibs := []string{}
2867 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002868 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002869 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2870 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2871 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002872 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002873
Colin Cross32ec36c2016-12-15 07:39:51 -08002874 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002875 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002876 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002877 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002878 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002879
Spandan Das73bcafc2022-08-18 23:26:00 +00002880 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002881 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2882 if variationExists {
2883 actx.AddVariationDependencies(nil, depTag, lib)
2884 } else {
2885 // dependencies to ndk_headers fall here as ndk_headers do not have
2886 // any variants.
2887 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2888 }
Spandan Dasff665182024-09-11 18:48:44 +00002889 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002890 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002891 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002892 } else {
2893 actx.AddVariationDependencies(nil, depTag, lib)
2894 }
2895 }
2896
Dan Albertf1d14c72020-07-30 14:32:55 -07002897 if c.isNDKStubLibrary() {
2898 // NDK stubs depend on their implementation because the ABI dumps are
2899 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002900
Spandan Das8b08aea2023-03-14 19:29:34 +00002901 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2902 c.ImageVariation(),
2903 blueprint.Variation{Mutator: "link", Variation: "shared"},
2904 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002905 }
2906
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002907 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2908 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2909 c.Target().NativeBridge == android.NativeBridgeDisabled {
2910 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002911 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002912 llndkHeaderLibTag,
2913 deps.LlndkHeaderLibs...)
2914 }
2915
Jiyong Park5d1598f2019-02-25 22:14:17 +09002916 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002917 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002918
Jiyong Park5d1598f2019-02-25 22:14:17 +09002919 actx.AddVariationDependencies([]blueprint.Variation{
2920 {Mutator: "link", Variation: "static"},
2921 }, depTag, lib)
2922 }
2923
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002924 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002925 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002926 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002927
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002928 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002929 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002930 }
Jiyong Parke3867542020-12-03 17:28:25 +09002931 if inList(lib, deps.ExcludeLibsForApex) {
2932 depTag.excludeInApex = true
2933 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002934 actx.AddVariationDependencies([]blueprint.Variation{
2935 {Mutator: "link", Variation: "static"},
2936 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002937 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002938
Jooyung Han75568392020-03-20 04:29:24 +09002939 // staticUnwinderDep is treated as staticDep for Q apexes
2940 // so that native libraries/binaries are linked with static unwinder
2941 // because Q libc doesn't have unwinder APIs
2942 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002943 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002944 actx.AddVariationDependencies([]blueprint.Variation{
2945 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002946 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002947 }
2948
Jiyong Park7ed9de32018-10-15 22:25:07 +09002949 // shared lib names without the #version suffix
2950 var sharedLibNames []string
2951
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002952 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002953 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002954 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002955 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002956 }
Jiyong Parke3867542020-12-03 17:28:25 +09002957 if inList(lib, deps.ExcludeLibsForApex) {
2958 depTag.excludeInApex = true
2959 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002960 if inList(lib, deps.ExcludeLibsForNonApex) {
2961 depTag.excludeInNonApex = true
2962 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002963
Jiyong Park73c54ee2019-10-22 20:31:18 +09002964 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002965 sharedLibNames = append(sharedLibNames, name)
2966
Colin Crosse7257d22020-09-24 09:56:18 -07002967 variations := []blueprint.Variation{
2968 {Mutator: "link", Variation: "shared"},
2969 }
Spandan Dasff665182024-09-11 18:48:44 +00002970 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002971 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002972
Colin Crossfe9acfe2021-06-14 16:13:03 -07002973 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002974 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002975 actx.AddVariationDependencies([]blueprint.Variation{
2976 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002977 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002978 }
2979
Colin Cross3e5e7782022-06-17 22:17:05 +00002980 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002981 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002982 actx.AddVariationDependencies([]blueprint.Variation{
2983 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002984 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002985 }
2986
Jiyong Park7ed9de32018-10-15 22:25:07 +09002987 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002988 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002989 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2990 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2991 // linking against both the stubs lib and the non-stubs lib at the same time.
2992 continue
2993 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002994 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002995 variations := []blueprint.Variation{
2996 {Mutator: "link", Variation: "shared"},
2997 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002998 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002999 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003000
Dan Willemsen59339a22018-07-22 21:18:45 -07003001 actx.AddVariationDependencies([]blueprint.Variation{
3002 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04003003 }, dataLibDepTag, deps.DataLibs...)
3004
Colin Crossc8caa062021-09-24 16:50:14 -07003005 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
3006
Chris Parsons79d66a52020-06-05 17:26:16 -04003007 actx.AddVariationDependencies([]blueprint.Variation{
3008 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07003009 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08003010
Colin Cross68861832016-07-08 10:41:41 -07003011 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003012
3013 for _, gen := range deps.GeneratedHeaders {
3014 depTag := genHeaderDepTag
3015 if inList(gen, deps.ReexportGeneratedHeaders) {
3016 depTag = genHeaderExportDepTag
3017 }
3018 actx.AddDependency(c, depTag, gen)
3019 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003020
Cole Faust65cb40a2024-10-21 15:41:42 -07003021 for _, gen := range deps.DeviceFirstGeneratedHeaders {
3022 depTag := genHeaderDepTag
3023 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
3024 }
3025
Dan Albert92fe7402020-07-15 13:33:30 -07003026 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07003027 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07003028 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07003029 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09003030 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08003031 }
Colin Crossc465efd2021-06-11 18:00:04 -07003032 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07003033 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09003034 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07003035 }
Dan Willemsena0790e32018-10-12 00:24:23 -07003036 if deps.DynamicLinker != "" {
3037 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07003038 }
Dan Albert914449f2016-06-17 16:45:24 -07003039
3040 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07003041
Colin Cross8acea3e2024-12-12 14:53:30 -08003042 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07003043 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07003044 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07003045 {Mutator: "link", Variation: "shared"},
3046 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003047 actx.AddVariationDependencies([]blueprint.Variation{
3048 {Mutator: "version", Variation: version},
3049 {Mutator: "link", Variation: "shared"},
3050 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07003051
Colin Cross8acea3e2024-12-12 14:53:30 -08003052 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07003053 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07003054 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07003055 {Mutator: "link", Variation: "shared"},
3056 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003057 actx.AddVariationDependencies([]blueprint.Variation{
3058 {Mutator: "version", Variation: version},
3059 {Mutator: "link", Variation: "shared"},
3060 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08003061
Vinh Tran367d89d2023-04-28 11:21:25 -04003062 if len(deps.AidlLibs) > 0 {
3063 actx.AddDependency(
3064 c,
3065 aidlLibraryTag,
3066 deps.AidlLibs...,
3067 )
3068 }
3069
Colin Cross6362e272015-10-29 15:25:03 -07003070}
Colin Cross21b9a242015-03-24 14:15:58 -07003071
Colin Crosse40b4ea2018-10-02 22:25:58 -07003072func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07003073 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07003074 c.beginMutator(ctx)
3075 }
3076}
3077
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003078// Whether a module can link to another module, taking into
3079// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09003080func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07003081 tag blueprint.DependencyTag) {
3082
3083 switch t := tag.(type) {
3084 case dependencyTag:
3085 if t != vndkExtDepTag {
3086 return
3087 }
3088 case libraryDependencyTag:
3089 default:
3090 return
3091 }
3092
Ivan Lozanof9e21722020-12-02 09:00:51 -05003093 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003094 // Host code is not restricted
3095 return
3096 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003097
Ivan Lozano52767be2019-10-18 14:49:46 -07003098 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003099 // Platform code can link to anything
3100 return
3101 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08003102 if from.InRamdisk() {
3103 // Ramdisk code is not NDK
3104 return
3105 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003106 if from.InVendorRamdisk() {
3107 // Vendor ramdisk code is not NDK
3108 return
3109 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003110 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09003111 // Recovery code is not NDK
3112 return
3113 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003114 // Change this to LinkableInterface if Rust gets NDK support, which stubDecorators are for
Colin Cross31076b32020-10-23 17:22:06 -07003115 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003116 if c.StubDecorator() {
3117 // These aren't real libraries, but are the stub shared libraries that are included in
3118 // the NDK.
3119 return
3120 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003121 }
Logan Chien834b9a62019-01-14 15:39:03 +08003122
Ivan Lozano52767be2019-10-18 14:49:46 -07003123 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003124 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3125 // to link to libc++ (non-NDK and without sdk_version).
3126 return
3127 }
3128
Ivan Lozano52767be2019-10-18 14:49:46 -07003129 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003130 // NDK code linking to platform code is never okay.
3131 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003132 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003133 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003134 }
3135
3136 // At this point we know we have two NDK libraries, but we need to
3137 // check that we're not linking against anything built against a higher
3138 // API level, as it is only valid to link against older or equivalent
3139 // APIs.
3140
Inseob Kim01a28722018-04-11 09:48:45 +09003141 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003142 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003143 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003144 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003145 // Current can't be linked against by anything else.
3146 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003147 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003148 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003149 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003150 if err != nil {
3151 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003152 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003153 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003154 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003155 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003156 if err != nil {
3157 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003158 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003159 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003160 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003161
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003162 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003163 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003164 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003165 }
3166 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003167 }
Dan Albert202fe492017-12-15 13:56:59 -08003168
3169 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003170 fromStl := from.SelectedStl()
3171 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003172 if fromStl == "" || toStl == "" {
3173 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003174 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003175 // We can be permissive with the system "STL" since it is only the C++
3176 // ABI layer, but in the future we should make sure that everyone is
3177 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003178 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003179 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003180 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3181 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003182 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003183}
3184
Jooyung Han479ca172020-10-19 18:51:07 +09003185func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3186 if c, ok := ctx.Module().(*Module); ok {
3187 ctx.VisitDirectDeps(func(dep android.Module) {
3188 depTag := ctx.OtherModuleDependencyTag(dep)
3189 ccDep, ok := dep.(LinkableInterface)
3190 if ok {
3191 checkLinkType(ctx, c, ccDep, depTag)
3192 }
3193 })
3194 }
3195}
3196
Jiyong Park5fb8c102018-04-09 12:03:06 +09003197// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003198// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3199// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003200// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003201func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003202 check := func(child, parent android.Module) bool {
3203 to, ok := child.(*Module)
3204 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003205 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003206 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003207
Jooyung Hana70f0672019-01-18 15:20:43 +09003208 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3209 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003210 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003211
Jiyong Park0474e1f2021-01-14 14:26:06 +09003212 // These dependencies are not excercised at runtime. Tracking these will give us
3213 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003214 depTag := ctx.OtherModuleDependencyTag(child)
3215 if IsHeaderDepTag(depTag) {
3216 return false
3217 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003218 if depTag == staticVariantTag {
3219 return false
3220 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003221 if depTag == StubImplDepTag {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003222 return false
3223 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003224 if depTag == android.RequiredDepTag {
3225 return false
3226 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003227
Justin Yun63e9ec72020-10-29 16:49:43 +09003228 // Even if target lib has no vendor variant, keep checking dependency
3229 // graph in case it depends on vendor_available or product_available
3230 // but not double_loadable transtively.
3231 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003232 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003233 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003234
Jiyong Park0474e1f2021-01-14 14:26:06 +09003235 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3236 // one.
3237 if Bool(to.VendorProperties.Double_loadable) {
3238 return true
3239 }
3240
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003241 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003242 return false
3243 }
3244
Jooyung Hana70f0672019-01-18 15:20:43 +09003245 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3246 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003247 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003248 return false
3249 }
3250 if module, ok := ctx.Module().(*Module); ok {
3251 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003252 if lib.HasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003253 ctx.WalkDeps(check)
3254 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003255 }
3256 }
3257}
3258
Yu Liue4312402023-01-18 09:15:31 -08003259func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3260 // For the dependency from platform to apex, use the latest stubs
3261 apexSdkVersion := android.FutureApiLevel
3262 if !apexInfo.IsForPlatform() {
3263 apexSdkVersion = apexInfo.MinSdkVersion
3264 }
3265
3266 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3267 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3268 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3269 // (b/144430859)
3270 apexSdkVersion = android.FutureApiLevel
3271 }
3272
3273 return apexSdkVersion
3274}
3275
Colin Crossc99deeb2016-04-11 15:06:20 -07003276// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003277func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003278 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003279
Colin Cross0de8a1e2020-09-18 14:15:30 -07003280 var directStaticDeps []StaticLibraryInfo
3281 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003282
Colin Cross0de8a1e2020-09-18 14:15:30 -07003283 reexportExporter := func(exporter FlagExporterInfo) {
3284 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3285 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3286 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3287 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3288 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003289 }
3290
Colin Crossff694a82023-12-13 15:54:49 -08003291 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003292 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003293
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003294 skipModuleList := map[string]bool{}
3295
Yu Liu8024b922024-12-20 23:31:32 +00003296 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003297 depName := ctx.OtherModuleName(dep)
3298 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003299
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003300 if _, ok := skipModuleList[depName]; ok {
3301 // skip this module because original module or API imported module matching with this should be used instead.
3302 return
3303 }
3304
Yu Liu8024b922024-12-20 23:31:32 +00003305 var ccInfo *CcInfo
3306 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3307 if hasCcInfo {
3308 ccInfo = v
3309 }
3310 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003311 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003312 if !hasCcInfo {
3313 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3314 }
3315 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003316 return
3317 }
3318
Vinh Tran367d89d2023-04-28 11:21:25 -04003319 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003320 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003321 depPaths.AidlLibraryInfos = append(
3322 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003323 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003324 )
3325 }
3326 }
3327
Yu Liu8024b922024-12-20 23:31:32 +00003328 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003329 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003330 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003331 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003332 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003333 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003334 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003335 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003336 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003337 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003338 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003339 // Support exported headers from a generated_sources dependency
3340 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003341 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003342 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003343 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003344 genRule.GeneratedDeps...)
3345 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003346 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003347 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003348 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003349 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003350 genRule.GeneratedSourceFiles...)
3351 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003352 // 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 +09003353 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003354 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003355 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003356 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003357 }
Colin Crosscef792e2021-06-11 18:01:26 -07003358 case CrtBeginDepTag:
3359 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3360 case CrtEndDepTag:
3361 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003362 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003363 return
3364 }
3365
Colin Crossfe17f6f2019-03-28 19:30:56 -07003366 if depTag == android.ProtoPluginDepTag {
3367 return
3368 }
3369
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003370 if depTag == android.RequiredDepTag {
3371 return
3372 }
3373
Yu Liu8024b922024-12-20 23:31:32 +00003374 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3375 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003376 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 -07003377 return
3378 }
Yu Liu8024b922024-12-20 23:31:32 +00003379 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003380 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003381 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003382 return
3383 }
3384
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003385 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003386 // Skip reused objects for stub libraries, they use their own stub object file instead.
3387 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3388 // version mutator, so the stubs variant is created from the shared variant that
3389 // already has the reuseObjTag dependency on the static variant.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003390 if !c.library.BuildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003391 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003392 objs := staticAnalogue.ReuseObjects
3393 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003394 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003395 reexportExporter(depExporterInfo)
3396 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003397 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003398 }
3399
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003400 if depTag == llndkHeaderLibTag {
3401 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3402 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3403 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3404 }
3405
Yu Liu8024b922024-12-20 23:31:32 +00003406 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003407
3408 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3409 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003410 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003411 return
3412 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003413
Jiyong Parke3867542020-12-03 17:28:25 +09003414 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3415 return
3416 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003417 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3418 return
3419 }
Jiyong Parke3867542020-12-03 17:28:25 +09003420
Colin Cross313aa542023-12-13 13:47:44 -08003421 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003422
Colin Cross6e511a92020-07-27 21:26:48 -07003423 var ptr *android.Paths
3424 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003425
Colin Cross6e511a92020-07-27 21:26:48 -07003426 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003427
Colin Cross6e511a92020-07-27 21:26:48 -07003428 switch {
3429 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003430 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003431 if !ctx.Config().AllowMissingDependencies() {
3432 ctx.ModuleErrorf("module %q is not a header library", depName)
3433 } else {
3434 ctx.AddMissingDependencies([]string{depName})
3435 }
3436 return
3437 }
Colin Cross6e511a92020-07-27 21:26:48 -07003438 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003439 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003440 if !ctx.Config().AllowMissingDependencies() {
3441 ctx.ModuleErrorf("module %q is not a shared library", depName)
3442 } else {
3443 ctx.AddMissingDependencies([]string{depName})
3444 }
3445 return
3446 }
Jiyong Parke3867542020-12-03 17:28:25 +09003447
Jiyong Park7d55b612021-06-11 17:22:09 +09003448 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3449 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003450
Jiyong Park1ad8e162020-12-01 23:40:09 +09003451 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3452 // linkFile, depFile, and ptr.
3453 if c.IsStubs() {
3454 break
3455 }
3456
Colin Cross0de8a1e2020-09-18 14:15:30 -07003457 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3458 depFile = sharedLibraryInfo.TableOfContents
3459
Colin Crossb614cd42024-10-11 12:52:21 -07003460 if !sharedLibraryInfo.IsStubs {
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003461 // TODO(b/362509506): remove this additional check once all apex_exclude uses are switched to stubs.
3462 if !linkableInfo.RustApexExclude {
3463 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3464 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3465 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3466 }
Colin Crossb614cd42024-10-11 12:52:21 -07003467 }
3468 }
3469
Colin Cross6e511a92020-07-27 21:26:48 -07003470 ptr = &depPaths.SharedLibs
3471 switch libDepTag.Order {
3472 case earlyLibraryDependency:
3473 ptr = &depPaths.EarlySharedLibs
3474 depPtr = &depPaths.EarlySharedLibsDeps
3475 case normalLibraryDependency:
3476 ptr = &depPaths.SharedLibs
3477 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003478 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003479 case lateLibraryDependency:
3480 ptr = &depPaths.LateSharedLibs
3481 depPtr = &depPaths.LateSharedLibsDeps
3482 default:
3483 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003484 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003485
Colin Cross6e511a92020-07-27 21:26:48 -07003486 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003487 if linkableInfo.RustLibraryInterface {
3488 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003489 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3490 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3491 if libDepTag.wholeStatic {
3492 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3493 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003494
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003495 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3496 // exported functions from the rust generated staticlib still exported.
3497 if c.CcLibrary() && c.Shared() {
3498 c.WholeRustStaticlib = true
3499 }
Colin Cross6e511a92020-07-27 21:26:48 -07003500 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003501
Colin Cross6e511a92020-07-27 21:26:48 -07003502 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003503 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3504 if !isStaticLib {
3505 if !ctx.Config().AllowMissingDependencies() {
3506 ctx.ModuleErrorf("module %q is not a static library", depName)
3507 } else {
3508 ctx.AddMissingDependencies([]string{depName})
3509 }
3510 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003511 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003512
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003513 // Stubs lib doesn't link to the static lib dependencies. Don't set
3514 // linkFile, depFile, and ptr.
3515 if c.IsStubs() {
3516 break
3517 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003518
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003519 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3520 if libDepTag.wholeStatic {
3521 ptr = &depPaths.WholeStaticLibs
3522 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3523 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3524 } else {
3525 // This case normally catches prebuilt static
3526 // libraries, but it can also occur when
3527 // AllowMissingDependencies is on and the
3528 // dependencies has no sources of its own
3529 // but has a whole_static_libs dependency
3530 // on a missing library. We want to depend
3531 // on the .a file so that there is something
3532 // in the dependency tree that contains the
3533 // error rule for the missing transitive
3534 // dependency.
3535 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3536 }
3537 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3538 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3539 } else {
3540 switch libDepTag.Order {
3541 case earlyLibraryDependency:
3542 panic(fmt.Errorf("early static libs not supported"))
3543 case normalLibraryDependency:
3544 // static dependencies will be handled separately so they can be ordered
3545 // using transitive dependencies.
3546 ptr = nil
3547 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3548 case lateLibraryDependency:
3549 ptr = &depPaths.LateStaticLibs
3550 default:
3551 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3552 }
3553 }
3554
3555 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3556 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3557
3558 if libDepTag.unexportedSymbols {
3559 depPaths.LdFlags = append(depPaths.LdFlags,
3560 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3561 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003562 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003563 }
3564
Yu Liu8024b922024-12-20 23:31:32 +00003565 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3566 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003567 ctx.ModuleErrorf("module %q not a static library", depName)
3568 return
3569 }
Logan Chien43d34c32017-12-20 01:17:32 +08003570
Colin Cross6e511a92020-07-27 21:26:48 -07003571 // When combining coverage files for shared libraries and executables, coverage files
3572 // in static libraries act as if they were whole static libraries. The same goes for
3573 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003574 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003575 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003576 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003577 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003578 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003579 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003580 // Handle non-CC modules here
3581 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003582 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003583 }
3584 }
3585
Colin Cross6e511a92020-07-27 21:26:48 -07003586 if ptr != nil {
3587 if !linkFile.Valid() {
3588 if !ctx.Config().AllowMissingDependencies() {
3589 ctx.ModuleErrorf("module %q missing output file", depName)
3590 } else {
3591 ctx.AddMissingDependencies([]string{depName})
3592 }
3593 return
3594 }
3595 *ptr = append(*ptr, linkFile.Path())
3596 }
3597
3598 if depPtr != nil {
3599 dep := depFile
3600 if !dep.Valid() {
3601 dep = linkFile
3602 }
3603 *depPtr = append(*depPtr, dep.Path())
3604 }
3605
Colin Cross0de8a1e2020-09-18 14:15:30 -07003606 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3607 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3608 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3609 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003610 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3611
3612 // Only re-export RustRlibDeps for cc static libs
3613 if c.static() {
3614 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3615 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003616
3617 if libDepTag.reexportFlags {
3618 reexportExporter(depExporterInfo)
3619 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3620 // Re-exported shared library headers must be included as well since they can help us with type information
3621 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003622 c.sabi.Properties.ReexportedIncludes = append(
3623 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003624 c.sabi.Properties.ReexportedSystemIncludes = append(
3625 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003626 }
3627
Yu Liu0a37d422025-02-13 02:05:00 +00003628 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, commonInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003629 switch {
3630 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003631 c.Properties.AndroidMkHeaderLibs = append(
3632 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003633 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003634 // Note: the order of libs in this list is not important because
3635 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003636 c.Properties.AndroidMkSharedLibs = append(
3637 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003638 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003639 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003640 if libDepTag.wholeStatic {
3641 c.Properties.AndroidMkWholeStaticLibs = append(
3642 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3643 } else {
3644 c.Properties.AndroidMkStaticLibs = append(
3645 c.Properties.AndroidMkStaticLibs, makeLibName)
3646 }
Colin Cross6e511a92020-07-27 21:26:48 -07003647 }
3648 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003649 } else if !c.IsStubs() {
3650 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3651
Colin Cross6e511a92020-07-27 21:26:48 -07003652 switch depTag {
3653 case runtimeDepTag:
3654 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu0a37d422025-02-13 02:05:00 +00003655 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo,
3656 commonInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003657 case objDepTag:
3658 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3659 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003660 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003661 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003662 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003663 case dynamicLinkerDepTag:
3664 depPaths.DynamicLinker = linkFile
3665 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003666 }
Colin Crossca860ac2016-01-04 14:34:37 -08003667 })
3668
Jeff Gaston294356f2017-09-27 17:05:30 -07003669 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003670 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3671 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3672 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003673
Colin Crossdd84e052017-05-17 13:44:16 -07003674 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003675 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003676 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3677 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003678 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003679 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3680
Jiyong Park74955042019-10-22 20:19:51 +09003681 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3682 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003683 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003684 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003685 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003686 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003687
3688 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003689 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003690 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003691 }
Colin Crossdd84e052017-05-17 13:44:16 -07003692
Colin Crossca860ac2016-01-04 14:34:37 -08003693 return depPaths
3694}
3695
Yu Liuf6f85492025-01-13 21:02:36 +00003696func ShouldUseStubForApex(ctx android.ModuleContext, parent android.Module, dep android.ModuleProxy) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003697 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003698 bootstrap := false
Yu Liuf6f85492025-01-13 21:02:36 +00003699 if ctx.EqualModules(ctx.Module(), parent) {
3700 if linkable, ok := parent.(LinkableInterface); !ok {
3701 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3702 } else {
3703 inVendorOrProduct = linkable.InVendorOrProduct()
3704 bootstrap = linkable.Bootstrap()
3705 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003706 } else {
Yu Liuf6f85492025-01-13 21:02:36 +00003707 if linkable, ok := android.OtherModuleProvider(ctx, parent, LinkableInfoProvider); !ok {
3708 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3709 } else {
3710 inVendorOrProduct = linkable.InVendorOrProduct
3711 bootstrap = linkable.Bootstrap
3712 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003713 }
3714
Spandan Das10c41362024-12-03 01:33:09 +00003715 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003716
3717 useStubs := false
3718
Yu Liu8024b922024-12-20 23:31:32 +00003719 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003720 if !apexInfo.IsForPlatform() {
3721 // For platform libraries, use current version of LLNDK
3722 // If this is for use_vendor apex we will apply the same rules
3723 // of apex sdk enforcement below to choose right version.
3724 useStubs = true
3725 }
3726 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3727 // If not building for APEX or the containing APEX allows the use of
3728 // platform APIs, use stubs only when it is from an APEX (and not from
3729 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3730 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003731 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003732
Spandan Dasff665182024-09-11 18:48:44 +00003733 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003734 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003735 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3736 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003737 }
3738
3739 return useStubs
3740}
3741
3742// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3743// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3744// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3745// has different level of updatability. For example, if a library foo in an APEX depends on a
3746// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3747// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3748// same APEX as foo, the non-stub variant of bar is used.
Yu Liuf6f85492025-01-13 21:02:36 +00003749func ChooseStubOrImpl(ctx android.ModuleContext, dep android.ModuleProxy) (SharedLibraryInfo, FlagExporterInfo) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003750 depTag := ctx.OtherModuleDependencyTag(dep)
3751 libDepTag, ok := depTag.(libraryDependencyTag)
3752 if !ok || !libDepTag.shared() {
3753 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3754 }
3755
Colin Cross313aa542023-12-13 13:47:44 -08003756 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3757 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3758 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003759
3760 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003761 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003762 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003763 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3764 toUse := stubs[len(stubs)-1]
3765 sharedLibraryInfo = toUse.SharedLibraryInfo
3766 depExporterInfo = toUse.FlagExporterInfo
3767 }
3768 }
3769 return sharedLibraryInfo, depExporterInfo
3770}
3771
Colin Cross0de8a1e2020-09-18 14:15:30 -07003772// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3773// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003774// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003775// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003776func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3777 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003778 var staticPaths android.Paths
3779 for _, staticDep := range staticDeps {
3780 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3781 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3782 }
3783 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003784 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003785 }
3786 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3787
3788 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3789
3790 // reorder the dependencies based on transitive dependencies
3791 staticPaths = android.FirstUniquePaths(staticPaths)
3792 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3793
3794 if len(orderedStaticPaths) != len(staticPaths) {
3795 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3796 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3797 }
3798
3799 return orderedStaticPaths, transitiveStaticLibs
3800}
3801
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003802// BaseLibName trims known prefixes and suffixes
3803func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003804 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3805 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003806 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003807 return libName
3808}
3809
Yu Liu8024b922024-12-20 23:31:32 +00003810func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003811 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003812 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3813 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003814
Yu Liu8024b922024-12-20 23:31:32 +00003815 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003816 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003817 if ccInfo.SnapshotInfo != nil {
Yu Liu0a37d422025-02-13 02:05:00 +00003818 return commonInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003819 }
3820 }
3821
Yu Liu8024b922024-12-20 23:31:32 +00003822 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003823 // The vendor and product modules in Make will have been renamed to not conflict with the
3824 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003825 return libName + linkableInfo.SubName
3826 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003827 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003828 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003829 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003830 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003831 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003832 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003833 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003834 } else {
3835 return libName
3836 }
3837}
3838
Colin Crossca860ac2016-01-04 14:34:37 -08003839func (c *Module) InstallInData() bool {
3840 if c.installer == nil {
3841 return false
3842 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003843 return c.installer.inData()
3844}
3845
3846func (c *Module) InstallInSanitizerDir() bool {
3847 if c.installer == nil {
3848 return false
3849 }
3850 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003851 return true
3852 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003853 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003854}
3855
Yifan Hong1b3348d2020-01-21 15:53:22 -08003856func (c *Module) InstallInRamdisk() bool {
3857 return c.InRamdisk()
3858}
3859
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003860func (c *Module) InstallInVendorRamdisk() bool {
3861 return c.InVendorRamdisk()
3862}
3863
Jiyong Parkf9332f12018-02-01 00:54:12 +09003864func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003865 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003866}
3867
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003868func (c *Module) MakeUninstallable() {
3869 if c.installer == nil {
3870 c.ModuleBase.MakeUninstallable()
3871 return
3872 }
3873 c.installer.makeUninstallable(c)
3874}
3875
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003876func (c *Module) HostToolPath() android.OptionalPath {
3877 if c.installer == nil {
3878 return android.OptionalPath{}
3879 }
3880 return c.installer.hostToolPath()
3881}
3882
Nan Zhangd4e641b2017-07-12 12:55:28 -07003883func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3884 return c.outputFile
3885}
3886
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003887func (c *Module) static() bool {
3888 if static, ok := c.linker.(interface {
3889 static() bool
3890 }); ok {
3891 return static.static()
3892 }
3893 return false
3894}
3895
Colin Cross6a730042024-12-05 13:53:43 -08003896func (c *Module) staticLibrary() bool {
3897 if static, ok := c.linker.(interface {
3898 staticLibrary() bool
3899 }); ok {
3900 return static.staticLibrary()
3901 }
3902 return false
3903}
3904
Jiyong Park379de2f2018-12-19 02:47:14 +09003905func (c *Module) staticBinary() bool {
3906 if static, ok := c.linker.(interface {
3907 staticBinary() bool
3908 }); ok {
3909 return static.staticBinary()
3910 }
3911 return false
3912}
3913
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003914func (c *Module) testBinary() bool {
3915 if test, ok := c.linker.(interface {
3916 testBinary() bool
3917 }); ok {
3918 return test.testBinary()
3919 }
3920 return false
3921}
3922
Jingwen Chen537242c2022-08-24 11:53:27 +00003923func (c *Module) testLibrary() bool {
3924 if test, ok := c.linker.(interface {
3925 testLibrary() bool
3926 }); ok {
3927 return test.testLibrary()
3928 }
3929 return false
3930}
3931
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003932func (c *Module) benchmarkBinary() bool {
3933 if b, ok := c.linker.(interface {
3934 benchmarkBinary() bool
3935 }); ok {
3936 return b.benchmarkBinary()
3937 }
3938 return false
3939}
3940
3941func (c *Module) fuzzBinary() bool {
3942 if f, ok := c.linker.(interface {
3943 fuzzBinary() bool
3944 }); ok {
3945 return f.fuzzBinary()
3946 }
3947 return false
3948}
3949
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003950// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3951func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003952 if h, ok := c.linker.(interface {
3953 header() bool
3954 }); ok {
3955 return h.header()
3956 }
3957 return false
3958}
3959
Ivan Lozanod7586b62021-04-01 09:49:36 -04003960func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003961 if b, ok := c.linker.(interface {
3962 binary() bool
3963 }); ok {
3964 return b.binary()
3965 }
3966 return false
3967}
3968
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003969func (c *Module) ForceDisableSanitizers() {
3970 c.sanitize.Properties.ForceDisable = true
3971}
3972
Justin Yun5e035862021-06-29 20:50:37 +09003973func (c *Module) StaticExecutable() bool {
3974 if b, ok := c.linker.(*binaryDecorator); ok {
3975 return b.static()
3976 }
3977 return false
3978}
3979
Ivan Lozanod7586b62021-04-01 09:49:36 -04003980func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003981 if o, ok := c.linker.(interface {
3982 object() bool
3983 }); ok {
3984 return o.object()
3985 }
3986 return false
3987}
3988
Kiyoung Kim37693d02024-04-04 09:56:15 +09003989func (m *Module) Dylib() bool {
3990 return false
3991}
3992
3993func (m *Module) Rlib() bool {
3994 return false
3995}
3996
Ivan Lozanof9e21722020-12-02 09:00:51 -05003997func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003998 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003999 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05004000 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09004001 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05004002 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09004003 return "native:product"
4004 }
Jooyung Han38002912019-05-16 04:01:54 +09004005 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08004006 } else if c.InRamdisk() {
4007 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07004008 } else if c.InVendorRamdisk() {
4009 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07004010 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07004011 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05004012 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07004013 return "native:ndk:none:none"
4014 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
4015 //family, link := getNdkStlFamilyAndLinkType(c)
4016 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
4017 } else {
4018 return "native:platform"
4019 }
4020}
4021
Jiyong Park9d452992018-10-03 00:38:19 +09004022// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07004023// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09004024func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07004025 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09004026 // Stub libs and prebuilt libs in a versioned SDK are not
4027 // installable to APEX even though they are shared libs.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004028 return lib.shared() && !lib.BuildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09004029 }
4030 return false
4031}
4032
Jiyong Parka90ca002019-10-07 15:47:24 +09004033func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00004034 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
4035}
4036
4037func (c *Module) ApexAvailableFor() []string {
4038 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09004039 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00004040 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09004041 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00004042 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09004043 }
Yu Liub73c3a62024-12-10 00:58:06 +00004044
4045 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09004046}
4047
Paul Duffin0cb37b92020-03-04 14:52:46 +00004048func (c *Module) EverInstallable() bool {
4049 return c.installer != nil &&
4050 // Check to see whether the module is actually ever installable.
4051 c.installer.everInstallable()
4052}
4053
Ivan Lozanod7586b62021-04-01 09:49:36 -04004054func (c *Module) PreventInstall() bool {
4055 return c.Properties.PreventInstall
4056}
4057
4058func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07004059 if c.library != nil {
4060 if i := c.library.installable(); i != nil {
4061 return i
4062 }
4063 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04004064 return c.Properties.Installable
4065}
4066
4067func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00004068 ret := c.EverInstallable() &&
4069 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04004070 proptools.BoolDefault(c.Installable(), true) &&
4071 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004072
4073 // The platform variant doesn't need further condition. Apex variants however might not
4074 // be installable because it will likely to be included in the APEX and won't appear
4075 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07004076 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004077 return ret
4078 }
4079
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004080 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09004081}
4082
Logan Chien41eabe62019-04-10 13:33:58 +08004083func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
4084 if c.linker != nil {
4085 if library, ok := c.linker.(*libraryDecorator); ok {
4086 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
4087 }
4088 }
4089}
4090
Jiyong Park45bf82e2020-12-15 22:29:02 +09004091var _ android.ApexModule = (*Module)(nil)
4092
4093// Implements android.ApexModule
Yu Liuf1806032025-02-07 00:23:34 +00004094func (c *Module) GetDepInSameApexChecker() android.DepInSameApexChecker {
4095 return CcDepInSameApexChecker{
4096 Static: c.static(),
4097 HasStubsVariants: c.HasStubsVariants(),
4098 IsLlndk: c.IsLlndk(),
4099 Host: c.Host(),
4100 }
4101}
4102
4103type CcDepInSameApexChecker struct {
4104 Static bool
4105 HasStubsVariants bool
4106 IsLlndk bool
4107 Host bool
4108}
4109
4110func (c CcDepInSameApexChecker) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004111 if depTag == StubImplDepTag {
Colin Crossc1b36442021-05-06 13:42:48 -07004112 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004113 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004114 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004115 if depTag == staticVariantTag {
4116 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4117 // actually mean that the static lib (and its dependencies) are copied into the
4118 // APEX.
4119 return false
4120 }
Colin Cross8acea3e2024-12-12 14:53:30 -08004121
4122 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
Yu Liuf1806032025-02-07 00:23:34 +00004123 if isLibDepTag && c.Static && libDepTag.shared() {
Colin Cross8acea3e2024-12-12 14:53:30 -08004124 // shared_lib dependency from a static lib is considered as crossing
4125 // the APEX boundary because the dependency doesn't actually is
4126 // linked; the dependency is used only during the compilation phase.
4127 return false
4128 }
4129
4130 if isLibDepTag && libDepTag.excludeInApex {
4131 return false
4132 }
4133
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004134 return true
4135}
4136
Yu Liuf1806032025-02-07 00:23:34 +00004137func (c CcDepInSameApexChecker) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
4138 if c.Host {
Colin Cross1cea5302024-12-03 16:40:08 -08004139 return false
4140 }
Yu Liuf1806032025-02-07 00:23:34 +00004141 if c.HasStubsVariants {
Colin Crossbd930bc2025-02-03 12:17:42 -08004142 if IsSharedDepTag(depTag) && !IsExplicitImplSharedDepTag(depTag) {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004143 // dynamic dep to a stubs lib crosses APEX boundary
4144 return false
4145 }
4146 if IsRuntimeDepTag(depTag) {
4147 // runtime dep to a stubs lib also crosses APEX boundary
4148 return false
4149 }
4150 if IsHeaderDepTag(depTag) {
4151 return false
4152 }
4153 }
Yu Liuf1806032025-02-07 00:23:34 +00004154 if c.IsLlndk {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004155 return false
4156 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004157
4158 return true
4159}
4160
Jiyong Park45bf82e2020-12-15 22:29:02 +09004161// Implements android.ApexModule
Yu Liudf0b8392025-02-12 18:27:03 +00004162func (c *Module) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel {
Jooyung Han749dc692020-04-15 11:03:39 +09004163 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4164 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
Yu Liudf0b8392025-02-12 18:27:03 +00004165 return android.MinApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004166 }
Jooyung Han749dc692020-04-15 11:03:39 +09004167 // We don't check for prebuilt modules
4168 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
Yu Liudf0b8392025-02-12 18:27:03 +00004169 return android.MinApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004170 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004171
Jooyung Han749dc692020-04-15 11:03:39 +09004172 minSdkVersion := c.MinSdkVersion()
4173 if minSdkVersion == "apex_inherit" {
Yu Liudf0b8392025-02-12 18:27:03 +00004174 return android.MinApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004175 }
4176 if minSdkVersion == "" {
4177 // JNI libs within APK-in-APEX fall into here
4178 // Those are okay to set sdk_version instead
4179 // We don't have to check if this is a SDK variant because
4180 // non-SDK variant resets sdk_version, which works too.
4181 minSdkVersion = c.SdkVersion()
4182 }
Yu Liudf0b8392025-02-12 18:27:03 +00004183
Dan Albertc8060532020-07-22 22:32:17 -07004184 if minSdkVersion == "" {
Yu Liudf0b8392025-02-12 18:27:03 +00004185 return android.NoneApiLevel
Dan Albertc8060532020-07-22 22:32:17 -07004186 }
Yu Liudf0b8392025-02-12 18:27:03 +00004187
Dan Albertc8060532020-07-22 22:32:17 -07004188 // Not using nativeApiLevelFromUser because the context here is not
4189 // necessarily a native context.
Yu Liudf0b8392025-02-12 18:27:03 +00004190 ver, err := android.ApiLevelFromUserWithConfig(ctx.Config(), minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004191 if err != nil {
Yu Liudf0b8392025-02-12 18:27:03 +00004192 return android.NoneApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004193 }
Dan Albertc8060532020-07-22 22:32:17 -07004194
Colin Cross8ca61c12022-10-06 21:00:14 -07004195 // A dependency only needs to support a min_sdk_version at least
4196 // as high as the api level that the architecture was introduced in.
4197 // This allows introducing new architectures in the platform that
4198 // need to be included in apexes that normally require an older
4199 // min_sdk_version.
Yu Liudf0b8392025-02-12 18:27:03 +00004200 if c.Enabled(ctx) {
4201 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
4202 if ver.LessThanOrEqualTo(minApiForArch) {
4203 ver = android.MinApiLevel
4204 }
Colin Cross8ca61c12022-10-06 21:00:14 -07004205 }
4206
Yu Liudf0b8392025-02-12 18:27:03 +00004207 return ver
Jooyung Han749dc692020-04-15 11:03:39 +09004208}
4209
Paul Duffinb5769c12021-05-12 16:16:51 +01004210// Implements android.ApexModule
4211func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4212 // stub libraries and native bridge libraries are always available to platform
4213 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4214}
4215
Inseob Kima1888ce2022-10-04 14:42:02 +09004216func (c *Module) overriddenModules() []string {
4217 if o, ok := c.linker.(overridable); ok {
4218 return o.overriddenModules()
4219 }
4220 return nil
4221}
4222
Liz Kammer35ca77e2021-12-22 15:31:40 -05004223type moduleType int
4224
4225const (
4226 unknownType moduleType = iota
4227 binary
4228 object
4229 fullLibrary
4230 staticLibrary
4231 sharedLibrary
4232 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004233 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004234 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004235)
4236
4237func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004238 if c.testBinary() {
4239 // testBinary is also a binary, so this comes before the c.Binary()
4240 // conditional. A testBinary has additional implicit dependencies and
4241 // other test-only semantics.
4242 return testBin
4243 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004244 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004245 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004246 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004247 } else if c.testLibrary() {
4248 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4249 // will let them add implicit compile deps on gtest, for example.
4250 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004251 // For now, treat them as regular libraries.
4252 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004253 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004254 static := false
4255 shared := false
4256 if library, ok := c.linker.(*libraryDecorator); ok {
4257 static = library.MutatedProperties.BuildStatic
4258 shared = library.MutatedProperties.BuildShared
4259 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4260 static = library.MutatedProperties.BuildStatic
4261 shared = library.MutatedProperties.BuildShared
4262 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004263 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004264 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004265 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004266 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004267 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004268 return staticLibrary
4269 }
4270 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004271 } else if c.isNDKStubLibrary() {
4272 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004273 }
4274 return unknownType
4275}
4276
Colin Crosscfad1192015-11-02 16:43:11 -08004277// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004278type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004279 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004280 android.DefaultsModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004281}
4282
Patrice Arrudac249c712019-03-19 17:00:29 -07004283// cc_defaults provides a set of properties that can be inherited by other cc
4284// modules. A module can use the properties from a cc_defaults using
4285// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4286// merged (when possible) by prepending the default module's values to the
4287// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004288func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004289 return DefaultsFactory()
4290}
4291
Colin Cross36242852017-06-23 15:06:31 -07004292func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004293 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004294
Colin Cross36242852017-06-23 15:06:31 -07004295 module.AddProperties(props...)
4296 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004297 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004298 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004299 &BaseCompilerProperties{},
4300 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004301 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004302 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004303 &StaticProperties{},
4304 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004305 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004306 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004307 &TestLinkerProperties{},
4308 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004309 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004310 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004311 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004312 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004313 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004314 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004315 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004316 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004317 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004318 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004319 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004320 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004321 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004322 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004323 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4324 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004325 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004326 )
Colin Crosscfad1192015-11-02 16:43:11 -08004327
Jooyung Hancc372c52019-09-25 15:18:44 +09004328 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004329
4330 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004331}
4332
Jiyong Park2286afd2020-06-16 21:58:53 +09004333func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004334 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004335}
4336
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004337func kytheExtractAllFactory() android.Singleton {
4338 return &kytheExtractAllSingleton{}
4339}
4340
4341type kytheExtractAllSingleton struct {
4342}
4343
4344func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4345 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004346 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004347 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004348 if len(files) > 0 {
4349 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004350 }
4351 })
4352 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4353 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004354 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004355 }
4356}
4357
Jihoon Kangf78a8902022-09-01 22:47:07 +00004358func (c *Module) Partition() string {
4359 if p, ok := c.installer.(interface {
4360 getPartition() string
4361 }); ok {
4362 return p.getPartition()
4363 }
4364 return ""
4365}
4366
Spandan Das2b6dfb52024-01-19 00:22:22 +00004367type sourceModuleName interface {
4368 sourceModuleName() string
4369}
4370
4371func (c *Module) BaseModuleName() string {
4372 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4373 // if the prebuilt module sets a source_module_name in Android.bp, use that
4374 return smn.sourceModuleName()
4375 }
4376 return c.ModuleBase.BaseModuleName()
4377}
4378
Spandan Dase20c56c2024-07-23 21:34:24 +00004379func (c *Module) stubsSymbolFilePath() android.Path {
4380 if library, ok := c.linker.(*libraryDecorator); ok {
4381 return library.stubsSymbolFilePath
4382 }
4383 return android.OptionalPath{}.Path()
4384}
4385
Colin Cross06a931b2015-10-28 17:23:31 -07004386var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004387var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004388var BoolPtr = proptools.BoolPtr
4389var String = proptools.String
4390var StringPtr = proptools.StringPtr