blob: 3e0444de268a2a533c499357bb1f33c4b4cca823 [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
Yu Liub1bfa9d2024-12-05 18:57:51 +000064}
65
Yu Liu323d77a2024-12-16 23:13:57 +000066type 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
Yu Liu88408122025-03-04 18:46:24 +000084 BinaryDecoratorInfo *BinaryDecoratorInfo
85 LibraryDecoratorInfo *LibraryDecoratorInfo
86 TestBinaryInfo *TestBinaryInfo
87 BenchmarkDecoratorInfo *BenchmarkDecoratorInfo
88 ObjectLinkerInfo *ObjectLinkerInfo
89 StubDecoratorInfo *StubDecoratorInfo
90 PrebuiltLibraryLinkerInfo *PrebuiltLibraryLinkerInfo
Yu Liu323d77a2024-12-16 23:13:57 +000091}
92
93type BinaryDecoratorInfo struct{}
94type LibraryDecoratorInfo struct {
Cole Faustc9b88c92025-02-06 17:58:26 -080095 ExportIncludeDirs []string
Yu Liu116610a2025-01-06 21:54:48 +000096 InjectBsslHash bool
Yu Liu95cef3a2025-02-25 00:54:20 +000097 // Location of the static library in the sysroot. Empty if the library is
98 // not included in the NDK.
99 NdkSysrootPath android.Path
Yu Liu88408122025-03-04 18:46:24 +0000100 VndkFileName string
Yu Liu323d77a2024-12-16 23:13:57 +0000101}
Yu Liuffe86322024-12-18 18:53:12 +0000102
Yu Liu8024b922024-12-20 23:31:32 +0000103type SnapshotInfo struct {
104 SnapshotAndroidMkSuffix string
Yu Liuffe86322024-12-18 18:53:12 +0000105}
106
Yu Liu323d77a2024-12-16 23:13:57 +0000107type TestBinaryInfo struct {
108 Gtest bool
109}
110type BenchmarkDecoratorInfo struct{}
Yu Liu8a8d5b42025-01-07 00:48:08 +0000111
Yu Liu2a815b62025-02-21 20:46:25 +0000112type StubDecoratorInfo struct {
113 AbiDumpPath android.OutputPath
114 HasAbiDump bool
115 AbiDiffPaths android.Paths
Yu Liu95cef3a2025-02-25 00:54:20 +0000116 InstallPath android.Path
Yu Liu2a815b62025-02-21 20:46:25 +0000117}
Yu Liu8a8d5b42025-01-07 00:48:08 +0000118
Yu Liu95cef3a2025-02-25 00:54:20 +0000119type ObjectLinkerInfo struct {
120 // Location of the object in the sysroot. Empty if the object is not
121 // included in the NDK.
122 NdkSysrootPath android.Path
123}
Yu Liu323d77a2024-12-16 23:13:57 +0000124
Yu Liu88408122025-03-04 18:46:24 +0000125type PrebuiltLibraryLinkerInfo struct {
126 VndkFileName string
127}
128
Yu Liu8a8d5b42025-01-07 00:48:08 +0000129type LibraryInfo struct {
130 BuildStubs bool
131}
132
Yu Liu2a815b62025-02-21 20:46:25 +0000133type InstallerInfo struct {
134 StubDecoratorInfo *StubDecoratorInfo
135}
136
Yu Liu88408122025-03-04 18:46:24 +0000137type LocalOrGlobalFlagsInfo struct {
138 CommonFlags []string // Flags that apply to C, C++, and assembly source files
139 CFlags []string // Flags that apply to C and C++ source files
140 ConlyFlags []string // Flags that apply to C source files
141 CppFlags []string // Flags that apply to C++ source files
142}
143
Yu Liub1bfa9d2024-12-05 18:57:51 +0000144// Common info about the cc module.
145type CcInfo struct {
Yu Liu323d77a2024-12-16 23:13:57 +0000146 IsPrebuilt bool
147 CmakeSnapshotSupported bool
Yu Liu68a70b72025-01-08 22:54:44 +0000148 HasLlndkStubs bool
Yu Liu0a37d422025-02-13 02:05:00 +0000149 DataPaths []android.DataPath
Yu Liu323d77a2024-12-16 23:13:57 +0000150 CompilerInfo *CompilerInfo
151 LinkerInfo *LinkerInfo
Yu Liu8024b922024-12-20 23:31:32 +0000152 SnapshotInfo *SnapshotInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +0000153 LibraryInfo *LibraryInfo
Yu Liu2a815b62025-02-21 20:46:25 +0000154 InstallerInfo *InstallerInfo
Yu Liub1bfa9d2024-12-05 18:57:51 +0000155}
156
Yu Liu8024b922024-12-20 23:31:32 +0000157var CcInfoProvider = blueprint.NewProvider[*CcInfo]()
Yu Liub1bfa9d2024-12-05 18:57:51 +0000158
Yu Liu986d98c2024-11-12 00:28:11 +0000159type LinkableInfo struct {
160 // StaticExecutable returns true if this is a binary module with "static_executable: true".
Yu Liu8024b922024-12-20 23:31:32 +0000161 StaticExecutable bool
162 Static bool
163 Shared bool
Yu Liu88408122025-03-04 18:46:24 +0000164 Header bool
Yu Liu8024b922024-12-20 23:31:32 +0000165 HasStubsVariants bool
166 StubsVersion string
167 IsStubs bool
168 UnstrippedOutputFile android.Path
169 OutputFile android.OptionalPath
170 CoverageFiles android.Paths
Yu Liuf6f85492025-01-13 21:02:36 +0000171 // CoverageOutputFile returns the output archive of gcno coverage information files.
172 CoverageOutputFile android.OptionalPath
173 SAbiDumpFiles android.Paths
174 // Partition returns the partition string for this module.
175 Partition string
Yu Liu8a8d5b42025-01-07 00:48:08 +0000176 CcLibrary bool
Yu Liu8024b922024-12-20 23:31:32 +0000177 CcLibraryInterface bool
178 RustLibraryInterface bool
179 // CrateName returns the crateName for a Rust library
180 CrateName string
181 // DepFlags returns a slice of Rustc string flags
182 ExportedCrateLinkDirs []string
Yu Liu0a37d422025-02-13 02:05:00 +0000183 HasNonSystemVariants bool
184 IsLlndk bool
Yu Liuf6f85492025-01-13 21:02:36 +0000185 // True if the library is in the configs known NDK list.
186 IsNdk bool
187 InVendorOrProduct bool
Yu Liu8024b922024-12-20 23:31:32 +0000188 // SubName returns the modules SubName, used for image and NDK/SDK variations.
189 SubName string
190 InRamdisk bool
191 OnlyInRamdisk bool
192 InVendorRamdisk bool
193 OnlyInVendorRamdisk bool
194 InRecovery bool
195 OnlyInRecovery bool
Yu Liu367827f2025-02-15 00:18:33 +0000196 InVendor bool
Yu Liu8a8d5b42025-01-07 00:48:08 +0000197 Installable *bool
Yu Liu97880e12025-01-07 19:03:34 +0000198 // RelativeInstallPath returns the relative install path for this module.
199 RelativeInstallPath string
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000200 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
201 RustApexExclude bool
Yu Liuf6f85492025-01-13 21:02:36 +0000202 // Bootstrap tests if this module is allowed to use non-APEX version of libraries.
Yu Liu0a37d422025-02-13 02:05:00 +0000203 Bootstrap bool
204 Multilib string
205 ImplementationModuleNameForMake string
206 IsStubsImplementationRequired bool
207 // Symlinks returns a list of symlinks that should be created for this module.
Yu Liu367827f2025-02-15 00:18:33 +0000208 Symlinks []string
209 APIListCoverageXMLPath android.ModuleOutPath
Yu Liu119d38c2025-02-25 22:25:11 +0000210 // FuzzSharedLibraries returns the shared library dependencies for this module.
211 // Expects that IsFuzzModule returns true.
Yu Liu88408122025-03-04 18:46:24 +0000212 FuzzSharedLibraries android.RuleBuilderInstalls
213 IsVndkPrebuiltLibrary bool
214 HasLLNDKStubs bool
215 IsLLNDKMovedToApex bool
216 ImplementationModuleName string
Yu Liu986d98c2024-11-12 00:28:11 +0000217}
218
Yu Liu8024b922024-12-20 23:31:32 +0000219var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
Yu Liu986d98c2024-11-12 00:28:11 +0000220
Colin Cross463a90e2015-06-17 14:20:06 -0700221func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000222 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700223
Inseob Kim3b244062023-07-11 13:31:36 +0900224 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000225 pctx.Import("android/soong/cc/config")
226}
227
228func RegisterCCBuildComponents(ctx android.RegistrationContext) {
229 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
230
231 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700232 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700233 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700234 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700235 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700236 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700237 })
Colin Cross16b23492016-01-06 14:41:07 -0800238
Paul Duffin036e7002019-12-19 19:16:28 +0000239 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400240 for _, san := range Sanitizers {
241 san.registerMutators(ctx)
242 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800243
Colin Cross8a962802024-10-09 15:29:27 -0700244 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
245 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800246
Colin Cross597bad62024-10-08 15:10:55 -0700247 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000248
Colin Crossf5f4ad32024-01-19 15:41:48 -0800249 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700250
Colin Crossd38feb02024-01-23 16:38:06 -0800251 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800252
Colin Cross33e0c812024-01-23 16:36:07 -0800253 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000254
Colin Cross6ac83a82024-01-23 11:23:10 -0800255 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900256
Colin Cross8a962802024-10-09 15:29:27 -0700257 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
258 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700259 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700260
Colin Cross91ae5ec2024-10-01 14:03:40 -0700261 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800262 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700263 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800264 })
265
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000266 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700267}
268
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500269// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
270// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
271// edges to these modules.
272// This object is constructed in DepsMutator, by calling to various module delegates to set
273// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
274// dependencies.
275// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
276// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800277type Deps struct {
278 SharedLibs, LateSharedLibs []string
279 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800280 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800281 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700282
Colin Cross3e5e7782022-06-17 22:17:05 +0000283 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
284 // prevent automatically exporting symbols.
285 UnexportedStaticLibs []string
286
Chris Parsons79d66a52020-06-05 17:26:16 -0400287 // Used for data dependencies adjacent to tests
288 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700289 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400290
Yo Chiang219968c2020-09-22 18:45:04 +0800291 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
292 SystemSharedLibs []string
293
Vinh Tran367d89d2023-04-28 11:21:25 -0400294 // Used by DepMutator to pass aidl_library modules to aidl compiler
295 AidlLibs []string
296
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500297 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800298 StaticUnwinderIfLegacy bool
299
Colin Cross5950f382016-12-13 12:50:57 -0800300 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700301
Colin Cross81413472016-04-11 14:37:39 -0700302 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700303
Cole Faust65cb40a2024-10-21 15:41:42 -0700304 GeneratedSources []string
305 GeneratedHeaders []string
306 DeviceFirstGeneratedHeaders []string
307 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700308
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700309 ReexportGeneratedHeaders []string
310
Colin Crossc465efd2021-06-11 18:00:04 -0700311 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700312
313 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700314 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900315
316 // List of libs that need to be excluded for APEX variant
317 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900318 // List of libs that need to be excluded for non-APEX variant
319 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800320
321 // LLNDK headers for the ABI checker to check LLNDK implementation library.
322 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700323 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800324 // Instead, the LLNDK implementation depends on the LLNDK header libs.
325 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700326}
327
Ivan Lozano0a468a42024-05-13 21:03:34 -0400328// A struct which to collect flags for rlib dependencies
329type RustRlibDep struct {
330 LibPath android.Path // path to the rlib
331 LinkDirs []string // flags required for dependency (e.g. -L flags)
332 CrateName string // crateNames associated with rlibDeps
333}
334
335func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
336 return a.LibPath == b.LibPath
337}
338
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500339// PathDeps is a struct containing file paths to dependencies of a module.
340// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
341// It's used to construct flags for various build statements (such as for compiling and linking).
342// It is then passed to module decorator functions responsible for registering build statements
343// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800344type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700345 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900346 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700347 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900348 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700349 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700350 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400351 // Paths and crateNames for RustStaticLib dependencies
352 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700353
Colin Cross0de8a1e2020-09-18 14:15:30 -0700354 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700355 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700356
Colin Cross26c34ed2016-09-30 17:10:16 -0700357 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100358 Objs Objects
359 // Paths to .o files in dependencies that provide them. Note that these lists
360 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800361 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700362 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700363
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100364 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
365 // the libs from all whole_static_lib dependencies.
366 WholeStaticLibsFromPrebuilts android.Paths
367
Colin Cross26c34ed2016-09-30 17:10:16 -0700368 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700369 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900370 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700371
Inseob Kimd110f872019-12-06 13:15:38 +0900372 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000373 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900374 IncludeDirs android.Paths
375 SystemIncludeDirs android.Paths
376 ReexportedDirs android.Paths
377 ReexportedSystemDirs android.Paths
378 ReexportedFlags []string
379 ReexportedGeneratedHeaders android.Paths
380 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400381 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700382
Colin Cross26c34ed2016-09-30 17:10:16 -0700383 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700384 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700385
Dan Willemsena0790e32018-10-12 00:24:23 -0700386 // Path to the dynamic linker binary
387 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700388
389 // For Darwin builds, the path to the second architecture's output that should
390 // be combined with this architectures's output into a FAT MachO file.
391 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400392
393 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
394 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800395
396 // LLNDK headers for the ABI checker to check LLNDK implementation library.
397 LlndkIncludeDirs android.Paths
398 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700399
400 directImplementationDeps android.Paths
401 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700402}
403
Colin Cross4af21ed2019-11-04 09:37:55 -0800404// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
405// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
406// command line so they can be overridden by the local module flags).
407type LocalOrGlobalFlags struct {
408 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700409 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800410 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700411 CFlags []string // Flags that apply to C and C++ source files
412 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
413 ConlyFlags []string // Flags that apply to C source files
414 CppFlags []string // Flags that apply to C++ source files
415 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700416 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800417}
418
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500419// Flags contains various types of command line flags (and settings) for use in building build
420// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800421type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500422 // Local flags (which individual modules are responsible for). These may override global flags.
423 Local LocalOrGlobalFlags
424 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700425 Global LocalOrGlobalFlags
426 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800427
428 aidlFlags []string // Flags that apply to aidl source files
429 rsFlags []string // Flags that apply to renderscript source files
430 libFlags []string // Flags to add libraries early to the link order
431 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
432 TidyFlags []string // Flags that apply to clang-tidy
433 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700434
Colin Crossc3199482017-03-30 15:03:04 -0700435 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800436 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700437 SystemIncludeFlags []string
438
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800439 Toolchain config.Toolchain
440 Tidy bool // True if ninja .tidy rules should be generated.
441 NeedTidyFiles bool // True if module link should depend on .tidy files
442 GcovCoverage bool // True if coverage files should be generated.
443 SAbiDump bool // True if header abi dumps should be generated.
444 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800445 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800446
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500447 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800448 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500449 // The target-device system path to the dynamic linker.
450 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800451
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700452 CFlagsDeps android.Paths // Files depended on by compiler flags
453 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800454
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500455 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700456 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800457
Colin Cross19878da2019-03-28 14:45:07 -0700458 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700459 protoC bool // Whether to use C instead of C++
460 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700461
462 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200463 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700464}
465
Colin Crossca860ac2016-01-04 14:34:37 -0800466// Properties used to compile all C or C++ modules
467type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700468 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800469 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700470
Yi Kong5786f5c2024-05-28 02:22:34 +0900471 // Aggresively trade performance for smaller binary size.
472 // This should only be used for on-device binaries that are rarely executed and not
473 // performance critical.
474 Optimize_for_size *bool `android:"arch_variant"`
475
Jiyong Parkb35a8192020-08-10 15:59:36 +0900476 // The API level that this module is built against. The APIs of this API level will be
477 // visible at build time, but use of any APIs newer than min_sdk_version will render the
478 // module unloadable on older devices. In the future it will be possible to weakly-link new
479 // APIs, making the behavior match Java: such modules will load on older devices, but
480 // calling new APIs on devices that do not support them will result in a crash.
481 //
482 // This property has the same behavior as sdk_version does for Java modules. For those
483 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
484 // does for Java code.
485 //
486 // In addition, setting this property causes two variants to be built, one for the platform
487 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800488 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700489
Jiyong Parkb35a8192020-08-10 15:59:36 +0900490 // Minimum OS API level supported by this C or C++ module. This property becomes the value
491 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
492 // this property is also used to ensure that the min_sdk_version of the containing module is
493 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
494 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
495 // min_sdk_version of the containing APEX. When the module
496 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900497 Min_sdk_version *string
498
Colin Crossc511bc52020-04-07 16:50:32 +0000499 // If true, always create an sdk variant and don't create a platform variant.
500 Sdk_variant_only *bool
501
Colin Cross4297f402024-11-20 15:20:09 -0800502 AndroidMkSharedLibs []string `blueprint:"mutated"`
503 AndroidMkStaticLibs []string `blueprint:"mutated"`
504 AndroidMkRlibs []string `blueprint:"mutated"`
505 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
506 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
507 AndroidMkHeaderLibs []string `blueprint:"mutated"`
508 HideFromMake bool `blueprint:"mutated"`
509 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700510
Yo Chiang219968c2020-09-22 18:45:04 +0800511 // Set by DepsMutator.
512 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
513
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900514 // The name of the image this module is built for
515 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200516
517 // The VNDK version this module is built against. If empty, the module is not
518 // build against the VNDK.
519 VndkVersion string `blueprint:"mutated"`
520
521 // Suffix for the name of Android.mk entries generated by this module
522 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800523
524 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
525 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900526 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900527
Yifan Hong39143a92020-10-26 12:43:12 -0700528 // Make this module available when building for ramdisk.
529 // On device without a dedicated recovery partition, the module is only
530 // available after switching root into
531 // /first_stage_ramdisk. To expose the module before switching root, install
532 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800533 Ramdisk_available *bool
534
Yifan Hong39143a92020-10-26 12:43:12 -0700535 // Make this module available when building for vendor ramdisk.
536 // On device without a dedicated recovery partition, the module is only
537 // available after switching root into
538 // /first_stage_ramdisk. To expose the module before switching root, install
539 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700540 Vendor_ramdisk_available *bool
541
Jiyong Parkf9332f12018-02-01 00:54:12 +0900542 // Make this module available when building for recovery
543 Recovery_available *bool
544
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200545 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000546 VendorVariantNeeded bool `blueprint:"mutated"`
547 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200548 CoreVariantNeeded bool `blueprint:"mutated"`
549 RamdiskVariantNeeded bool `blueprint:"mutated"`
550 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
551 RecoveryVariantNeeded bool `blueprint:"mutated"`
552
553 // A list of variations for the "image" mutator of the form
554 //<image name> '.' <version char>, for example, 'vendor.S'
555 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900556
557 // Allows this module to use non-APEX version of libraries. Useful
558 // for building binaries that are started before APEXes are activated.
559 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900560
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000561 // Allows this module to be included in CMake release snapshots to be built outside of Android
562 // build system and source tree.
563 Cmake_snapshot_supported *bool
564
Colin Cross1bc94122021-10-28 13:25:54 -0700565 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000566
567 // Set by factories of module types that can only be referenced from variants compiled against
568 // the SDK.
569 AlwaysSdk bool `blueprint:"mutated"`
570
571 // Variant is an SDK variant created by sdkMutator
572 IsSdkVariant bool `blueprint:"mutated"`
573 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
574 // variant to have a ".sdk" suffix.
575 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700576
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800577 Target struct {
578 Platform struct {
579 // List of modules required by the core variant.
580 Required []string `android:"arch_variant"`
581
582 // List of modules not required by the core variant.
583 Exclude_required []string `android:"arch_variant"`
584 } `android:"arch_variant"`
585
586 Recovery struct {
587 // List of modules required by the recovery variant.
588 Required []string `android:"arch_variant"`
589
590 // List of modules not required by the recovery variant.
591 Exclude_required []string `android:"arch_variant"`
592 } `android:"arch_variant"`
593 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700594}
595
596type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900597 // whether this module should be allowed to be directly depended by other
598 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900599 // If set to true, two variants will be built separately, one like
600 // normal, and the other limited to the set of libraries and headers
601 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700602 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900603 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700604 // so it shouldn't have any unversioned runtime dependencies, or
605 // make assumptions about the system that may not be true in the
606 // future.
607 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900608 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900609 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900610 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900611 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900612 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700613 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
614 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900615
Justin Yunebcf0c52021-01-08 18:00:19 +0900616 // This is the same as the "vendor_available" except that the install path
617 // of the vendor variant is /odm or /vendor/odm.
618 // By replacing "vendor_available: true" with "odm_available: true", the
619 // module will install its vendor variant to the /odm partition or /vendor/odm.
620 // As the modules with "odm_available: true" still create the vendor variants,
621 // they can link to the other vendor modules as the vendor_available modules do.
622 // Also, the vendor modules can link to odm_available modules.
623 //
624 // It may not be used for VNDK modules.
625 Odm_available *bool
626
Justin Yun63e9ec72020-10-29 16:49:43 +0900627 // whether this module should be allowed to be directly depended by other
628 // modules with `product_specific: true` or `product_available: true`.
629 // If set to true, an additional product variant will be built separately
630 // that is limited to the set of libraries and headers that are exposed to
631 // /product modules.
632 //
633 // The product variant may be used with a different (newer) /system,
634 // so it shouldn't have any unversioned runtime dependencies, or
635 // make assumptions about the system that may not be true in the
636 // future.
637 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900638 // If set to false, this module becomes inaccessible from /product modules.
639 //
640 // Different from the 'vendor_available' property, the modules with
641 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
642 // library without 'product_available' may not be depended on by any other
643 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900644 //
645 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
646 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
647 Product_available *bool
648
Jiyong Park5fb8c102018-04-09 12:03:06 +0900649 // whether this module is capable of being loaded with other instance
650 // (possibly an older version) of the same module in the same process.
651 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
652 // can be double loaded in a vendor process if the library is also a
653 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
654 // explicitly marked as `double_loadable: true` by the owner, or the dependency
655 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
656 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800657
658 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
659 IsLLNDK bool `blueprint:"mutated"`
660
Colin Cross5271fea2021-04-27 13:06:04 -0700661 // IsVendorPublicLibrary is set for the core and product variants of a library that has
662 // vendor_public_library stubs.
663 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800664}
665
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500666// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
667// to understanding details about the type of the current module.
668// For example, one might call these functions to determine whether the current module is a static
669// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800670type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800671 static() bool
672 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800673 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700674 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800675 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900676 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900677 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900678 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700679 toolchain() config.Toolchain
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700680 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800681 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900682 minSdkVersion() string
683 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700684 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700685 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800686 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800687 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700688 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900689 inProduct() bool
690 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800691 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700692 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900693 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900694 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700695 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700696 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800697 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000698 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800699 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900700 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800701 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800702 useClangLld(actx ModuleContext) bool
Colin Crosse07f2312020-08-13 11:24:56 -0700703 apexVariationName() string
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900704 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700705 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800706 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800707 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800708 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800709 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900710 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000711 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800712}
713
714type SharedFlags struct {
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000715 NumSharedFlags int
716 FlagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800717}
718
719type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700720 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800721 ModuleContextIntf
722}
723
724type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700725 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800726 ModuleContextIntf
727}
728
Colin Cross37047f12016-12-13 17:06:13 -0800729type DepsContext interface {
730 android.BottomUpMutatorContext
731 ModuleContextIntf
732}
733
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500734// feature represents additional (optional) steps to building cc-related modules, such as invocation
735// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800736type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800737 flags(ctx ModuleContext, flags Flags) Flags
738 props() []interface{}
739}
740
Joe Onorato37f900c2023-07-18 16:58:16 -0700741// Information returned from Generator about the source code it's generating
742type GeneratedSource struct {
743 IncludeDirs android.Paths
744 Sources android.Paths
745 Headers android.Paths
746 ReexportedDirs android.Paths
747}
748
749// generator allows injection of generated code
750type Generator interface {
751 GeneratorProps() []interface{}
752 GeneratorInit(ctx BaseModuleContext)
753 GeneratorDeps(ctx DepsContext, deps Deps) Deps
754 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
755 GeneratorSources(ctx ModuleContext) GeneratedSource
756 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
757}
758
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500759// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500760// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800761type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700762 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800763 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800764 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700765 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000766 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700767
Colin Cross76fada02016-07-27 10:31:13 -0700768 appendCflags([]string)
769 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700770 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800771}
772
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500773// linker is the interface for a linker decorator object. Individual module types can provide
774// their own implementation for this decorator, and thus specify custom logic regarding build
775// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800776type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700777 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800778 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700779 linkerFlags(ctx ModuleContext, flags Flags) Flags
780 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000781 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800782 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700783
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700784 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700785 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900786 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800787 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700788
789 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900790 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000791
792 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700793 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800794
Cole Faustd143f3e2025-02-24 16:18:18 -0800795 // Gets a list of files that will be disted when using the dist property without specifying
796 // an output file tag.
797 defaultDistFiles() []android.Path
798
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800799 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Cole Faust5e1454a2025-03-11 15:55:59 -0700800
801 testSuiteInfo(ctx ModuleContext)
Paul Duffin13f02712020-03-06 12:30:43 +0000802}
803
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500804// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000805type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500806 sharedLibs []string
807 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
808 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700809 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800810}
811
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500812// installer is the interface for an installer helper object. This helper is responsible for
813// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800814type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700815 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700816 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000817 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800818 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700819 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700820 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900821 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000822 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900823 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800824}
825
Inseob Kima1888ce2022-10-04 14:42:02 +0900826type overridable interface {
827 overriddenModules() []string
828}
829
Colin Cross6e511a92020-07-27 21:26:48 -0700830type libraryDependencyKind int
831
832const (
833 headerLibraryDependency = iota
834 sharedLibraryDependency
835 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400836 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700837)
838
839func (k libraryDependencyKind) String() string {
840 switch k {
841 case headerLibraryDependency:
842 return "headerLibraryDependency"
843 case sharedLibraryDependency:
844 return "sharedLibraryDependency"
845 case staticLibraryDependency:
846 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400847 case rlibLibraryDependency:
848 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700849 default:
850 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
851 }
852}
853
854type libraryDependencyOrder int
855
856const (
857 earlyLibraryDependency = -1
858 normalLibraryDependency = 0
859 lateLibraryDependency = 1
860)
861
862func (o libraryDependencyOrder) String() string {
863 switch o {
864 case earlyLibraryDependency:
865 return "earlyLibraryDependency"
866 case normalLibraryDependency:
867 return "normalLibraryDependency"
868 case lateLibraryDependency:
869 return "lateLibraryDependency"
870 default:
871 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
872 }
873}
874
875// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
876// tags that have a set of predefined tag objects that are reused for each dependency, a
877// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
878// That means that comparing a libraryDependencyTag for equality will only be equal if all
879// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
880// then check individual metadata fields instead.
881type libraryDependencyTag struct {
882 blueprint.BaseDependencyTag
883
884 // These are exported so that fmt.Printf("%#v") can call their String methods.
885 Kind libraryDependencyKind
886 Order libraryDependencyOrder
887
888 wholeStatic bool
889
890 reexportFlags bool
891 explicitlyVersioned bool
Colin Crossbd930bc2025-02-03 12:17:42 -0800892 explicitlyImpl bool
Colin Cross6e511a92020-07-27 21:26:48 -0700893 dataLib bool
894 ndk bool
895
896 staticUnwinder bool
897
898 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900899
Cindy Zhou18417cb2020-12-10 07:12:38 -0800900 // Whether or not this dependency should skip the apex dependency check
901 skipApexAllowedDependenciesCheck bool
902
Jiyong Parke3867542020-12-03 17:28:25 +0900903 // Whether or not this dependency has to be followed for the apex variants
904 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900905 // Whether or not this dependency has to be followed for the non-apex variants
906 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000907
908 // If true, don't automatically export symbols from the static library into a shared library.
909 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700910}
911
912// header returns true if the libraryDependencyTag is tagging a header lib dependency.
913func (d libraryDependencyTag) header() bool {
914 return d.Kind == headerLibraryDependency
915}
916
917// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
918func (d libraryDependencyTag) shared() bool {
919 return d.Kind == sharedLibraryDependency
920}
921
922// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
923func (d libraryDependencyTag) static() bool {
924 return d.Kind == staticLibraryDependency
925}
926
Colin Cross65cb3142021-12-10 23:05:02 +0000927func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
928 if d.shared() {
929 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
930 }
931 return nil
932}
933
934var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
935
Colin Crosse9fe2942020-11-10 18:12:15 -0800936// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
937// binaries or other shared libraries are installed as dependencies.
938func (d libraryDependencyTag) InstallDepNeeded() bool {
939 return d.shared()
940}
941
942var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
943
Yu Liu67a28422024-03-05 00:36:31 +0000944func (d libraryDependencyTag) PropagateAconfigValidation() bool {
945 return d.static()
946}
947
948var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
949
Colin Crosse9fe2942020-11-10 18:12:15 -0800950// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700951// libraryDependencyTag. Each tag object is created globally and reused for multiple
952// dependencies (although since the object contains no references, assigning a tag to a
953// variable and modifying it will not modify the original). Users can compare the tag
954// returned by ctx.OtherModuleDependencyTag against the global original
955type dependencyTag struct {
956 blueprint.BaseDependencyTag
957 name string
958}
959
Colin Crosse9fe2942020-11-10 18:12:15 -0800960// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
961// libraryDependencyTag, but where the dependency needs to be installed when the parent is
962// installed.
963type installDependencyTag struct {
964 blueprint.BaseDependencyTag
965 android.InstallAlwaysNeededDependencyTag
966 name string
967}
968
Colin Crossc99deeb2016-04-11 15:06:20 -0700969var (
Colin Cross6e511a92020-07-27 21:26:48 -0700970 genSourceDepTag = dependencyTag{name: "gen source"}
971 genHeaderDepTag = dependencyTag{name: "gen header"}
972 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
973 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900974 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700975 reuseObjTag = dependencyTag{name: "reuse objects"}
976 staticVariantTag = dependencyTag{name: "static variant"}
977 vndkExtDepTag = dependencyTag{name: "vndk extends"}
978 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700979 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800980 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000981 StubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000982 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500983 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400984 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800985 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700986)
987
Colin Crossbd930bc2025-02-03 12:17:42 -0800988func IsExplicitImplSharedDepTag(depTag blueprint.DependencyTag) bool {
989 ccLibDepTag, ok := depTag.(libraryDependencyTag)
990 return ok && ccLibDepTag.shared() && ccLibDepTag.explicitlyImpl
991}
992
Roland Levillainf89cd092019-07-29 16:22:59 +0100993func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700994 ccLibDepTag, ok := depTag.(libraryDependencyTag)
995 return ok && ccLibDepTag.shared()
996}
997
998func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
999 ccLibDepTag, ok := depTag.(libraryDependencyTag)
1000 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +01001001}
1002
Zach Johnson3df4e632020-11-06 11:56:27 -08001003func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
1004 ccLibDepTag, ok := depTag.(libraryDependencyTag)
1005 return ok && ccLibDepTag.header()
1006}
1007
Roland Levillainf89cd092019-07-29 16:22:59 +01001008func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -08001009 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +01001010}
1011
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001012func ExcludeInApexDepTag(depTag blueprint.DependencyTag) bool {
1013 ccLibDepTag, ok := depTag.(libraryDependencyTag)
1014 return ok && ccLibDepTag.excludeInApex
1015}
1016
Colin Crossca860ac2016-01-04 14:34:37 -08001017// Module contains the properties and members used by all C/C++ module types, and implements
1018// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -05001019// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
1020// interface.
1021//
1022// To define a C/C++ related module, construct a new Module object and point its delegates to
1023// type-specific structs. These delegates will be invoked to register module-specific build
1024// statements which may be unique to the module type. For example, module.compiler.compile() should
1025// be defined so as to register build statements which are responsible for compiling the module.
1026//
1027// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
1028// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
1029// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
1030// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -08001031type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -07001032 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -07001033
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07001034 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -07001035 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -07001036 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -07001037
Colin Crossca860ac2016-01-04 14:34:37 -08001038 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +00001039 hod android.HostOrDeviceSupported
1040 multilib android.Multilib
1041 testModule bool
1042 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -07001043
Paul Duffina0843f62019-12-13 19:50:38 +00001044 // Allowable SdkMemberTypes of this module type.
1045 sdkMemberTypes []android.SdkMemberType
1046
Chris Parsonsef6e0cf2020-12-01 18:26:21 -05001047 // decorator delegates, initialize before calling Init
1048 // these may contain module-specific implementations, and effectively allow for custom
1049 // type-specific logic. These members may reference different objects or the same object.
1050 // Functions of these decorators will be invoked to initialize and register type-specific
1051 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -08001052 generators []Generator
1053 compiler compiler
1054 linker linker
1055 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -05001056
Spandan Dase12d2522023-09-12 21:42:31 +00001057 features []feature
1058 stl *stl
1059 sanitize *sanitize
1060 coverage *coverage
1061 fuzzer *fuzzer
1062 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +00001063 lto *lto
1064 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001065 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -08001066
Colin Cross31076b32020-10-23 17:22:06 -07001067 library libraryInterface
1068
Colin Cross635c3b02016-05-18 15:37:25 -07001069 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -08001070
Colin Crossb98c8b02016-07-29 13:44:28 -07001071 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -07001072
Yu Liue70976d2024-10-15 20:45:35 +00001073 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001074
1075 // Flags used to compile this module
1076 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -07001077
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001078 // Shared flags among build rules of this module
1079 sharedFlags SharedFlags
1080
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08001081 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -07001082 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001083
1084 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001085
1086 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001087 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001088
1089 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001090
Inseob Kim37e0bb02024-04-29 15:54:44 +09001091 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001092
1093 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001094
1095 hasAidl bool
1096 hasLex bool
1097 hasProto bool
1098 hasRenderscript bool
1099 hasSysprop bool
1100 hasWinMsg bool
1101 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001102
1103 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001104}
1105
Yu Liu76d94462024-10-31 23:32:36 +00001106func (c *Module) IncrementalSupported() bool {
1107 return c.incremental
1108}
1109
1110var _ blueprint.Incremental = (*Module)(nil)
1111
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001112func (c *Module) AddJSONData(d *map[string]interface{}) {
1113 c.AndroidModuleBase().AddJSONData(d)
1114 (*d)["Cc"] = map[string]interface{}{
1115 "SdkVersion": c.SdkVersion(),
1116 "MinSdkVersion": c.MinSdkVersion(),
1117 "VndkVersion": c.VndkVersion(),
1118 "ProductSpecific": c.ProductSpecific(),
1119 "SocSpecific": c.SocSpecific(),
1120 "DeviceSpecific": c.DeviceSpecific(),
1121 "InProduct": c.InProduct(),
1122 "InVendor": c.InVendor(),
1123 "InRamdisk": c.InRamdisk(),
1124 "InVendorRamdisk": c.InVendorRamdisk(),
1125 "InRecovery": c.InRecovery(),
1126 "VendorAvailable": c.VendorAvailable(),
1127 "ProductAvailable": c.ProductAvailable(),
1128 "RamdiskAvailable": c.RamdiskAvailable(),
1129 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1130 "RecoveryAvailable": c.RecoveryAvailable(),
1131 "OdmAvailable": c.OdmAvailable(),
1132 "InstallInData": c.InstallInData(),
1133 "InstallInRamdisk": c.InstallInRamdisk(),
1134 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1135 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1136 "InstallInRecovery": c.InstallInRecovery(),
1137 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001138 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001139 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1140 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001141 "AidlSrcs": c.hasAidl,
1142 "LexSrcs": c.hasLex,
1143 "ProtoSrcs": c.hasProto,
1144 "RenderscriptSrcs": c.hasRenderscript,
1145 "SyspropSrcs": c.hasSysprop,
1146 "WinMsgSrcs": c.hasWinMsg,
1147 "YaccSrsc": c.hasYacc,
1148 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001149 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001150 }
1151}
1152
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001153func (c *Module) SetPreventInstall() {
1154 c.Properties.PreventInstall = true
1155}
1156
1157func (c *Module) SetHideFromMake() {
1158 c.Properties.HideFromMake = true
1159}
1160
Ivan Lozanod7586b62021-04-01 09:49:36 -04001161func (c *Module) HiddenFromMake() bool {
1162 return c.Properties.HideFromMake
1163}
1164
Cole Fauste8a87832024-09-11 11:35:46 -07001165func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001166 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001167 if c.ImageVariation().Variation == android.CoreVariation {
1168 required = append(required, c.Properties.Target.Platform.Required...)
1169 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1170 } else if c.InRecovery() {
1171 required = append(required, c.Properties.Target.Recovery.Required...)
1172 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1173 }
1174 return android.FirstUniqueStrings(required)
1175}
1176
Ivan Lozano52767be2019-10-18 14:49:46 -07001177func (c *Module) Toc() android.OptionalPath {
1178 if c.linker != nil {
1179 if library, ok := c.linker.(libraryInterface); ok {
1180 return library.toc()
1181 }
1182 }
1183 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1184}
1185
1186func (c *Module) ApiLevel() string {
1187 if c.linker != nil {
1188 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001189 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001190 }
1191 }
1192 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1193}
1194
1195func (c *Module) Static() bool {
1196 if c.linker != nil {
1197 if library, ok := c.linker.(libraryInterface); ok {
1198 return library.static()
1199 }
1200 }
1201 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1202}
1203
1204func (c *Module) Shared() bool {
1205 if c.linker != nil {
1206 if library, ok := c.linker.(libraryInterface); ok {
1207 return library.shared()
1208 }
1209 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001210
Ivan Lozano52767be2019-10-18 14:49:46 -07001211 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1212}
1213
1214func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001215 if c.stl != nil {
1216 return c.stl.Properties.SelectedStl
1217 }
1218 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001219}
1220
Ivan Lozano52767be2019-10-18 14:49:46 -07001221func (c *Module) StubDecorator() bool {
1222 if _, ok := c.linker.(*stubDecorator); ok {
1223 return true
1224 }
1225 return false
1226}
1227
Yi Kong5786f5c2024-05-28 02:22:34 +09001228func (c *Module) OptimizeForSize() bool {
1229 return Bool(c.Properties.Optimize_for_size)
1230}
1231
Ivan Lozano52767be2019-10-18 14:49:46 -07001232func (c *Module) SdkVersion() string {
1233 return String(c.Properties.Sdk_version)
1234}
1235
Artur Satayev480e25b2020-04-27 18:53:18 +01001236func (c *Module) MinSdkVersion() string {
1237 return String(c.Properties.Min_sdk_version)
1238}
1239
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001240func (c *Module) SetSdkVersion(s string) {
1241 c.Properties.Sdk_version = StringPtr(s)
1242}
1243
1244func (c *Module) SetMinSdkVersion(s string) {
1245 c.Properties.Min_sdk_version = StringPtr(s)
1246}
1247
1248func (c *Module) SetStl(s string) {
1249 if c.stl != nil {
1250 c.stl.Properties.Stl = StringPtr(s)
1251 }
1252}
1253
1254func (c *Module) IsCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001255 if linker, ok := c.linker.(*objectLinker); ok {
1256 return linker.isCrt()
1257 }
1258 return false
1259}
1260
Jiyong Park5df7bd32021-08-25 16:18:46 +09001261func (c *Module) SplitPerApiLevel() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001262 return CanUseSdk(c) && c.IsCrt()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001263}
1264
Colin Crossc511bc52020-04-07 16:50:32 +00001265func (c *Module) AlwaysSdk() bool {
1266 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1267}
1268
Ivan Lozano183a3212019-10-18 14:18:45 -07001269func (c *Module) CcLibrary() bool {
1270 if c.linker != nil {
1271 if _, ok := c.linker.(*libraryDecorator); ok {
1272 return true
1273 }
Colin Crossd48fe732020-09-23 20:37:24 -07001274 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1275 return true
1276 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001277 }
1278 return false
1279}
1280
1281func (c *Module) CcLibraryInterface() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001282 if c.library != nil {
Ivan Lozano183a3212019-10-18 14:18:45 -07001283 return true
1284 }
1285 return false
1286}
1287
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001288func (c *Module) RlibStd() bool {
1289 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1290}
1291
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001292func (c *Module) RustLibraryInterface() bool {
1293 return false
1294}
1295
Ivan Lozano0a468a42024-05-13 21:03:34 -04001296func (c *Module) CrateName() string {
1297 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1298}
1299
1300func (c *Module) ExportedCrateLinkDirs() []string {
1301 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1302}
1303
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001304func (c *Module) IsFuzzModule() bool {
1305 if _, ok := c.compiler.(*fuzzBinary); ok {
1306 return true
1307 }
1308 return false
1309}
1310
1311func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1312 return c.FuzzModule
1313}
1314
1315func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1316 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1317 return fuzzer.fuzzPackagedModule
1318 }
1319 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1320}
1321
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001322func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001323 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1324 return fuzzer.sharedLibraries
1325 }
1326 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1327}
1328
Ivan Lozano2b262972019-11-21 12:30:50 -08001329func (c *Module) NonCcVariants() bool {
1330 return false
1331}
1332
Ivan Lozano183a3212019-10-18 14:18:45 -07001333func (c *Module) SetStatic() {
1334 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001335 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001336 library.setStatic()
1337 return
1338 }
1339 }
1340 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1341}
1342
1343func (c *Module) SetShared() {
1344 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001345 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001346 library.setShared()
1347 return
1348 }
1349 }
1350 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1351}
1352
1353func (c *Module) BuildStaticVariant() bool {
1354 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001355 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001356 return library.buildStatic()
1357 }
1358 }
1359 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1360}
1361
1362func (c *Module) BuildSharedVariant() bool {
1363 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001364 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001365 return library.buildShared()
1366 }
1367 }
1368 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1369}
1370
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001371func (c *Module) BuildRlibVariant() bool {
1372 // cc modules can never build rlib variants
1373 return false
1374}
1375
Ivan Lozano183a3212019-10-18 14:18:45 -07001376func (c *Module) Module() android.Module {
1377 return c
1378}
1379
Jiyong Parkc20eee32018-09-05 22:36:17 +09001380func (c *Module) OutputFile() android.OptionalPath {
1381 return c.outputFile
1382}
1383
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001384func (c *Module) CoverageFiles() android.Paths {
1385 if c.linker != nil {
1386 if library, ok := c.linker.(libraryInterface); ok {
1387 return library.objs().coverageFiles
1388 }
1389 }
1390 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1391}
1392
Ivan Lozano183a3212019-10-18 14:18:45 -07001393var _ LinkableInterface = (*Module)(nil)
1394
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001395func (c *Module) VersionedInterface() VersionedInterface {
1396 if c.library != nil {
1397 return c.library
1398 }
1399 return nil
1400}
1401
Jiyong Park719b4462019-01-13 00:39:51 +09001402func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001403 if c.linker != nil {
1404 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001405 }
1406 return nil
1407}
1408
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001409func (c *Module) CoverageOutputFile() android.OptionalPath {
1410 if c.linker != nil {
1411 return c.linker.coverageOutputFilePath()
1412 }
1413 return android.OptionalPath{}
1414}
1415
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001416func (c *Module) RelativeInstallPath() string {
1417 if c.installer != nil {
1418 return c.installer.relativeInstallPath()
1419 }
1420 return ""
1421}
1422
Jooyung Han344d5432019-08-23 11:17:39 +09001423func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001424 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001425}
1426
Colin Cross36242852017-06-23 15:06:31 -07001427func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001428 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001429 for _, generator := range c.generators {
1430 c.AddProperties(generator.GeneratorProps()...)
1431 }
Colin Crossca860ac2016-01-04 14:34:37 -08001432 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001433 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001434 }
1435 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001436 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001437 }
1438 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001439 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001440 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001441 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001442 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001443 }
Colin Cross16b23492016-01-06 14:41:07 -08001444 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001445 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001446 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001447 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001448 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001449 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001450 if c.fuzzer != nil {
1451 c.AddProperties(c.fuzzer.props()...)
1452 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001453 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001454 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001455 }
Stephen Craneba090d12017-05-09 15:44:35 -07001456 if c.lto != nil {
1457 c.AddProperties(c.lto.props()...)
1458 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001459 if c.afdo != nil {
1460 c.AddProperties(c.afdo.props()...)
1461 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001462 if c.orderfile != nil {
1463 c.AddProperties(c.orderfile.props()...)
1464 }
Colin Crossca860ac2016-01-04 14:34:37 -08001465 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001466 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001467 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001468 // Allow test-only on libraries that are not cc_test_library
1469 if c.library != nil && !c.testLibrary() {
1470 c.AddProperties(&c.sourceProperties)
1471 }
Colin Crossc472d572015-03-17 15:06:21 -07001472
Colin Cross36242852017-06-23 15:06:31 -07001473 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001474 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001475 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001476
Colin Cross36242852017-06-23 15:06:31 -07001477 return c
Colin Crossc472d572015-03-17 15:06:21 -07001478}
1479
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001480// UseVndk() returns true if this module is built against VNDK.
1481// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001482func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001483 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001484}
1485
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001486func CanUseSdk(c LinkableInterface) bool {
1487 return c.Module().Target().Os == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001488 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001489}
1490
1491func (c *Module) UseSdk() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001492 if CanUseSdk(c) {
Colin Cross1348ce32020-10-01 13:37:16 -07001493 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001494 }
1495 return false
1496}
1497
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001498func (c *Module) isCoverageVariant() bool {
1499 return c.coverage.Properties.IsCoverageVariant
1500}
1501
Colin Cross95f1ca02020-10-29 20:47:22 -07001502func (c *Module) IsNdk(config android.Config) bool {
1503 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001504}
1505
Colin Cross127bb8b2020-12-16 16:46:01 -08001506func (c *Module) IsLlndk() bool {
1507 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001508}
1509
Colin Cross1f3f1302021-04-26 18:37:44 -07001510func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001511 lib := moduleVersionedInterface(m)
1512 return lib != nil && (lib.HasLLNDKStubs() || lib.HasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001513}
1514
Colin Cross5271fea2021-04-27 13:06:04 -07001515func (m *Module) NeedsVendorPublicLibraryVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001516 lib := moduleVersionedInterface(m)
1517 return lib != nil && (lib.HasVendorPublicLibrary())
Colin Cross5271fea2021-04-27 13:06:04 -07001518}
1519
1520// IsVendorPublicLibrary returns true for vendor public libraries.
1521func (c *Module) IsVendorPublicLibrary() bool {
1522 return c.VendorProperties.IsVendorPublicLibrary
1523}
1524
Ivan Lozanof1868af2022-04-12 13:08:36 -04001525func (c *Module) IsVndkPrebuiltLibrary() bool {
1526 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1527 return true
1528 }
1529 return false
1530}
1531
1532func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1533 return c.Properties.SdkAndPlatformVariantVisibleToMake
1534}
1535
Ivan Lozanod7586b62021-04-01 09:49:36 -04001536func (c *Module) HasLlndkStubs() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001537 lib := moduleVersionedInterface(c)
1538 return lib != nil && lib.HasLLNDKStubs()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001539}
1540
1541func (c *Module) StubsVersion() string {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001542 if lib, ok := c.linker.(VersionedInterface); ok {
1543 return lib.StubsVersion()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001544 }
1545 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1546}
1547
Colin Cross127bb8b2020-12-16 16:46:01 -08001548// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1549// and does not set llndk.vendor_available: false.
1550func (c *Module) isImplementationForLLNDKPublic() bool {
1551 library, _ := c.library.(*libraryDecorator)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001552 return library != nil && library.HasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001553 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001554}
1555
Colin Cross3513fb12024-01-24 14:44:47 -08001556func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001557 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001558 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001559 }
1560 return false
1561}
1562
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001563func (c *Module) isOrderfileCompile() bool {
1564 if orderfile := c.orderfile; orderfile != nil {
1565 return orderfile.Properties.OrderfileLoad
1566 }
1567 return false
1568}
1569
Yi Kongc702ebd2022-08-19 16:02:45 +08001570func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001571 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001572}
1573
Yi Konged79fa32023-06-04 17:15:42 +09001574func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001575 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001576}
1577
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001578func (c *Module) isNDKStubLibrary() bool {
1579 if _, ok := c.compiler.(*stubDecorator); ok {
1580 return true
1581 }
1582 return false
1583}
1584
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001585func (c *Module) SubName() string {
1586 return c.Properties.SubName
1587}
1588
Jiyong Park25fc6a92018-11-18 18:02:45 +09001589func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001590 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001591 return lib.BuildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001592 }
1593 return false
1594}
1595
1596func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001597 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001598 return lib.HasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001599 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001600 return false
1601}
1602
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001603func (c *Module) RustApexExclude() bool {
1604 return false
1605}
1606
Alan Stokes73feba32022-11-14 12:21:24 +00001607func (c *Module) IsStubsImplementationRequired() bool {
1608 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001609 return lib.IsStubsImplementationRequired()
Alan Stokes73feba32022-11-14 12:21:24 +00001610 }
1611 return false
1612}
1613
Colin Cross0477b422020-10-13 18:43:54 -07001614// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1615// the implementation. If it is an implementation library it returns its own name.
1616func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1617 name := ctx.OtherModuleName(c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001618 if versioned, ok := c.linker.(VersionedInterface); ok {
1619 name = versioned.ImplementationModuleName(name)
Colin Cross0477b422020-10-13 18:43:54 -07001620 }
1621 return name
1622}
1623
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001624// Similar to ImplementationModuleNameByCtx, but uses the Make variant of the module
Martin Stjernholm2856c662020-12-02 15:03:42 +00001625// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1626// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1627// under the premise that the prebuilt module overrides its source counterpart
1628// if it is exposed to Make).
Yu Liu0a37d422025-02-13 02:05:00 +00001629func (c *Module) ImplementationModuleNameForMake() string {
Martin Stjernholm2856c662020-12-02 15:03:42 +00001630 name := c.BaseModuleName()
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001631 if versioned, ok := c.linker.(VersionedInterface); ok {
1632 name = versioned.ImplementationModuleName(name)
Martin Stjernholm2856c662020-12-02 15:03:42 +00001633 }
1634 return name
1635}
1636
Jiyong Park7d55b612021-06-11 17:22:09 +09001637func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001638 return Bool(c.Properties.Bootstrap)
1639}
1640
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001641func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001642 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1643 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1644 return false
1645 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001646 return c.linker != nil && c.linker.nativeCoverage()
1647}
1648
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001649func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001650 if p, ok := c.linker.(SnapshotInterface); ok {
1651 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001652 }
1653 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001654}
1655
Jiyong Parkf1194352019-02-25 11:05:47 +09001656func isBionic(name string) bool {
1657 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001658 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001659 return true
1660 }
1661 return false
1662}
1663
Martin Stjernholm279de572019-09-10 23:18:20 +01001664func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001665 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001666 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001667 }
1668 return isBionic(name)
1669}
1670
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001671func (c *Module) isCfiAssemblySupportEnabled() bool {
1672 return c.sanitize != nil &&
1673 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1674}
1675
Inseob Kim800d1142021-06-14 12:03:51 +09001676func (c *Module) InstallInRoot() bool {
1677 return c.installer != nil && c.installer.installInRoot()
1678}
1679
Colin Crossca860ac2016-01-04 14:34:37 -08001680type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001681 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001682 moduleContextImpl
1683}
1684
Colin Cross37047f12016-12-13 17:06:13 -08001685type depsContext struct {
1686 android.BottomUpMutatorContext
1687 moduleContextImpl
1688}
1689
Colin Crossca860ac2016-01-04 14:34:37 -08001690type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001691 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001692 moduleContextImpl
1693}
1694
1695type moduleContextImpl struct {
1696 mod *Module
1697 ctx BaseModuleContext
1698}
1699
Colin Crossb98c8b02016-07-29 13:44:28 -07001700func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001701 return ctx.mod.toolchain(ctx.ctx)
1702}
1703
1704func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001705 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001706}
1707
1708func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001709 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001710}
1711
Colin Cross6a730042024-12-05 13:53:43 -08001712func (ctx *moduleContextImpl) staticLibrary() bool {
1713 return ctx.mod.staticLibrary()
1714}
1715
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001716func (ctx *moduleContextImpl) testBinary() bool {
1717 return ctx.mod.testBinary()
1718}
1719
Yi Kong56fc1b62022-09-06 16:24:00 +08001720func (ctx *moduleContextImpl) testLibrary() bool {
1721 return ctx.mod.testLibrary()
1722}
1723
Jiyong Park1d1119f2019-07-29 21:27:18 +09001724func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001725 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001726}
1727
Inseob Kim7f283f42020-06-01 21:53:49 +09001728func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001729 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001730}
1731
Inseob Kim1042d292020-06-01 23:23:05 +09001732func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001733 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001734}
1735
Yi Kong5786f5c2024-05-28 02:22:34 +09001736func (ctx *moduleContextImpl) optimizeForSize() bool {
1737 return ctx.mod.OptimizeForSize()
1738}
1739
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001740func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001741 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001742}
1743
1744func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001745 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001746 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001747 }
1748 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001749}
1750
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001751func MinSdkVersion(mod VersionedLinkableInterface, ctxIsForPlatform bool, device bool,
1752 platformSdkVersion string) string {
1753
1754 ver := mod.MinSdkVersion()
1755 if ver == "apex_inherit" && !ctxIsForPlatform {
1756 ver = mod.ApexSdkVersion().String()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001757 }
1758 if ver == "apex_inherit" || ver == "" {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001759 ver = mod.SdkVersion()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001760 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001761
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001762 if device {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001763 // When building for vendor/product, use the latest _stable_ API as "current".
1764 // This is passed to clang/aidl compilers so that compiled/generated code works
1765 // with the system.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001766 if (mod.InVendor() || mod.InProduct()) && (ver == "" || ver == "current") {
1767 ver = platformSdkVersion
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001768 }
1769 }
1770
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001771 // For crt objects, the meaning of min_sdk_version is very different from other types of
1772 // module. For them, min_sdk_version defines the oldest version that the build system will
1773 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1774 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1775 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001776 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1777 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1778 // support such an old version. The version is set to the later version in case when the
1779 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1780 // it's for an APEX.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001781 if mod.IsCrt() && !mod.IsSdkVariant() {
1782 if ctxIsForPlatform {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001783 ver = strconv.Itoa(android.FutureApiLevelInt)
1784 } else { // for apex
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001785 ver = mod.ApexSdkVersion().String()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001786 if ver == "" { // in case when min_sdk_version was not set by the APEX
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001787 ver = mod.SdkVersion()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001788 }
1789 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001790 }
1791
Jiyong Parkb35a8192020-08-10 15:59:36 +09001792 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001793 sdkVersionInt, err := strconv.Atoi(mod.SdkVersion())
Jiyong Parkb35a8192020-08-10 15:59:36 +09001794 minSdkVersionInt, err2 := strconv.Atoi(ver)
1795 if err == nil && err2 == nil {
1796 if sdkVersionInt < minSdkVersionInt {
1797 return strconv.Itoa(sdkVersionInt)
1798 }
1799 }
1800 return ver
1801}
1802
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001803func (ctx *moduleContextImpl) minSdkVersion() string {
1804 platformSdkVersion := ""
1805 if ctx.ctx.Device() {
1806 platformSdkVersion = ctx.ctx.Config().PlatformSdkVersion().String()
1807 }
1808 return MinSdkVersion(ctx.mod, CtxIsForPlatform(ctx.ctx), ctx.ctx.Device(), platformSdkVersion)
1809}
1810
Jiyong Parkb35a8192020-08-10 15:59:36 +09001811func (ctx *moduleContextImpl) isSdkVariant() bool {
1812 return ctx.mod.IsSdkVariant()
1813}
1814
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001815func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001816 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001817}
Justin Yun8effde42017-06-23 19:24:43 +09001818
Kiyoung Kimaa394802024-01-08 12:55:45 +09001819func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1820 return ctx.mod.InVendorOrProduct()
1821}
1822
Colin Cross95f1ca02020-10-29 20:47:22 -07001823func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1824 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001825}
1826
Colin Cross127bb8b2020-12-16 16:46:01 -08001827func (ctx *moduleContextImpl) IsLlndk() bool {
1828 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001829}
1830
Colin Cross127bb8b2020-12-16 16:46:01 -08001831func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1832 return ctx.mod.isImplementationForLLNDKPublic()
1833}
1834
Colin Cross3513fb12024-01-24 14:44:47 -08001835func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1836 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001837}
1838
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001839func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1840 return ctx.mod.isOrderfileCompile()
1841}
1842
Yi Kongc702ebd2022-08-19 16:02:45 +08001843func (ctx *moduleContextImpl) isCfi() bool {
1844 return ctx.mod.isCfi()
1845}
1846
Yi Konged79fa32023-06-04 17:15:42 +09001847func (ctx *moduleContextImpl) isFuzzer() bool {
1848 return ctx.mod.isFuzzer()
1849}
1850
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001851func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1852 return ctx.mod.isNDKStubLibrary()
1853}
1854
Colin Cross5271fea2021-04-27 13:06:04 -07001855func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1856 return ctx.mod.IsVendorPublicLibrary()
1857}
1858
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001859func (ctx *moduleContextImpl) selectedStl() string {
1860 if stl := ctx.mod.stl; stl != nil {
1861 return stl.Properties.SelectedStl
1862 }
1863 return ""
1864}
1865
Ivan Lozanobd721262018-11-27 14:33:03 -08001866func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1867 return ctx.mod.linker.useClangLld(actx)
1868}
1869
Colin Crossce75d2c2016-10-06 16:12:58 -07001870func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001871 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001872}
1873
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001874func CtxIsForPlatform(ctx android.BaseModuleContext) bool {
1875 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Colin Crossff694a82023-12-13 15:54:49 -08001876 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001877}
1878
Colin Crosse07f2312020-08-13 11:24:56 -07001879func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001880 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1881 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001882}
1883
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001884func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001885 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001886}
1887
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001888func (ctx *moduleContextImpl) nativeCoverage() bool {
1889 return ctx.mod.nativeCoverage()
1890}
1891
Colin Cross95b07f22020-12-16 11:06:50 -08001892func (ctx *moduleContextImpl) isPreventInstall() bool {
1893 return ctx.mod.Properties.PreventInstall
1894}
1895
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001896func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1897 shared := &ctx.mod.sharedFlags
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001898 if shared.FlagsMap == nil {
1899 shared.NumSharedFlags = 0
1900 shared.FlagsMap = make(map[string]string)
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001901 }
1902 return shared
1903}
1904
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001905func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1906 return ctx.mod.isCfiAssemblySupportEnabled()
1907}
1908
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001909func (ctx *moduleContextImpl) notInPlatform() bool {
1910 return ctx.mod.NotInPlatform()
1911}
1912
Yu Liu76d94462024-10-31 23:32:36 +00001913func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1914 if ctx.mod.makeVarsInfo == nil {
1915 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1916 }
1917 return ctx.mod.makeVarsInfo
1918}
1919
Colin Cross635c3b02016-05-18 15:37:25 -07001920func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001921 return &Module{
1922 hod: hod,
1923 multilib: multilib,
1924 }
1925}
1926
Colin Cross635c3b02016-05-18 15:37:25 -07001927func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001928 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001929 module.features = []feature{
1930 &tidyFeature{},
1931 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001932 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001933 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001934 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001935 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001936 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001937 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001938 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001939 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001940 return module
1941}
1942
Colin Crossce75d2c2016-10-06 16:12:58 -07001943func (c *Module) Prebuilt() *android.Prebuilt {
1944 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1945 return p.prebuilt()
1946 }
1947 return nil
1948}
1949
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001950func (c *Module) IsPrebuilt() bool {
1951 return c.Prebuilt() != nil
1952}
1953
Colin Crossce75d2c2016-10-06 16:12:58 -07001954func (c *Module) Name() string {
1955 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001956 if p, ok := c.linker.(interface {
1957 Name(string) string
1958 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001959 name = p.Name(name)
1960 }
1961 return name
1962}
1963
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001964func (c *Module) Multilib() string {
1965 return c.Arch().ArchType.Multilib
1966}
1967
1968func (c *Module) ApexSdkVersion() android.ApiLevel {
1969 return c.apexSdkVersion
1970}
1971
Alex Light3d673592019-01-18 14:37:31 -08001972func (c *Module) Symlinks() []string {
1973 if p, ok := c.installer.(interface {
1974 symlinkList() []string
1975 }); ok {
1976 return p.symlinkList()
1977 }
1978 return nil
1979}
1980
Chris Parsons216e10a2020-07-09 17:12:52 -04001981func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001982 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001983 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001984 }); ok {
1985 return p.dataPaths()
1986 }
1987 return nil
1988}
1989
Ivan Lozanof1868af2022-04-12 13:08:36 -04001990func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001991 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1992 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001993 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001994 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001995 if c.ProductSpecific() {
1996 // If the module is product specific with 'product_specific: true',
1997 // do not add a name suffix because it is a base module.
1998 return ""
1999 }
Justin Yunaf1fde42023-09-27 16:22:10 +09002000 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09002001 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05002002 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09002003 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09002004 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09002005 // add version suffix only if the module is using different vndk version than the
2006 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04002007 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09002008 }
2009 return nameSuffix
2010}
2011
Ivan Lozanof1868af2022-04-12 13:08:36 -04002012func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
2013 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09002014
2015 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002016 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09002017 }
2018
Colin Cross127bb8b2020-12-16 16:46:01 -08002019 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09002020 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09002021 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
2022 // added for product variant only when we have vendor and product variants with core
2023 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04002024 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07002025 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002026 subName += vendorPublicLibrarySuffix
2027 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09002028 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
2029 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04002030 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08002031 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002032 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07002033 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002034 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07002035 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002036 subName += RecoverySuffix
2037 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
2038 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07002039 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04002040 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07002041 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00002042 } else if c.IsStubs() && c.IsSdkVariant() {
2043 // Public API surface (NDK)
2044 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
2045 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09002046 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04002047
2048 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05002049}
2050
Sam Delmerico75dbca22023-04-20 13:13:25 +00002051func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
2052 ctx := &moduleContext{
2053 ModuleContext: actx,
2054 moduleContextImpl: moduleContextImpl{
2055 mod: c,
2056 },
2057 }
2058 ctx.ctx = ctx
2059 return ctx
2060}
2061
Spandan Das20fce2d2023-04-12 17:21:39 +00002062// TODO (b/277651159): Remove this allowlist
2063var (
2064 skipStubLibraryMultipleApexViolation = map[string]bool{
2065 "libclang_rt.asan": true,
2066 "libclang_rt.hwasan": true,
2067 // runtime apex
2068 "libc": true,
2069 "libc_hwasan": true,
2070 "libdl_android": true,
2071 "libm": true,
2072 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00002073 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00002074 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01002075 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00002076 "libandroidio": true,
2077 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01002078 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00002079 "libnativebridge": true,
2080 "libnativehelper": true,
2081 "libnativeloader": true,
2082 "libsigchain": true,
2083 }
2084)
2085
2086// Returns true if a stub library could be installed in multiple apexes
2087func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2088 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08002089 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00002090 return false
2091 }
2092 // If this is not a stub library, no check necessary
2093 if !c.HasStubsVariants() {
2094 return false
2095 }
2096 // Skip the allowlist
2097 // Use BaseModuleName so that this matches prebuilts.
2098 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2099 return false
2100 }
2101
Spandan Das20fce2d2023-04-12 17:21:39 +00002102 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08002103 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
2104 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00002105 return true
2106 }
2107 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08002108 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00002109 return true
2110 }
2111 // Default: no violation
2112 return false
2113}
2114
Chris Parsons8d6e4332021-02-22 16:13:50 -05002115func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002116 ctx := moduleContextFromAndroidModuleContext(actx, c)
2117
Inseob Kim37e0bb02024-04-29 15:54:44 +09002118 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2119 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2120 Logtags: c.logtagsPaths,
2121 })
2122
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002123 // If Test_only is set on a module in bp file, respect the setting, otherwise
2124 // see if is a known test module type.
2125 testOnly := c.testModule || c.testLibrary()
2126 if c.sourceProperties.Test_only != nil {
2127 testOnly = Bool(c.sourceProperties.Test_only)
2128 }
2129 // Keep before any early returns.
2130 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2131 TestOnly: testOnly,
2132 TopLevelTarget: c.testModule,
2133 })
2134
Ivan Lozanof1868af2022-04-12 13:08:36 -04002135 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002136 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002137 if !apexInfo.IsForPlatform() {
2138 c.hideApexVariantFromMake = true
2139 }
2140
Chris Parsonseefc9e62021-04-02 17:36:47 -04002141 c.makeLinkType = GetMakeLinkType(actx, c)
2142
Colin Crossf18e1102017-11-16 14:33:08 -08002143 deps := c.depsToPaths(ctx)
2144 if ctx.Failed() {
2145 return
2146 }
2147
Joe Onorato37f900c2023-07-18 16:58:16 -07002148 for _, generator := range c.generators {
2149 gen := generator.GeneratorSources(ctx)
2150 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2151 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2152 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2153 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2154 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2155 if len(deps.Objs.objFiles) == 0 {
2156 // If we are reusuing object files (which happens when we're a shared library and we're
2157 // reusing our static variant's object files), then skip adding the actual source files,
2158 // because we already have the object for it.
2159 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2160 }
2161 }
2162
2163 if ctx.Failed() {
2164 return
2165 }
2166
Spandan Das20fce2d2023-04-12 17:21:39 +00002167 if c.stubLibraryMultipleApexViolation(actx) {
2168 actx.PropertyErrorf("apex_available",
2169 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2170 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002171 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2172 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002173 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2174 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002175 }
2176
Colin Crossca860ac2016-01-04 14:34:37 -08002177 flags := Flags{
2178 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002179 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002180 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002181 for _, generator := range c.generators {
2182 flags = generator.GeneratorFlags(ctx, flags, deps)
2183 }
Colin Crossca860ac2016-01-04 14:34:37 -08002184 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002185 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002186 }
2187 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002188 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002189 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002190 if c.stl != nil {
2191 flags = c.stl.flags(ctx, flags)
2192 }
Colin Cross16b23492016-01-06 14:41:07 -08002193 if c.sanitize != nil {
2194 flags = c.sanitize.flags(ctx, flags)
2195 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002196 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002197 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002198 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002199 if c.fuzzer != nil {
2200 flags = c.fuzzer.flags(ctx, flags)
2201 }
Stephen Craneba090d12017-05-09 15:44:35 -07002202 if c.lto != nil {
2203 flags = c.lto.flags(ctx, flags)
2204 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002205 if c.afdo != nil {
2206 flags = c.afdo.flags(ctx, flags)
2207 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002208 if c.orderfile != nil {
2209 flags = c.orderfile.flags(ctx, flags)
2210 }
Colin Crossca860ac2016-01-04 14:34:37 -08002211 for _, feature := range c.features {
2212 flags = feature.flags(ctx, flags)
2213 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002214 if ctx.Failed() {
2215 return
2216 }
2217
Colin Cross4af21ed2019-11-04 09:37:55 -08002218 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2219 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2220 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002221
Colin Cross4af21ed2019-11-04 09:37:55 -08002222 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002223
2224 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002225 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002226 }
2227 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002228 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002229 }
2230
Colin Cross3e5e7782022-06-17 22:17:05 +00002231 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2232
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002233 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002234 // We need access to all the flags seen by a source file.
2235 if c.sabi != nil {
2236 flags = c.sabi.flags(ctx, flags)
2237 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002238
Colin Cross4af21ed2019-11-04 09:37:55 -08002239 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002240
Joe Onorato37f900c2023-07-18 16:58:16 -07002241 for _, generator := range c.generators {
2242 generator.GeneratorBuildActions(ctx, flags, deps)
2243 }
2244
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002245 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002246 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002247 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002248 if ctx.Failed() {
2249 return
2250 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002251 }
2252
Colin Crossca860ac2016-01-04 14:34:37 -08002253 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002254 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002255 if ctx.Failed() {
2256 return
2257 }
Colin Cross635c3b02016-05-18 15:37:25 -07002258 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002259
Chris Parsons94a0bba2021-06-04 15:03:47 -04002260 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002261
2262 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2263 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2264 })
Aditya Choudhary87b2ab22023-11-17 15:27:06 +00002265 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002266
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002267 if Bool(c.Properties.Cmake_snapshot_supported) {
2268 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2269 }
2270
Chris Parsons94a0bba2021-06-04 15:03:47 -04002271 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002272
2273 if c.linker != nil {
2274 moduleInfoJSON := ctx.ModuleInfoJSON()
2275 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2276 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2277 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2278 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2279 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2280
2281 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2282 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2283 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2284 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2285
2286 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2287 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2288 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2289 moduleInfoJSON.SubName += ".cfi"
2290 }
2291 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2292 moduleInfoJSON.SubName += ".hwasan"
2293 }
2294 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2295 moduleInfoJSON.SubName += ".scs"
2296 }
2297 }
2298 moduleInfoJSON.SubName += c.Properties.SubName
2299
2300 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2301 moduleInfoJSON.Uninstallable = true
2302 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002303 }
Wei Lia1aa2972024-06-21 13:08:51 -07002304
2305 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002306
Cole Faust96a692b2024-08-08 14:47:51 -07002307 if b, ok := c.compiler.(*baseCompiler); ok {
2308 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2309 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2310 c.hasProto = b.hasSrcExt(ctx, ".proto")
2311 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2312 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2313 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2314 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2315 }
2316
Yu Liuec7043d2024-11-05 18:22:20 +00002317 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002318 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002319 }
2320 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002321 ccObjectInfo.ObjFiles = objs.objFiles
2322 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002323 }
Yu Liu4f825132024-12-18 00:35:39 +00002324 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002325 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2326 }
2327
Yu Liuf6f85492025-01-13 21:02:36 +00002328 linkableInfo := CreateCommonLinkableInfo(ctx, c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002329 if lib, ok := c.linker.(VersionedInterface); ok {
2330 linkableInfo.StubsVersion = lib.StubsVersion()
Yu Liu8024b922024-12-20 23:31:32 +00002331 }
2332 if c.linker != nil {
2333 if library, ok := c.linker.(libraryInterface); ok {
2334 linkableInfo.Static = library.static()
Yu Liu8a8d5b42025-01-07 00:48:08 +00002335 linkableInfo.Shared = library.shared()
Yu Liu8024b922024-12-20 23:31:32 +00002336 linkableInfo.CoverageFiles = library.objs().coverageFiles
2337 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2338 }
2339 }
2340 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002341
Yu Liu323d77a2024-12-16 23:13:57 +00002342 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002343 IsPrebuilt: c.IsPrebuilt(),
2344 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
Yu Liu68a70b72025-01-08 22:54:44 +00002345 HasLlndkStubs: c.HasLlndkStubs(),
Yu Liu0a37d422025-02-13 02:05:00 +00002346 DataPaths: c.DataPaths(),
Yu Liu323d77a2024-12-16 23:13:57 +00002347 }
2348 if c.compiler != nil {
Cole Faustc9b88c92025-02-06 17:58:26 -08002349 cflags := c.compiler.baseCompilerProps().Cflags
Yu Liu323d77a2024-12-16 23:13:57 +00002350 ccInfo.CompilerInfo = &CompilerInfo{
2351 Srcs: c.compiler.(CompiledInterface).Srcs(),
Cole Faustc9b88c92025-02-06 17:58:26 -08002352 Cflags: cflags.GetOrDefault(ctx, nil),
Yu Liu323d77a2024-12-16 23:13:57 +00002353 AidlInterfaceInfo: AidlInterfaceInfo{
2354 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2355 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2356 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2357 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2358 },
2359 }
2360 switch decorator := c.compiler.(type) {
2361 case *libraryDecorator:
2362 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Cole Faustc9b88c92025-02-06 17:58:26 -08002363 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs.GetOrDefault(ctx, nil),
Yu Liu323d77a2024-12-16 23:13:57 +00002364 }
2365 }
2366 }
2367 if c.linker != nil {
Cole Faustc9b88c92025-02-06 17:58:26 -08002368 baseLinkerProps := c.linker.baseLinkerProps()
Yu Liu323d77a2024-12-16 23:13:57 +00002369 ccInfo.LinkerInfo = &LinkerInfo{
Cole Faustc9b88c92025-02-06 17:58:26 -08002370 WholeStaticLibs: baseLinkerProps.Whole_static_libs.GetOrDefault(ctx, nil),
2371 StaticLibs: baseLinkerProps.Static_libs.GetOrDefault(ctx, nil),
2372 SharedLibs: baseLinkerProps.Shared_libs.GetOrDefault(ctx, nil),
2373 HeaderLibs: baseLinkerProps.Header_libs.GetOrDefault(ctx, nil),
Yu Liu323d77a2024-12-16 23:13:57 +00002374 }
2375 switch decorator := c.linker.(type) {
2376 case *binaryDecorator:
2377 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2378 case *libraryDecorator:
Yu Liu88408122025-03-04 18:46:24 +00002379 lk := c.linker.(*libraryDecorator)
Yu Liu116610a2025-01-06 21:54:48 +00002380 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu88408122025-03-04 18:46:24 +00002381 InjectBsslHash: Bool(lk.Properties.Inject_bssl_hash),
2382 NdkSysrootPath: lk.ndkSysrootPath,
2383 VndkFileName: lk.getLibNameHelper(c.BaseModuleName(), true, false) + ".so",
Yu Liu116610a2025-01-06 21:54:48 +00002384 }
Yu Liu323d77a2024-12-16 23:13:57 +00002385 case *testBinary:
2386 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2387 Gtest: decorator.testDecorator.gtest(),
2388 }
2389 case *benchmarkDecorator:
2390 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2391 case *objectLinker:
Yu Liu95cef3a2025-02-25 00:54:20 +00002392 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{
2393 NdkSysrootPath: c.linker.(*objectLinker).ndkSysrootPath,
2394 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002395 case *stubDecorator:
2396 ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{}
Yu Liu88408122025-03-04 18:46:24 +00002397 case *prebuiltLibraryLinker:
2398 ccInfo.LinkerInfo.PrebuiltLibraryLinkerInfo = &PrebuiltLibraryLinkerInfo{
2399 VndkFileName: c.linker.(*prebuiltLibraryLinker).getLibNameHelper(
2400 c.BaseModuleName(), true, false) + ".so",
2401 }
Yu Liu323d77a2024-12-16 23:13:57 +00002402 }
Yu Liu8024b922024-12-20 23:31:32 +00002403
2404 if s, ok := c.linker.(SnapshotInterface); ok {
2405 ccInfo.SnapshotInfo = &SnapshotInfo{
2406 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2407 }
Yu Liuffe86322024-12-18 18:53:12 +00002408 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002409 if v, ok := c.linker.(VersionedInterface); ok {
2410 name := v.ImplementationModuleName(ctx.OtherModuleName(c))
Yu Liu68a70b72025-01-08 22:54:44 +00002411 ccInfo.LinkerInfo.ImplementationModuleName = &name
2412 }
Cole Faust5e1454a2025-03-11 15:55:59 -07002413
2414 c.linker.testSuiteInfo(ctx)
Yu Liuffe86322024-12-18 18:53:12 +00002415 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002416 if c.library != nil {
2417 ccInfo.LibraryInfo = &LibraryInfo{
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002418 BuildStubs: c.library.BuildStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002419 }
2420 }
Yu Liu2a815b62025-02-21 20:46:25 +00002421 if c.installer != nil {
2422 ccInfo.InstallerInfo = &InstallerInfo{}
2423 if installer, ok := c.installer.(*stubDecorator); ok {
2424 ccInfo.InstallerInfo.StubDecoratorInfo = &StubDecoratorInfo{
2425 HasAbiDump: installer.hasAbiDump,
2426 AbiDumpPath: installer.abiDumpPath,
2427 AbiDiffPaths: installer.abiDiffPaths,
Yu Liu95cef3a2025-02-25 00:54:20 +00002428 InstallPath: installer.installPath,
Yu Liu2a815b62025-02-21 20:46:25 +00002429 }
2430 }
2431 }
Yu Liu8024b922024-12-20 23:31:32 +00002432 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002433
mrziwangabdb2932024-06-18 12:43:41 -07002434 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002435
2436 if c.makeVarsInfo != nil {
2437 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2438 }
mrziwangabdb2932024-06-18 12:43:41 -07002439}
2440
Colin Crossb790b9c2025-03-19 14:12:09 -07002441func (c *Module) CleanupAfterBuildActions() {
2442 // Clear as much of Module as possible to reduce memory usage.
2443 c.generators = nil
2444 c.compiler = nil
2445 c.installer = nil
2446 c.features = nil
2447 c.coverage = nil
2448 c.fuzzer = nil
2449 c.sabi = nil
2450 c.lto = nil
2451 c.afdo = nil
2452 c.orderfile = nil
2453
2454 // TODO: these can be cleared after nativeBinaryInfoProperties and nativeLibInfoProperties are switched to
2455 // using providers.
2456 // c.linker = nil
2457 // c.stl = nil
2458 // c.sanitize = nil
2459 // c.library = nil
2460}
2461
Yu Liuf6f85492025-01-13 21:02:36 +00002462func CreateCommonLinkableInfo(ctx android.ModuleContext, mod VersionedLinkableInterface) *LinkableInfo {
Yu Liu0a37d422025-02-13 02:05:00 +00002463 info := &LinkableInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002464 StaticExecutable: mod.StaticExecutable(),
2465 HasStubsVariants: mod.HasStubsVariants(),
2466 OutputFile: mod.OutputFile(),
2467 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
Yu Liuf6f85492025-01-13 21:02:36 +00002468 CoverageOutputFile: mod.CoverageOutputFile(),
2469 Partition: mod.Partition(),
Yu Liu8024b922024-12-20 23:31:32 +00002470 IsStubs: mod.IsStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002471 CcLibrary: mod.CcLibrary(),
Yu Liu8024b922024-12-20 23:31:32 +00002472 CcLibraryInterface: mod.CcLibraryInterface(),
2473 RustLibraryInterface: mod.RustLibraryInterface(),
Yu Liu8024b922024-12-20 23:31:32 +00002474 IsLlndk: mod.IsLlndk(),
Yu Liuf6f85492025-01-13 21:02:36 +00002475 IsNdk: mod.IsNdk(ctx.Config()),
Yu Liu8024b922024-12-20 23:31:32 +00002476 HasNonSystemVariants: mod.HasNonSystemVariants(),
2477 SubName: mod.SubName(),
2478 InVendorOrProduct: mod.InVendorOrProduct(),
2479 InRamdisk: mod.InRamdisk(),
2480 OnlyInRamdisk: mod.OnlyInRamdisk(),
2481 InVendorRamdisk: mod.InVendorRamdisk(),
2482 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2483 InRecovery: mod.InRecovery(),
2484 OnlyInRecovery: mod.OnlyInRecovery(),
Yu Liu367827f2025-02-15 00:18:33 +00002485 InVendor: mod.InVendor(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002486 Installable: mod.Installable(),
Yu Liu97880e12025-01-07 19:03:34 +00002487 RelativeInstallPath: mod.RelativeInstallPath(),
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002488 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
Yu Liu0a37d422025-02-13 02:05:00 +00002489 RustApexExclude: mod.RustApexExclude(),
2490 Bootstrap: mod.Bootstrap(),
2491 Multilib: mod.Multilib(),
2492 ImplementationModuleNameForMake: mod.ImplementationModuleNameForMake(),
2493 Symlinks: mod.Symlinks(),
Yu Liu88408122025-03-04 18:46:24 +00002494 Header: mod.Header(),
2495 IsVndkPrebuiltLibrary: mod.IsVndkPrebuiltLibrary(),
Yu Liuec7043d2024-11-05 18:22:20 +00002496 }
Yu Liu8024b922024-12-20 23:31:32 +00002497
Yu Liu367827f2025-02-15 00:18:33 +00002498 vi := mod.VersionedInterface()
2499 if vi != nil {
2500 info.IsStubsImplementationRequired = vi.IsStubsImplementationRequired()
2501 info.APIListCoverageXMLPath = vi.GetAPIListCoverageXMLPath()
Yu Liu88408122025-03-04 18:46:24 +00002502 info.HasLLNDKStubs = vi.HasLLNDKStubs()
2503 info.IsLLNDKMovedToApex = vi.IsLLNDKMovedToApex()
2504 info.ImplementationModuleName = vi.ImplementationModuleName(mod.BaseModuleName())
Yu Liuec7043d2024-11-05 18:22:20 +00002505 }
Yu Liu367827f2025-02-15 00:18:33 +00002506
Yu Liu119d38c2025-02-25 22:25:11 +00002507 if !mod.PreventInstall() && fuzz.IsValid(ctx, mod.FuzzModuleStruct()) && mod.IsFuzzModule() {
2508 info.FuzzSharedLibraries = mod.FuzzSharedLibraries()
2509 fm := mod.FuzzPackagedModule()
2510 fuzz.SetFuzzPackagedModuleInfo(ctx, &fm)
2511 }
2512
Yu Liu367827f2025-02-15 00:18:33 +00002513 return info
mrziwangabdb2932024-06-18 12:43:41 -07002514}
2515
2516func (c *Module) setOutputFiles(ctx ModuleContext) {
2517 if c.outputFile.Valid() {
2518 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2519 } else {
2520 ctx.SetOutputFiles(android.Paths{}, "")
2521 }
2522 if c.linker != nil {
2523 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2524 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
Cole Faustd143f3e2025-02-24 16:18:18 -08002525 defaultDistFiles := c.linker.defaultDistFiles()
2526 if len(defaultDistFiles) > 0 {
2527 ctx.SetOutputFiles(defaultDistFiles, android.DefaultDistTag)
2528 }
mrziwangabdb2932024-06-18 12:43:41 -07002529 }
Wei Lia1aa2972024-06-21 13:08:51 -07002530}
2531
2532func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2533 // Dump metadata that can not be done in android/compliance-metadata.go
2534 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
Wei Li8ede4f72025-01-15 21:24:22 -08002535 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static() || ctx.ModuleType() == "cc_object"))
Wei Lia1aa2972024-06-21 13:08:51 -07002536 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2537
2538 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002539 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002540 staticDepNames := make([]string, 0, len(staticDeps))
2541 for _, dep := range staticDeps {
2542 staticDepNames = append(staticDepNames, dep.Name())
2543 }
Wei Li8ede4f72025-01-15 21:24:22 -08002544 // Process CrtBegin and CrtEnd as static libs
Yu Liu727204c2025-01-23 20:58:32 +00002545 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Wei Li8ede4f72025-01-15 21:24:22 -08002546 depName := ctx.OtherModuleName(dep)
2547 depTag := ctx.OtherModuleDependencyTag(dep)
2548 switch depTag {
2549 case CrtBeginDepTag:
2550 staticDepNames = append(staticDepNames, depName)
2551 case CrtEndDepTag:
2552 staticDepNames = append(staticDepNames, depName)
2553 }
2554 })
Wei Lia1aa2972024-06-21 13:08:51 -07002555
Wei Li8ede4f72025-01-15 21:24:22 -08002556 staticDepPaths := make([]string, 0, len(deps.StaticLibs)+len(deps.CrtBegin)+len(deps.CrtEnd))
Wei Lia1aa2972024-06-21 13:08:51 -07002557 for _, dep := range deps.StaticLibs {
2558 staticDepPaths = append(staticDepPaths, dep.String())
2559 }
Wei Li8ede4f72025-01-15 21:24:22 -08002560 for _, dep := range deps.CrtBegin {
2561 staticDepPaths = append(staticDepPaths, dep.String())
2562 }
2563 for _, dep := range deps.CrtEnd {
2564 staticDepPaths = append(staticDepPaths, dep.String())
2565 }
Wei Lia1aa2972024-06-21 13:08:51 -07002566 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2567 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2568
2569 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002570 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002571 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2572 for _, dep := range wholeStaticDeps {
2573 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2574 }
2575
2576 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2577 for _, dep := range deps.WholeStaticLibs {
2578 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2579 }
2580 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2581 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Wei Li8ede4f72025-01-15 21:24:22 -08002582
2583 // Header libs
2584 headerLibDeps := ctx.GetDirectDepsProxyWithTag(HeaderDepTag())
2585 headerLibDepNames := make([]string, 0, len(headerLibDeps))
2586 for _, dep := range headerLibDeps {
2587 headerLibDepNames = append(headerLibDepNames, dep.Name())
2588 }
2589 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.HEADER_LIBS, android.FirstUniqueStrings(headerLibDepNames))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002590}
2591
2592func (c *Module) maybeUnhideFromMake() {
2593 // If a lib is directly included in any of the APEXes or is not available to the
2594 // platform (which is often the case when the stub is provided as a prebuilt),
2595 // unhide the stubs variant having the latest version gets visible to make. In
2596 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2597 // force anything in the make world to link against the stubs library. (unless it
2598 // is explicitly referenced via .bootstrap suffix or the module is marked with
2599 // 'bootstrap: true').
2600 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002601 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002602 c.IsStubs() && !c.InVendorRamdisk() {
2603 c.Properties.HideFromMake = false // unhide
2604 // Note: this is still non-installable
2605 }
2606}
2607
Colin Cross8ff10582023-12-07 13:10:56 -08002608// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2609// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002610func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002611 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002612 // If the module has been specifically configure to not be installed then
2613 // hide from make as otherwise it will break when running inside make
2614 // as the output path to install will not be specified. Not all uninstallable
2615 // modules can be hidden from make as some are needed for resolving make side
2616 // dependencies.
2617 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002618 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002619 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002620 c.SkipInstall()
2621 }
2622
2623 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2624 // to allow using the outputs in a genrule.
2625 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002626 c.installer.install(ctx, c.outputFile.Path())
2627 if ctx.Failed() {
2628 return
Colin Crossca860ac2016-01-04 14:34:37 -08002629 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002630 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002631}
2632
Colin Cross0ea8ba82019-06-06 14:33:29 -07002633func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002634 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002635 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002636 }
Colin Crossca860ac2016-01-04 14:34:37 -08002637 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002638}
2639
Colin Crossca860ac2016-01-04 14:34:37 -08002640func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002641 for _, generator := range c.generators {
2642 generator.GeneratorInit(ctx)
2643 }
Colin Crossca860ac2016-01-04 14:34:37 -08002644 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002645 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002646 }
Colin Crossca860ac2016-01-04 14:34:37 -08002647 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002648 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002649 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002650 if c.stl != nil {
2651 c.stl.begin(ctx)
2652 }
Colin Cross16b23492016-01-06 14:41:07 -08002653 if c.sanitize != nil {
2654 c.sanitize.begin(ctx)
2655 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002656 if c.coverage != nil {
2657 c.coverage.begin(ctx)
2658 }
Yi Kong9723e332023-12-04 14:52:53 +09002659 if c.afdo != nil {
2660 c.afdo.begin(ctx)
2661 }
Stephen Craneba090d12017-05-09 15:44:35 -07002662 if c.lto != nil {
2663 c.lto.begin(ctx)
2664 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002665 if c.orderfile != nil {
2666 c.orderfile.begin(ctx)
2667 }
Dan Albert92fe7402020-07-15 13:33:30 -07002668 if ctx.useSdk() && c.IsSdkVariant() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002669 version, err := NativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002670 if err != nil {
2671 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002672 c.Properties.Sdk_version = nil
2673 } else {
2674 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002675 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002676 }
Colin Crossca860ac2016-01-04 14:34:37 -08002677}
2678
Colin Cross37047f12016-12-13 17:06:13 -08002679func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002680 deps := Deps{}
2681
Joe Onorato37f900c2023-07-18 16:58:16 -07002682 for _, generator := range c.generators {
2683 deps = generator.GeneratorDeps(ctx, deps)
2684 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002685 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002686 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002687 }
2688 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002689 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002690 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002691 if c.stl != nil {
2692 deps = c.stl.deps(ctx, deps)
2693 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002694 if c.coverage != nil {
2695 deps = c.coverage.deps(ctx, deps)
2696 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002697
Colin Crossb6715442017-10-24 11:13:31 -07002698 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2699 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2700 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2701 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2702 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2703 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002704 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002705 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002706
Colin Cross516c5452024-10-28 13:45:21 -07002707 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2708 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2709 }
2710
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002711 for _, lib := range deps.ReexportSharedLibHeaders {
2712 if !inList(lib, deps.SharedLibs) {
2713 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2714 }
2715 }
2716
2717 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002718 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2719 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 -07002720 }
2721 }
2722
Colin Cross5950f382016-12-13 12:50:57 -08002723 for _, lib := range deps.ReexportHeaderLibHeaders {
2724 if !inList(lib, deps.HeaderLibs) {
2725 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2726 }
2727 }
2728
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002729 for _, gen := range deps.ReexportGeneratedHeaders {
2730 if !inList(gen, deps.GeneratedHeaders) {
2731 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2732 }
2733 }
2734
Colin Crossc99deeb2016-04-11 15:06:20 -07002735 return deps
2736}
2737
Colin Cross516c5452024-10-28 13:45:21 -07002738func checkConflictingExplicitVersions(libs []string) error {
2739 withoutVersion := func(s string) string {
2740 name, _ := StubsLibNameAndVersion(s)
2741 return name
2742 }
2743 var errs []error
2744 for i, lib := range libs {
2745 libName := withoutVersion(lib)
2746 libsToCompare := libs[i+1:]
2747 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2748 return withoutVersion(s) == libName
2749 })
2750 if j >= 0 {
2751 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2752 lib, libsToCompare[j]))
2753 }
2754 }
2755 return errors.Join(errs...)
2756}
2757
Dan Albert7e9d2952016-08-04 13:02:36 -07002758func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002759 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002760 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002761 moduleContextImpl: moduleContextImpl{
2762 mod: c,
2763 },
2764 }
2765 ctx.ctx = ctx
2766
Colin Crossca860ac2016-01-04 14:34:37 -08002767 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002768}
2769
Jiyong Park7ed9de32018-10-15 22:25:07 +09002770// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002771func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002772 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2773 version := name[sharp+1:]
2774 libname := name[:sharp]
2775 return libname, version
2776 }
2777 return name, ""
2778}
2779
Dan Albert92fe7402020-07-15 13:33:30 -07002780func GetCrtVariations(ctx android.BottomUpMutatorContext,
2781 m LinkableInterface) []blueprint.Variation {
2782 if ctx.Os() != android.Android {
2783 return nil
2784 }
2785 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002786 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2787 minSdkVersion := m.MinSdkVersion()
2788 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2789 minSdkVersion = m.SdkVersion()
2790 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002791 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2792 if err != nil {
2793 ctx.PropertyErrorf("min_sdk_version", err.Error())
2794 }
Colin Cross363ec762023-01-13 13:45:14 -08002795
2796 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002797 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002798 if apiLevel.LessThan(minApiForArch) {
2799 apiLevel = minApiForArch
2800 }
2801
Dan Albert92fe7402020-07-15 13:33:30 -07002802 return []blueprint.Variation{
2803 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002804 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002805 }
2806 }
2807 return []blueprint.Variation{
2808 {Mutator: "sdk", Variation: ""},
2809 }
2810}
2811
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002812func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2813 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002814
2815 variations = append([]blueprint.Variation(nil), variations...)
2816
Liz Kammer23942242022-04-08 15:41:00 -04002817 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002818 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002819 if version == "impl" {
2820 version = ""
2821 }
Colin Crosse7257d22020-09-24 09:56:18 -07002822 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002823 if tag, ok := depTag.(libraryDependencyTag); ok {
2824 tag.explicitlyVersioned = true
Colin Crossbd930bc2025-02-03 12:17:42 -08002825 if version == "" {
2826 tag.explicitlyImpl = true
2827 }
Colin Crossafcdce82024-10-22 13:59:33 -07002828 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2829 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2830 // the modified copy to depTag.
2831 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002832 } else {
2833 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2834 }
Colin Crosse7257d22020-09-24 09:56:18 -07002835 }
Colin Crosse7257d22020-09-24 09:56:18 -07002836
Colin Cross0de8a1e2020-09-18 14:15:30 -07002837 if far {
2838 ctx.AddFarVariationDependencies(variations, depTag, name)
2839 } else {
2840 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002841 }
2842}
2843
Kiyoung Kim487689e2022-07-26 09:48:22 +09002844func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2845 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002846 return snapshot
2847 }
2848
2849 return lib
2850}
2851
Kiyoung Kim37693d02024-04-04 09:56:15 +09002852// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002853// of names:
2854//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002855// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002856//
2857// For each of these, it adds the name of the ndk_library module to the list of
2858// variant libs.
2859//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002860// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002861//
2862// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002863//
2864// The caller can then know to add the variantLibs dependencies differently from the
2865// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002866func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002867 variantLibs = []string{}
2868
2869 nonvariantLibs = []string{}
2870 for _, entry := range list {
2871 // strip #version suffix out
2872 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002873 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002874 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002875 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002876 nonvariantLibs = append(nonvariantLibs, entry)
2877 }
2878 }
2879 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002880
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002881}
2882
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002883func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2884 nonVariantLibs := []string{}
2885 variantLibs := []string{}
2886
2887 for _, lib := range libs {
2888 replaceLibName := GetReplaceModuleName(lib, replaceList)
2889 if replaceLibName == lib {
2890 // Do not handle any libs which are not in API imports
2891 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2892 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2893 variantLibs = append(variantLibs, replaceLibName)
2894 } else {
2895 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2896 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002897 }
2898
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002899 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002900}
2901
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002902func (c *Module) shouldUseApiSurface() bool {
2903 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2904 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2905 // LLNDK Variant
2906 return true
2907 }
2908
2909 if c.Properties.IsSdkVariant {
2910 // NDK Variant
2911 return true
2912 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002913 }
2914
2915 return false
2916}
2917
Colin Cross1e676be2016-10-12 14:38:15 -07002918func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002919 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002920 return
2921 }
2922
Colin Cross37047f12016-12-13 17:06:13 -08002923 ctx := &depsContext{
2924 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002925 moduleContextImpl: moduleContextImpl{
2926 mod: c,
2927 },
2928 }
2929 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002930
Colin Crossc99deeb2016-04-11 15:06:20 -07002931 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002932
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002933 apiNdkLibs := []string{}
2934 apiLateNdkLibs := []string{}
2935
Yo Chiang219968c2020-09-22 18:45:04 +08002936 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2937
Dan Albert914449f2016-06-17 16:45:24 -07002938 variantNdkLibs := []string{}
2939 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002940 if ctx.Os() == android.Android {
Chirayu Desai5332d5e2021-01-30 20:08:32 +05302941 rewriteHeaderLibs := func(list []string) (newHeaderLibs []string) {
2942 newHeaderLibs = []string{}
2943 for _, entry := range list {
2944 // Replace device_kernel_headers with generated_kernel_headers
2945 // for inline kernel building
Nolen Johnson576df382021-12-09 18:29:31 -05002946 if entry == "device_kernel_headers" || entry == "qti_kernel_headers" {
Chirayu Desai7d771b72021-12-10 23:28:28 +05302947 if (ctx.Config().Getenv("INLINE_KERNEL_BUILDING") == "true") {
2948 newHeaderLibs = append(newHeaderLibs, "generated_kernel_headers")
2949 continue
2950 }
Chirayu Desai5332d5e2021-01-30 20:08:32 +05302951 }
2952 newHeaderLibs = append(newHeaderLibs, entry)
2953 }
2954 return newHeaderLibs
2955 }
2956 deps.HeaderLibs = rewriteHeaderLibs(deps.HeaderLibs)
2957
Kiyoung Kim37693d02024-04-04 09:56:15 +09002958 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2959 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2960 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002961 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002962
Colin Cross32ec36c2016-12-15 07:39:51 -08002963 for _, lib := range deps.HeaderLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07002964 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002965 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002966 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002967 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002968
Spandan Das73bcafc2022-08-18 23:26:00 +00002969 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002970 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2971 if variationExists {
2972 actx.AddVariationDependencies(nil, depTag, lib)
2973 } else {
2974 // dependencies to ndk_headers fall here as ndk_headers do not have
2975 // any variants.
2976 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2977 }
Spandan Dasff665182024-09-11 18:48:44 +00002978 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002979 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002980 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002981 } else {
2982 actx.AddVariationDependencies(nil, depTag, lib)
2983 }
2984 }
2985
Dan Albertf1d14c72020-07-30 14:32:55 -07002986 if c.isNDKStubLibrary() {
2987 // NDK stubs depend on their implementation because the ABI dumps are
2988 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002989
Spandan Das8b08aea2023-03-14 19:29:34 +00002990 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2991 c.ImageVariation(),
2992 blueprint.Variation{Mutator: "link", Variation: "shared"},
2993 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002994 }
2995
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002996 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2997 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2998 c.Target().NativeBridge == android.NativeBridgeDisabled {
2999 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00003000 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003001 llndkHeaderLibTag,
3002 deps.LlndkHeaderLibs...)
3003 }
3004
Jiyong Park5d1598f2019-02-25 22:14:17 +09003005 for _, lib := range deps.WholeStaticLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07003006 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09003007
Jiyong Park5d1598f2019-02-25 22:14:17 +09003008 actx.AddVariationDependencies([]blueprint.Variation{
3009 {Mutator: "link", Variation: "static"},
3010 }, depTag, lib)
3011 }
3012
Dan Willemsen490a8dc2016-06-06 18:22:19 -07003013 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003014 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross6e511a92020-07-27 21:26:48 -07003015 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003016
Dan Willemsen490a8dc2016-06-06 18:22:19 -07003017 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07003018 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07003019 }
Jiyong Parke3867542020-12-03 17:28:25 +09003020 if inList(lib, deps.ExcludeLibsForApex) {
3021 depTag.excludeInApex = true
3022 }
Dan Willemsen59339a22018-07-22 21:18:45 -07003023 actx.AddVariationDependencies([]blueprint.Variation{
3024 {Mutator: "link", Variation: "static"},
3025 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07003026 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003027
Jooyung Han75568392020-03-20 04:29:24 +09003028 // staticUnwinderDep is treated as staticDep for Q apexes
3029 // so that native libraries/binaries are linked with static unwinder
3030 // because Q libc doesn't have unwinder APIs
3031 if deps.StaticUnwinderIfLegacy {
Colin Cross6e511a92020-07-27 21:26:48 -07003032 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003033 actx.AddVariationDependencies([]blueprint.Variation{
3034 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09003035 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003036 }
3037
Jiyong Park7ed9de32018-10-15 22:25:07 +09003038 // shared lib names without the #version suffix
3039 var sharedLibNames []string
3040
Dan Willemsen490a8dc2016-06-06 18:22:19 -07003041 for _, lib := range deps.SharedLibs {
Colin Cross6e511a92020-07-27 21:26:48 -07003042 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07003043 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07003044 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07003045 }
Jiyong Parke3867542020-12-03 17:28:25 +09003046 if inList(lib, deps.ExcludeLibsForApex) {
3047 depTag.excludeInApex = true
3048 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003049 if inList(lib, deps.ExcludeLibsForNonApex) {
3050 depTag.excludeInNonApex = true
3051 }
Inseob Kimc0907f12019-02-08 21:00:45 +09003052
Jiyong Park73c54ee2019-10-22 20:31:18 +09003053 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09003054 sharedLibNames = append(sharedLibNames, name)
3055
Colin Crosse7257d22020-09-24 09:56:18 -07003056 variations := []blueprint.Variation{
3057 {Mutator: "link", Variation: "shared"},
3058 }
Spandan Dasff665182024-09-11 18:48:44 +00003059 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07003060 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003061
Colin Crossfe9acfe2021-06-14 16:13:03 -07003062 for _, lib := range deps.LateStaticLibs {
3063 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
3064 actx.AddVariationDependencies([]blueprint.Variation{
3065 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09003066 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07003067 }
3068
Colin Cross3e5e7782022-06-17 22:17:05 +00003069 for _, lib := range deps.UnexportedStaticLibs {
3070 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
3071 actx.AddVariationDependencies([]blueprint.Variation{
3072 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09003073 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00003074 }
3075
Jiyong Park7ed9de32018-10-15 22:25:07 +09003076 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09003077 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09003078 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
3079 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
3080 // linking against both the stubs lib and the non-stubs lib at the same time.
3081 continue
3082 }
Colin Cross6e511a92020-07-27 21:26:48 -07003083 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07003084 variations := []blueprint.Variation{
3085 {Mutator: "link", Variation: "shared"},
3086 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003087 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09003088 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003089
Dan Willemsen59339a22018-07-22 21:18:45 -07003090 actx.AddVariationDependencies([]blueprint.Variation{
3091 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04003092 }, dataLibDepTag, deps.DataLibs...)
3093
Colin Crossc8caa062021-09-24 16:50:14 -07003094 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
3095
Chris Parsons79d66a52020-06-05 17:26:16 -04003096 actx.AddVariationDependencies([]blueprint.Variation{
3097 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07003098 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08003099
Colin Cross68861832016-07-08 10:41:41 -07003100 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003101
3102 for _, gen := range deps.GeneratedHeaders {
3103 depTag := genHeaderDepTag
3104 if inList(gen, deps.ReexportGeneratedHeaders) {
3105 depTag = genHeaderExportDepTag
3106 }
3107 actx.AddDependency(c, depTag, gen)
3108 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003109
Cole Faust65cb40a2024-10-21 15:41:42 -07003110 for _, gen := range deps.DeviceFirstGeneratedHeaders {
3111 depTag := genHeaderDepTag
3112 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
3113 }
3114
Dan Albert92fe7402020-07-15 13:33:30 -07003115 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07003116 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07003117 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07003118 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09003119 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08003120 }
Colin Crossc465efd2021-06-11 18:00:04 -07003121 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07003122 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09003123 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07003124 }
Dan Willemsena0790e32018-10-12 00:24:23 -07003125 if deps.DynamicLinker != "" {
3126 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07003127 }
Dan Albert914449f2016-06-17 16:45:24 -07003128
3129 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07003130
3131 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07003132 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07003133 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07003134 {Mutator: "link", Variation: "shared"},
3135 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003136 actx.AddVariationDependencies([]blueprint.Variation{
3137 {Mutator: "version", Variation: version},
3138 {Mutator: "link", Variation: "shared"},
3139 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07003140
3141 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07003142 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07003143 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07003144 {Mutator: "link", Variation: "shared"},
3145 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003146 actx.AddVariationDependencies([]blueprint.Variation{
3147 {Mutator: "version", Variation: version},
3148 {Mutator: "link", Variation: "shared"},
3149 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08003150
Vinh Tran367d89d2023-04-28 11:21:25 -04003151 if len(deps.AidlLibs) > 0 {
3152 actx.AddDependency(
3153 c,
3154 aidlLibraryTag,
3155 deps.AidlLibs...,
3156 )
3157 }
3158
Colin Cross6362e272015-10-29 15:25:03 -07003159}
Colin Cross21b9a242015-03-24 14:15:58 -07003160
Colin Crosse40b4ea2018-10-02 22:25:58 -07003161func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07003162 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07003163 c.beginMutator(ctx)
3164 }
3165}
3166
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003167// Whether a module can link to another module, taking into
3168// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09003169func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07003170 tag blueprint.DependencyTag) {
3171
3172 switch t := tag.(type) {
3173 case dependencyTag:
3174 if t != vndkExtDepTag {
3175 return
3176 }
3177 case libraryDependencyTag:
3178 default:
3179 return
3180 }
3181
Ivan Lozanof9e21722020-12-02 09:00:51 -05003182 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003183 // Host code is not restricted
3184 return
3185 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003186
Ivan Lozano52767be2019-10-18 14:49:46 -07003187 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003188 // Platform code can link to anything
3189 return
3190 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08003191 if from.InRamdisk() {
3192 // Ramdisk code is not NDK
3193 return
3194 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003195 if from.InVendorRamdisk() {
3196 // Vendor ramdisk code is not NDK
3197 return
3198 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003199 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09003200 // Recovery code is not NDK
3201 return
3202 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003203 // Change this to LinkableInterface if Rust gets NDK support, which stubDecorators are for
Colin Cross31076b32020-10-23 17:22:06 -07003204 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003205 if c.StubDecorator() {
3206 // These aren't real libraries, but are the stub shared libraries that are included in
3207 // the NDK.
3208 return
3209 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003210 }
Logan Chien834b9a62019-01-14 15:39:03 +08003211
Ivan Lozano52767be2019-10-18 14:49:46 -07003212 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003213 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3214 // to link to libc++ (non-NDK and without sdk_version).
3215 return
3216 }
3217
Ivan Lozano52767be2019-10-18 14:49:46 -07003218 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003219 // NDK code linking to platform code is never okay.
3220 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003221 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003222 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003223 }
3224
3225 // At this point we know we have two NDK libraries, but we need to
3226 // check that we're not linking against anything built against a higher
3227 // API level, as it is only valid to link against older or equivalent
3228 // APIs.
3229
Inseob Kim01a28722018-04-11 09:48:45 +09003230 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003231 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003232 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003233 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003234 // Current can't be linked against by anything else.
3235 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003236 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003237 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003238 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003239 if err != nil {
3240 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003241 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003242 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003243 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003244 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003245 if err != nil {
3246 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003247 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003248 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003249 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003250
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003251 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003252 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003253 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003254 }
3255 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003256 }
Dan Albert202fe492017-12-15 13:56:59 -08003257
3258 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003259 fromStl := from.SelectedStl()
3260 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003261 if fromStl == "" || toStl == "" {
3262 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003263 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003264 // We can be permissive with the system "STL" since it is only the C++
3265 // ABI layer, but in the future we should make sure that everyone is
3266 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003267 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003268 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003269 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3270 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003271 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003272}
3273
Jooyung Han479ca172020-10-19 18:51:07 +09003274func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3275 if c, ok := ctx.Module().(*Module); ok {
3276 ctx.VisitDirectDeps(func(dep android.Module) {
3277 depTag := ctx.OtherModuleDependencyTag(dep)
3278 ccDep, ok := dep.(LinkableInterface)
3279 if ok {
3280 checkLinkType(ctx, c, ccDep, depTag)
3281 }
3282 })
3283 }
3284}
3285
Jiyong Park5fb8c102018-04-09 12:03:06 +09003286// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003287// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3288// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003289// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003290func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003291 check := func(child, parent android.Module) bool {
3292 to, ok := child.(*Module)
3293 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003294 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003295 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003296
Jooyung Hana70f0672019-01-18 15:20:43 +09003297 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3298 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003299 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003300
Jiyong Park0474e1f2021-01-14 14:26:06 +09003301 // These dependencies are not excercised at runtime. Tracking these will give us
3302 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003303 depTag := ctx.OtherModuleDependencyTag(child)
3304 if IsHeaderDepTag(depTag) {
3305 return false
3306 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003307 if depTag == staticVariantTag {
3308 return false
3309 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003310 if depTag == StubImplDepTag {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003311 return false
3312 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003313 if depTag == android.RequiredDepTag {
3314 return false
3315 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003316
Justin Yun63e9ec72020-10-29 16:49:43 +09003317 // Even if target lib has no vendor variant, keep checking dependency
3318 // graph in case it depends on vendor_available or product_available
3319 // but not double_loadable transtively.
3320 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003321 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003322 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003323
Jiyong Park0474e1f2021-01-14 14:26:06 +09003324 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3325 // one.
3326 if Bool(to.VendorProperties.Double_loadable) {
3327 return true
3328 }
3329
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003330 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003331 return false
3332 }
3333
Jooyung Hana70f0672019-01-18 15:20:43 +09003334 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3335 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003336 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003337 return false
3338 }
3339 if module, ok := ctx.Module().(*Module); ok {
3340 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003341 if lib.HasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003342 ctx.WalkDeps(check)
3343 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003344 }
3345 }
3346}
3347
Yu Liue4312402023-01-18 09:15:31 -08003348func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3349 // For the dependency from platform to apex, use the latest stubs
3350 apexSdkVersion := android.FutureApiLevel
3351 if !apexInfo.IsForPlatform() {
3352 apexSdkVersion = apexInfo.MinSdkVersion
3353 }
3354
3355 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3356 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3357 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3358 // (b/144430859)
3359 apexSdkVersion = android.FutureApiLevel
3360 }
3361
3362 return apexSdkVersion
3363}
3364
Colin Crossc99deeb2016-04-11 15:06:20 -07003365// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003366func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003367 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003368
Colin Cross0de8a1e2020-09-18 14:15:30 -07003369 var directStaticDeps []StaticLibraryInfo
3370 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003371
Colin Cross0de8a1e2020-09-18 14:15:30 -07003372 reexportExporter := func(exporter FlagExporterInfo) {
3373 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3374 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3375 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3376 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3377 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003378 }
3379
Colin Crossff694a82023-12-13 15:54:49 -08003380 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003381 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003382
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003383 skipModuleList := map[string]bool{}
3384
Yu Liu8024b922024-12-20 23:31:32 +00003385 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003386 depName := ctx.OtherModuleName(dep)
3387 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003388
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003389 if _, ok := skipModuleList[depName]; ok {
3390 // skip this module because original module or API imported module matching with this should be used instead.
3391 return
3392 }
3393
Yu Liu8024b922024-12-20 23:31:32 +00003394 var ccInfo *CcInfo
3395 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3396 if hasCcInfo {
3397 ccInfo = v
3398 }
3399 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003400 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003401 if !hasCcInfo {
3402 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3403 }
3404 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003405 return
3406 }
3407
Vinh Tran367d89d2023-04-28 11:21:25 -04003408 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003409 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003410 depPaths.AidlLibraryInfos = append(
3411 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003412 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003413 )
3414 }
3415 }
3416
Yu Liu8024b922024-12-20 23:31:32 +00003417 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003418 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003419 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003420 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003421 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003422 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003423 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003424 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003425 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003426 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003427 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003428 // Support exported headers from a generated_sources dependency
3429 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003430 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003431 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003432 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003433 genRule.GeneratedDeps...)
3434 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003435 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003436 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003437 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003438 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003439 genRule.GeneratedSourceFiles...)
3440 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003441 // 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 +09003442 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003443 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003444 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003445 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003446 }
Colin Crosscef792e2021-06-11 18:01:26 -07003447 case CrtBeginDepTag:
3448 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3449 case CrtEndDepTag:
3450 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003451 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003452 return
3453 }
3454
Colin Crossfe17f6f2019-03-28 19:30:56 -07003455 if depTag == android.ProtoPluginDepTag {
3456 return
3457 }
3458
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003459 if depTag == android.RequiredDepTag {
3460 return
3461 }
3462
Yu Liuf22120f2025-03-13 18:36:35 +00003463 commonInfo := android.OtherModulePointerProviderOrDefault(ctx, dep, android.CommonModuleInfoProvider)
Yu Liu8024b922024-12-20 23:31:32 +00003464 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003465 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 -07003466 return
3467 }
Yu Liu8024b922024-12-20 23:31:32 +00003468 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003469 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003470 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003471 return
3472 }
3473
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003474 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003475 // Skip reused objects for stub libraries, they use their own stub object file instead.
3476 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3477 // version mutator, so the stubs variant is created from the shared variant that
3478 // already has the reuseObjTag dependency on the static variant.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003479 if !c.library.BuildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003480 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003481 objs := staticAnalogue.ReuseObjects
3482 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003483 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003484 reexportExporter(depExporterInfo)
3485 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003486 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003487 }
3488
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003489 if depTag == llndkHeaderLibTag {
3490 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3491 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3492 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3493 }
3494
Yu Liu8024b922024-12-20 23:31:32 +00003495 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003496
3497 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3498 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003499 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003500 return
3501 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003502
Jiyong Parke3867542020-12-03 17:28:25 +09003503 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3504 return
3505 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003506 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3507 return
3508 }
Jiyong Parke3867542020-12-03 17:28:25 +09003509
Colin Cross313aa542023-12-13 13:47:44 -08003510 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003511
Colin Cross6e511a92020-07-27 21:26:48 -07003512 var ptr *android.Paths
3513 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003514
Colin Cross6e511a92020-07-27 21:26:48 -07003515 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003516
Colin Cross6e511a92020-07-27 21:26:48 -07003517 switch {
3518 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003519 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003520 if !ctx.Config().AllowMissingDependencies() {
3521 ctx.ModuleErrorf("module %q is not a header library", depName)
3522 } else {
3523 ctx.AddMissingDependencies([]string{depName})
3524 }
3525 return
3526 }
Colin Cross6e511a92020-07-27 21:26:48 -07003527 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003528 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003529 if !ctx.Config().AllowMissingDependencies() {
3530 ctx.ModuleErrorf("module %q is not a shared library", depName)
3531 } else {
3532 ctx.AddMissingDependencies([]string{depName})
3533 }
3534 return
3535 }
Jiyong Parke3867542020-12-03 17:28:25 +09003536
Jiyong Park7d55b612021-06-11 17:22:09 +09003537 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3538 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003539
Jiyong Park1ad8e162020-12-01 23:40:09 +09003540 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3541 // linkFile, depFile, and ptr.
3542 if c.IsStubs() {
3543 break
3544 }
3545
Colin Cross0de8a1e2020-09-18 14:15:30 -07003546 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3547 depFile = sharedLibraryInfo.TableOfContents
3548
Colin Crossb614cd42024-10-11 12:52:21 -07003549 if !sharedLibraryInfo.IsStubs {
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003550 // TODO(b/362509506): remove this additional check once all apex_exclude uses are switched to stubs.
3551 if !linkableInfo.RustApexExclude {
3552 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3553 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3554 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3555 }
Colin Crossb614cd42024-10-11 12:52:21 -07003556 }
3557 }
3558
Colin Cross6e511a92020-07-27 21:26:48 -07003559 ptr = &depPaths.SharedLibs
3560 switch libDepTag.Order {
3561 case earlyLibraryDependency:
3562 ptr = &depPaths.EarlySharedLibs
3563 depPtr = &depPaths.EarlySharedLibsDeps
3564 case normalLibraryDependency:
3565 ptr = &depPaths.SharedLibs
3566 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003567 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003568 case lateLibraryDependency:
3569 ptr = &depPaths.LateSharedLibs
3570 depPtr = &depPaths.LateSharedLibsDeps
3571 default:
3572 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003573 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003574
Colin Cross6e511a92020-07-27 21:26:48 -07003575 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003576 if linkableInfo.RustLibraryInterface {
3577 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003578 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3579 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3580 if libDepTag.wholeStatic {
3581 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3582 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003583
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003584 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3585 // exported functions from the rust generated staticlib still exported.
3586 if c.CcLibrary() && c.Shared() {
3587 c.WholeRustStaticlib = true
3588 }
Colin Cross6e511a92020-07-27 21:26:48 -07003589 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003590
Colin Cross6e511a92020-07-27 21:26:48 -07003591 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003592 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3593 if !isStaticLib {
3594 if !ctx.Config().AllowMissingDependencies() {
3595 ctx.ModuleErrorf("module %q is not a static library", depName)
3596 } else {
3597 ctx.AddMissingDependencies([]string{depName})
3598 }
3599 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003600 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003601
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003602 // Stubs lib doesn't link to the static lib dependencies. Don't set
3603 // linkFile, depFile, and ptr.
3604 if c.IsStubs() {
3605 break
3606 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003607
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003608 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3609 if libDepTag.wholeStatic {
3610 ptr = &depPaths.WholeStaticLibs
3611 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3612 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3613 } else {
3614 // This case normally catches prebuilt static
3615 // libraries, but it can also occur when
3616 // AllowMissingDependencies is on and the
3617 // dependencies has no sources of its own
3618 // but has a whole_static_libs dependency
3619 // on a missing library. We want to depend
3620 // on the .a file so that there is something
3621 // in the dependency tree that contains the
3622 // error rule for the missing transitive
3623 // dependency.
3624 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3625 }
3626 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3627 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3628 } else {
3629 switch libDepTag.Order {
3630 case earlyLibraryDependency:
3631 panic(fmt.Errorf("early static libs not supported"))
3632 case normalLibraryDependency:
3633 // static dependencies will be handled separately so they can be ordered
3634 // using transitive dependencies.
3635 ptr = nil
3636 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3637 case lateLibraryDependency:
3638 ptr = &depPaths.LateStaticLibs
3639 default:
3640 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3641 }
3642 }
3643
3644 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3645 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3646
3647 if libDepTag.unexportedSymbols {
3648 depPaths.LdFlags = append(depPaths.LdFlags,
3649 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3650 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003651 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003652 }
3653
Yu Liu8024b922024-12-20 23:31:32 +00003654 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3655 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003656 ctx.ModuleErrorf("module %q not a static library", depName)
3657 return
3658 }
Logan Chien43d34c32017-12-20 01:17:32 +08003659
Colin Cross6e511a92020-07-27 21:26:48 -07003660 // When combining coverage files for shared libraries and executables, coverage files
3661 // in static libraries act as if they were whole static libraries. The same goes for
3662 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003663 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003664 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003665 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003666 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003667 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003668 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003669 // Handle non-CC modules here
3670 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003671 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003672 }
3673 }
3674
Colin Cross6e511a92020-07-27 21:26:48 -07003675 if ptr != nil {
3676 if !linkFile.Valid() {
3677 if !ctx.Config().AllowMissingDependencies() {
3678 ctx.ModuleErrorf("module %q missing output file", depName)
3679 } else {
3680 ctx.AddMissingDependencies([]string{depName})
3681 }
3682 return
3683 }
3684 *ptr = append(*ptr, linkFile.Path())
3685 }
3686
3687 if depPtr != nil {
3688 dep := depFile
3689 if !dep.Valid() {
3690 dep = linkFile
3691 }
3692 *depPtr = append(*depPtr, dep.Path())
3693 }
3694
Colin Cross0de8a1e2020-09-18 14:15:30 -07003695 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3696 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3697 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3698 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003699 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3700
3701 // Only re-export RustRlibDeps for cc static libs
3702 if c.static() {
3703 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3704 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003705
3706 if libDepTag.reexportFlags {
3707 reexportExporter(depExporterInfo)
3708 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3709 // Re-exported shared library headers must be included as well since they can help us with type information
3710 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003711 c.sabi.Properties.ReexportedIncludes = append(
3712 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003713 c.sabi.Properties.ReexportedSystemIncludes = append(
3714 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003715 }
3716
Yu Liuf22120f2025-03-13 18:36:35 +00003717 makeLibName := MakeLibName(ccInfo, linkableInfo, commonInfo, commonInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003718 switch {
3719 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003720 c.Properties.AndroidMkHeaderLibs = append(
3721 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003722 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003723 // Note: the order of libs in this list is not important because
3724 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003725 c.Properties.AndroidMkSharedLibs = append(
3726 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003727 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003728 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003729 if libDepTag.wholeStatic {
3730 c.Properties.AndroidMkWholeStaticLibs = append(
3731 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3732 } else {
3733 c.Properties.AndroidMkStaticLibs = append(
3734 c.Properties.AndroidMkStaticLibs, makeLibName)
3735 }
Colin Cross6e511a92020-07-27 21:26:48 -07003736 }
3737 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003738 } else if !c.IsStubs() {
3739 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3740
Colin Cross6e511a92020-07-27 21:26:48 -07003741 switch depTag {
3742 case runtimeDepTag:
3743 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liuf22120f2025-03-13 18:36:35 +00003744 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, commonInfo,
Yu Liu0a37d422025-02-13 02:05:00 +00003745 commonInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003746 case objDepTag:
3747 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3748 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003749 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003750 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003751 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003752 case dynamicLinkerDepTag:
3753 depPaths.DynamicLinker = linkFile
3754 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003755 }
Colin Crossca860ac2016-01-04 14:34:37 -08003756 })
3757
Jeff Gaston294356f2017-09-27 17:05:30 -07003758 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003759 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3760 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3761 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003762
Colin Crossdd84e052017-05-17 13:44:16 -07003763 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003764 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003765 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3766 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003767 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003768 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3769
Jiyong Park74955042019-10-22 20:19:51 +09003770 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3771 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003772 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003773 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003774 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003775 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003776
3777 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003778 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003779 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003780 }
Colin Crossdd84e052017-05-17 13:44:16 -07003781
Colin Crossca860ac2016-01-04 14:34:37 -08003782 return depPaths
3783}
3784
Yu Liuf6f85492025-01-13 21:02:36 +00003785func ShouldUseStubForApex(ctx android.ModuleContext, parent android.Module, dep android.ModuleProxy) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003786 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003787 bootstrap := false
Yu Liue472c1d2025-02-26 20:13:04 +00003788 if android.EqualModules(ctx.Module(), parent) {
Yu Liuf6f85492025-01-13 21:02:36 +00003789 if linkable, ok := parent.(LinkableInterface); !ok {
3790 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3791 } else {
3792 inVendorOrProduct = linkable.InVendorOrProduct()
3793 bootstrap = linkable.Bootstrap()
3794 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003795 } else {
Yu Liuf6f85492025-01-13 21:02:36 +00003796 if linkable, ok := android.OtherModuleProvider(ctx, parent, LinkableInfoProvider); !ok {
3797 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3798 } else {
3799 inVendorOrProduct = linkable.InVendorOrProduct
3800 bootstrap = linkable.Bootstrap
3801 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003802 }
3803
Spandan Das10c41362024-12-03 01:33:09 +00003804 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003805
3806 useStubs := false
3807
Yu Liu8024b922024-12-20 23:31:32 +00003808 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003809 if !apexInfo.IsForPlatform() {
3810 // For platform libraries, use current version of LLNDK
3811 // If this is for use_vendor apex we will apply the same rules
3812 // of apex sdk enforcement below to choose right version.
3813 useStubs = true
3814 }
3815 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3816 // If not building for APEX or the containing APEX allows the use of
3817 // platform APIs, use stubs only when it is from an APEX (and not from
3818 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3819 // bootstrap modules, always link to non-stub variant
Yu Liuf22120f2025-03-13 18:36:35 +00003820 isNotInPlatform := android.OtherModulePointerProviderOrDefault(ctx, dep, android.CommonModuleInfoProvider).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003821
Spandan Dasff665182024-09-11 18:48:44 +00003822 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003823 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003824 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3825 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003826 }
3827
3828 return useStubs
3829}
3830
3831// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3832// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3833// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3834// has different level of updatability. For example, if a library foo in an APEX depends on a
3835// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3836// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3837// same APEX as foo, the non-stub variant of bar is used.
Yu Liuf6f85492025-01-13 21:02:36 +00003838func ChooseStubOrImpl(ctx android.ModuleContext, dep android.ModuleProxy) (SharedLibraryInfo, FlagExporterInfo) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003839 depTag := ctx.OtherModuleDependencyTag(dep)
3840 libDepTag, ok := depTag.(libraryDependencyTag)
3841 if !ok || !libDepTag.shared() {
3842 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3843 }
3844
Colin Cross313aa542023-12-13 13:47:44 -08003845 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3846 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3847 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003848
3849 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003850 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003851 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003852 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3853 toUse := stubs[len(stubs)-1]
3854 sharedLibraryInfo = toUse.SharedLibraryInfo
3855 depExporterInfo = toUse.FlagExporterInfo
3856 }
3857 }
3858 return sharedLibraryInfo, depExporterInfo
3859}
3860
Colin Cross0de8a1e2020-09-18 14:15:30 -07003861// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3862// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003863// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003864// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003865func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3866 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003867 var staticPaths android.Paths
3868 for _, staticDep := range staticDeps {
3869 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3870 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3871 }
3872 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003873 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003874 }
3875 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3876
3877 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3878
3879 // reorder the dependencies based on transitive dependencies
3880 staticPaths = android.FirstUniquePaths(staticPaths)
3881 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3882
3883 if len(orderedStaticPaths) != len(staticPaths) {
3884 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3885 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3886 }
3887
3888 return orderedStaticPaths, transitiveStaticLibs
3889}
3890
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003891// BaseLibName trims known prefixes and suffixes
3892func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003893 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3894 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003895 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003896 return libName
3897}
3898
Yu Liu8024b922024-12-20 23:31:32 +00003899func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003900 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003901 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3902 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003903
Yu Liu8024b922024-12-20 23:31:32 +00003904 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003905 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003906 if ccInfo.SnapshotInfo != nil {
Yu Liu0a37d422025-02-13 02:05:00 +00003907 return commonInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003908 }
3909 }
3910
Yu Liu8024b922024-12-20 23:31:32 +00003911 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003912 // The vendor and product modules in Make will have been renamed to not conflict with the
3913 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003914 return libName + linkableInfo.SubName
3915 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003916 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003917 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003918 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003919 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003920 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003921 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003922 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003923 } else {
3924 return libName
3925 }
3926}
3927
Colin Crossca860ac2016-01-04 14:34:37 -08003928func (c *Module) InstallInData() bool {
3929 if c.installer == nil {
3930 return false
3931 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003932 return c.installer.inData()
3933}
3934
3935func (c *Module) InstallInSanitizerDir() bool {
3936 if c.installer == nil {
3937 return false
3938 }
3939 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003940 return true
3941 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003942 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003943}
3944
Yifan Hong1b3348d2020-01-21 15:53:22 -08003945func (c *Module) InstallInRamdisk() bool {
3946 return c.InRamdisk()
3947}
3948
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003949func (c *Module) InstallInVendorRamdisk() bool {
3950 return c.InVendorRamdisk()
3951}
3952
Jiyong Parkf9332f12018-02-01 00:54:12 +09003953func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003954 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003955}
3956
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003957func (c *Module) MakeUninstallable() {
3958 if c.installer == nil {
3959 c.ModuleBase.MakeUninstallable()
3960 return
3961 }
3962 c.installer.makeUninstallable(c)
3963}
3964
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003965func (c *Module) HostToolPath() android.OptionalPath {
3966 if c.installer == nil {
3967 return android.OptionalPath{}
3968 }
3969 return c.installer.hostToolPath()
3970}
3971
Nan Zhangd4e641b2017-07-12 12:55:28 -07003972func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3973 return c.outputFile
3974}
3975
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003976func (c *Module) static() bool {
3977 if static, ok := c.linker.(interface {
3978 static() bool
3979 }); ok {
3980 return static.static()
3981 }
3982 return false
3983}
3984
Colin Cross6a730042024-12-05 13:53:43 -08003985func (c *Module) staticLibrary() bool {
3986 if static, ok := c.linker.(interface {
3987 staticLibrary() bool
3988 }); ok {
3989 return static.staticLibrary()
3990 }
3991 return false
3992}
3993
Jiyong Park379de2f2018-12-19 02:47:14 +09003994func (c *Module) staticBinary() bool {
3995 if static, ok := c.linker.(interface {
3996 staticBinary() bool
3997 }); ok {
3998 return static.staticBinary()
3999 }
4000 return false
4001}
4002
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07004003func (c *Module) testBinary() bool {
4004 if test, ok := c.linker.(interface {
4005 testBinary() bool
4006 }); ok {
4007 return test.testBinary()
4008 }
4009 return false
4010}
4011
Jingwen Chen537242c2022-08-24 11:53:27 +00004012func (c *Module) testLibrary() bool {
4013 if test, ok := c.linker.(interface {
4014 testLibrary() bool
4015 }); ok {
4016 return test.testLibrary()
4017 }
4018 return false
4019}
4020
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004021func (c *Module) benchmarkBinary() bool {
4022 if b, ok := c.linker.(interface {
4023 benchmarkBinary() bool
4024 }); ok {
4025 return b.benchmarkBinary()
4026 }
4027 return false
4028}
4029
4030func (c *Module) fuzzBinary() bool {
4031 if f, ok := c.linker.(interface {
4032 fuzzBinary() bool
4033 }); ok {
4034 return f.fuzzBinary()
4035 }
4036 return false
4037}
4038
Ivan Lozano3968d8f2020-12-14 11:27:52 -05004039// Header returns true if the module is a header-only variant. (See cc/library.go header()).
4040func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09004041 if h, ok := c.linker.(interface {
4042 header() bool
4043 }); ok {
4044 return h.header()
4045 }
4046 return false
4047}
4048
Ivan Lozanod7586b62021-04-01 09:49:36 -04004049func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09004050 if b, ok := c.linker.(interface {
4051 binary() bool
4052 }); ok {
4053 return b.binary()
4054 }
4055 return false
4056}
4057
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004058func (c *Module) ForceDisableSanitizers() {
4059 c.sanitize.Properties.ForceDisable = true
4060}
4061
Justin Yun5e035862021-06-29 20:50:37 +09004062func (c *Module) StaticExecutable() bool {
4063 if b, ok := c.linker.(*binaryDecorator); ok {
4064 return b.static()
4065 }
4066 return false
4067}
4068
Ivan Lozanod7586b62021-04-01 09:49:36 -04004069func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09004070 if o, ok := c.linker.(interface {
4071 object() bool
4072 }); ok {
4073 return o.object()
4074 }
4075 return false
4076}
4077
Kiyoung Kim37693d02024-04-04 09:56:15 +09004078func (m *Module) Dylib() bool {
4079 return false
4080}
4081
4082func (m *Module) Rlib() bool {
4083 return false
4084}
4085
Ivan Lozanof9e21722020-12-02 09:00:51 -05004086func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09004087 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08004088 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05004089 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09004090 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05004091 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09004092 return "native:product"
4093 }
Jooyung Han38002912019-05-16 04:01:54 +09004094 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08004095 } else if c.InRamdisk() {
4096 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07004097 } else if c.InVendorRamdisk() {
4098 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07004099 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07004100 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05004101 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07004102 return "native:ndk:none:none"
4103 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
4104 //family, link := getNdkStlFamilyAndLinkType(c)
4105 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
4106 } else {
4107 return "native:platform"
4108 }
4109}
4110
Jiyong Park9d452992018-10-03 00:38:19 +09004111// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07004112// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09004113func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07004114 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09004115 // Stub libs and prebuilt libs in a versioned SDK are not
4116 // installable to APEX even though they are shared libs.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004117 return lib.shared() && !lib.BuildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09004118 }
4119 return false
4120}
4121
Jiyong Parka90ca002019-10-07 15:47:24 +09004122func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00004123 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
4124}
4125
4126func (c *Module) ApexAvailableFor() []string {
4127 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09004128 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00004129 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09004130 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00004131 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09004132 }
Yu Liub73c3a62024-12-10 00:58:06 +00004133
4134 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09004135}
4136
Paul Duffin0cb37b92020-03-04 14:52:46 +00004137func (c *Module) EverInstallable() bool {
4138 return c.installer != nil &&
4139 // Check to see whether the module is actually ever installable.
4140 c.installer.everInstallable()
4141}
4142
Ivan Lozanod7586b62021-04-01 09:49:36 -04004143func (c *Module) PreventInstall() bool {
4144 return c.Properties.PreventInstall
4145}
4146
4147func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07004148 if c.library != nil {
4149 if i := c.library.installable(); i != nil {
4150 return i
4151 }
4152 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04004153 return c.Properties.Installable
4154}
4155
4156func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00004157 ret := c.EverInstallable() &&
4158 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04004159 proptools.BoolDefault(c.Installable(), true) &&
4160 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004161
4162 // The platform variant doesn't need further condition. Apex variants however might not
4163 // be installable because it will likely to be included in the APEX and won't appear
4164 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07004165 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004166 return ret
4167 }
4168
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004169 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09004170}
4171
Logan Chien41eabe62019-04-10 13:33:58 +08004172func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
4173 if c.linker != nil {
4174 if library, ok := c.linker.(*libraryDecorator); ok {
4175 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
4176 }
4177 }
4178}
4179
Jiyong Park45bf82e2020-12-15 22:29:02 +09004180var _ android.ApexModule = (*Module)(nil)
4181
4182// Implements android.ApexModule
Yu Liuf1806032025-02-07 00:23:34 +00004183func (c *Module) GetDepInSameApexChecker() android.DepInSameApexChecker {
4184 return CcDepInSameApexChecker{
4185 Static: c.static(),
4186 HasStubsVariants: c.HasStubsVariants(),
4187 IsLlndk: c.IsLlndk(),
4188 Host: c.Host(),
Colin Cross6e511a92020-07-27 21:26:48 -07004189 }
Yu Liuf1806032025-02-07 00:23:34 +00004190}
4191
4192type CcDepInSameApexChecker struct {
4193 Static bool
4194 HasStubsVariants bool
4195 IsLlndk bool
4196 Host bool
4197}
4198
4199func (c CcDepInSameApexChecker) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004200 if depTag == StubImplDepTag {
Colin Crossc1b36442021-05-06 13:42:48 -07004201 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004202 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004203 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004204 if depTag == staticVariantTag {
4205 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4206 // actually mean that the static lib (and its dependencies) are copied into the
4207 // APEX.
4208 return false
4209 }
Colin Cross8acea3e2024-12-12 14:53:30 -08004210
4211 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
Yu Liuf1806032025-02-07 00:23:34 +00004212 if isLibDepTag && c.Static && libDepTag.shared() {
Colin Cross8acea3e2024-12-12 14:53:30 -08004213 // shared_lib dependency from a static lib is considered as crossing
4214 // the APEX boundary because the dependency doesn't actually is
4215 // linked; the dependency is used only during the compilation phase.
4216 return false
4217 }
4218
4219 if isLibDepTag && libDepTag.excludeInApex {
4220 return false
4221 }
4222
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004223 return true
4224}
4225
Yu Liuf1806032025-02-07 00:23:34 +00004226func (c CcDepInSameApexChecker) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
4227 if c.Host {
Colin Cross1cea5302024-12-03 16:40:08 -08004228 return false
4229 }
Yu Liuf1806032025-02-07 00:23:34 +00004230 if c.HasStubsVariants {
Colin Crossbd930bc2025-02-03 12:17:42 -08004231 if IsSharedDepTag(depTag) && !IsExplicitImplSharedDepTag(depTag) {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004232 // dynamic dep to a stubs lib crosses APEX boundary
4233 return false
4234 }
4235 if IsRuntimeDepTag(depTag) {
4236 // runtime dep to a stubs lib also crosses APEX boundary
4237 return false
4238 }
4239 if IsHeaderDepTag(depTag) {
4240 return false
4241 }
4242 }
Yu Liuf1806032025-02-07 00:23:34 +00004243 if c.IsLlndk {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004244 return false
4245 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004246
Colin Crosscfad1192015-11-02 16:43:11 -08004247 return true
4248}
Patrice Arrudac249c712019-03-19 17:00:29 -07004249
Jiyong Park45bf82e2020-12-15 22:29:02 +09004250// Implements android.ApexModule
Yu Liudf0b8392025-02-12 18:27:03 +00004251func (c *Module) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel {
Jooyung Han749dc692020-04-15 11:03:39 +09004252 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4253 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
Yu Liudf0b8392025-02-12 18:27:03 +00004254 return android.MinApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004255 }
Jooyung Han749dc692020-04-15 11:03:39 +09004256 // We don't check for prebuilt modules
4257 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
Yu Liudf0b8392025-02-12 18:27:03 +00004258 return android.MinApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004259 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004260
Jooyung Han749dc692020-04-15 11:03:39 +09004261 minSdkVersion := c.MinSdkVersion()
4262 if minSdkVersion == "apex_inherit" {
Yu Liudf0b8392025-02-12 18:27:03 +00004263 return android.MinApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004264 }
4265 if minSdkVersion == "" {
4266 // JNI libs within APK-in-APEX fall into here
4267 // Those are okay to set sdk_version instead
4268 // We don't have to check if this is a SDK variant because
4269 // non-SDK variant resets sdk_version, which works too.
4270 minSdkVersion = c.SdkVersion()
4271 }
Yu Liudf0b8392025-02-12 18:27:03 +00004272
Dan Albertc8060532020-07-22 22:32:17 -07004273 if minSdkVersion == "" {
Yu Liudf0b8392025-02-12 18:27:03 +00004274 return android.NoneApiLevel
Dan Albertc8060532020-07-22 22:32:17 -07004275 }
Yu Liudf0b8392025-02-12 18:27:03 +00004276
Dan Albertc8060532020-07-22 22:32:17 -07004277 // Not using nativeApiLevelFromUser because the context here is not
4278 // necessarily a native context.
Yu Liudf0b8392025-02-12 18:27:03 +00004279 ver, err := android.ApiLevelFromUserWithConfig(ctx.Config(), minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004280 if err != nil {
Yu Liudf0b8392025-02-12 18:27:03 +00004281 return android.NoneApiLevel
Jooyung Han749dc692020-04-15 11:03:39 +09004282 }
Dan Albertc8060532020-07-22 22:32:17 -07004283
Colin Cross8ca61c12022-10-06 21:00:14 -07004284 // A dependency only needs to support a min_sdk_version at least
4285 // as high as the api level that the architecture was introduced in.
4286 // This allows introducing new architectures in the platform that
4287 // need to be included in apexes that normally require an older
4288 // min_sdk_version.
Yu Liudf0b8392025-02-12 18:27:03 +00004289 if c.Enabled(ctx) {
4290 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
4291 if ver.LessThanOrEqualTo(minApiForArch) {
4292 ver = android.MinApiLevel
4293 }
Colin Cross8ca61c12022-10-06 21:00:14 -07004294 }
4295
Yu Liudf0b8392025-02-12 18:27:03 +00004296 return ver
Jooyung Han749dc692020-04-15 11:03:39 +09004297}
4298
Paul Duffinb5769c12021-05-12 16:16:51 +01004299// Implements android.ApexModule
4300func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4301 // stub libraries and native bridge libraries are always available to platform
4302 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4303}
4304
Inseob Kima1888ce2022-10-04 14:42:02 +09004305func (c *Module) overriddenModules() []string {
4306 if o, ok := c.linker.(overridable); ok {
4307 return o.overriddenModules()
4308 }
4309 return nil
4310}
4311
Liz Kammer35ca77e2021-12-22 15:31:40 -05004312type moduleType int
4313
4314const (
4315 unknownType moduleType = iota
4316 binary
4317 object
4318 fullLibrary
4319 staticLibrary
4320 sharedLibrary
4321 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004322 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004323 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004324)
4325
4326func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004327 if c.testBinary() {
4328 // testBinary is also a binary, so this comes before the c.Binary()
4329 // conditional. A testBinary has additional implicit dependencies and
4330 // other test-only semantics.
4331 return testBin
4332 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004333 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004334 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004335 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004336 } else if c.testLibrary() {
4337 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4338 // will let them add implicit compile deps on gtest, for example.
4339 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004340 // For now, treat them as regular libraries.
4341 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004342 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004343 static := false
4344 shared := false
4345 if library, ok := c.linker.(*libraryDecorator); ok {
4346 static = library.MutatedProperties.BuildStatic
4347 shared = library.MutatedProperties.BuildShared
4348 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4349 static = library.MutatedProperties.BuildStatic
4350 shared = library.MutatedProperties.BuildShared
4351 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004352 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004353 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004354 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004355 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004356 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004357 return staticLibrary
4358 }
4359 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004360 } else if c.isNDKStubLibrary() {
4361 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004362 }
4363 return unknownType
4364}
4365
Colin Cross2ba19d92015-05-07 15:44:20 -07004366// Defaults
Colin Crosscfad1192015-11-02 16:43:11 -08004367type Defaults struct {
4368 android.ModuleBase
4369 android.DefaultsModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004370}
4371
Colin Cross635c3b02016-05-18 15:37:25 -07004372// cc_defaults provides a set of properties that can be inherited by other cc
Colin Crosscfad1192015-11-02 16:43:11 -08004373// modules. A module can use the properties from a cc_defaults using
4374// `defaults: ["<:default_module_name>"]`. Properties of both modules are
Patrice Arrudac249c712019-03-19 17:00:29 -07004375// merged (when possible) by prepending the default module's values to the
4376// depending module's values.
4377func defaultsFactory() android.Module {
4378 return DefaultsFactory()
4379}
Colin Cross36242852017-06-23 15:06:31 -07004380
Colin Crosse1d764e2016-08-18 14:18:32 -07004381func DefaultsFactory(props ...interface{}) android.Module {
4382 module := &Defaults{}
4383
Colin Cross36242852017-06-23 15:06:31 -07004384 module.AddProperties(props...)
Colin Crossca860ac2016-01-04 14:34:37 -08004385 module.AddProperties(
Colin Crosscfad1192015-11-02 16:43:11 -08004386 &BaseProperties{},
Colin Cross36242852017-06-23 15:06:31 -07004387 &VendorProperties{},
4388 &BaseCompilerProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004389 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004390 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004391 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004392 &StaticProperties{},
4393 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004394 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004395 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004396 &TestLinkerProperties{},
4397 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004398 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004399 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004400 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004401 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004402 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004403 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004404 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004405 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004406 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004407 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004408 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004409 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004410 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004411 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004412 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4413 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004414 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004415 )
Colin Crosscfad1192015-11-02 16:43:11 -08004416
Jooyung Hancc372c52019-09-25 15:18:44 +09004417 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004418
4419 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004420}
4421
Jiyong Park2286afd2020-06-16 21:58:53 +09004422func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004423 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004424}
4425
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004426func kytheExtractAllFactory() android.Singleton {
4427 return &kytheExtractAllSingleton{}
4428}
4429
4430type kytheExtractAllSingleton struct {
4431}
4432
4433func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4434 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004435 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004436 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004437 if len(files) > 0 {
4438 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004439 }
4440 })
4441 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4442 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004443 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004444 }
4445}
4446
Jihoon Kangf78a8902022-09-01 22:47:07 +00004447func (c *Module) Partition() string {
4448 if p, ok := c.installer.(interface {
4449 getPartition() string
4450 }); ok {
4451 return p.getPartition()
4452 }
4453 return ""
4454}
4455
Spandan Das2b6dfb52024-01-19 00:22:22 +00004456type sourceModuleName interface {
4457 sourceModuleName() string
4458}
4459
4460func (c *Module) BaseModuleName() string {
4461 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4462 // if the prebuilt module sets a source_module_name in Android.bp, use that
4463 return smn.sourceModuleName()
4464 }
4465 return c.ModuleBase.BaseModuleName()
4466}
4467
Spandan Dase20c56c2024-07-23 21:34:24 +00004468func (c *Module) stubsSymbolFilePath() android.Path {
4469 if library, ok := c.linker.(*libraryDecorator); ok {
4470 return library.stubsSymbolFilePath
4471 }
4472 return android.OptionalPath{}.Path()
4473}
4474
Colin Cross06a931b2015-10-28 17:23:31 -07004475var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004476var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004477var BoolPtr = proptools.BoolPtr
4478var String = proptools.String
4479var StringPtr = proptools.StringPtr