blob: ad6468d6ce9a6e44458520094e971a772040b9ac [file] [log] [blame]
Colin Cross5049f022015-03-18 13:28:46 -07001// Copyright 2015 Google Inc. All rights reserved.
Colin Cross3f40fa42015-01-30 17:27:36 -08002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17// This file contains the module types for compiling C/C++ for Android, and converts the properties
18// into the flags and filenames necessary to pass to the compiler. The final creation of the rules
19// is handled in builder.go
20
21import (
Colin Cross516c5452024-10-28 13:45:21 -070022 "errors"
Colin Cross41955e82019-05-29 14:40:35 -070023 "fmt"
Logan Chien41eabe62019-04-10 13:33:58 +080024 "io"
Colin Cross516c5452024-10-28 13:45:21 -070025 "slices"
Dan Albert9e10cd42016-08-03 14:12:14 -070026 "strconv"
Colin Cross3f40fa42015-01-30 17:27:36 -080027 "strings"
28
Colin Cross97ba0732015-03-23 17:50:24 -070029 "github.com/google/blueprint"
Colin Crossa14fb6a2024-10-23 16:57:06 -070030 "github.com/google/blueprint/depset"
Colin Cross06a931b2015-10-28 17:23:31 -070031 "github.com/google/blueprint/proptools"
Colin Cross97ba0732015-03-23 17:50:24 -070032
Vinh Tran367d89d2023-04-28 11:21:25 -040033 "android/soong/aidl_library"
Colin Cross635c3b02016-05-18 15:37:25 -070034 "android/soong/android"
Colin Crossb98c8b02016-07-29 13:44:28 -070035 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070036 "android/soong/fuzz"
Colin Cross3f40fa42015-01-30 17:27:36 -080037)
38
Yu Liu76d94462024-10-31 23:32:36 +000039type CcMakeVarsInfo struct {
40 WarningsAllowed string
41 UsingWnoError string
42 MissingProfile string
43}
44
45var CcMakeVarsInfoProvider = blueprint.NewProvider[*CcMakeVarsInfo]()
46
Yu Liuec7043d2024-11-05 18:22:20 +000047type CcObjectInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000048 ObjFiles android.Paths
49 TidyFiles android.Paths
50 KytheFiles android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +000051}
52
53var CcObjectInfoProvider = blueprint.NewProvider[CcObjectInfo]()
54
Yu Liu323d77a2024-12-16 23:13:57 +000055type AidlInterfaceInfo struct {
56 // list of aidl_interface sources
57 Sources []string
58 // root directory of AIDL sources
59 AidlRoot string
60 // AIDL backend language (e.g. "cpp", "ndk")
61 Lang string
62 // list of flags passed to AIDL generator
63 Flags []string
64}
65
66type CompilerInfo struct {
67 Srcs android.Paths
68 // list of module-specific flags that will be used for C and C++ compiles.
69 Cflags proptools.Configurable[[]string]
70 AidlInterfaceInfo AidlInterfaceInfo
71 LibraryDecoratorInfo *LibraryDecoratorInfo
72}
73
74type LinkerInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000075 WholeStaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000076 // list of modules that should be statically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000077 StaticLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000078 // list of modules that should be dynamically linked into this module.
Yu Liu4f825132024-12-18 00:35:39 +000079 SharedLibs proptools.Configurable[[]string]
Yu Liu323d77a2024-12-16 23:13:57 +000080 // list of modules that should only provide headers for this module.
Yu Liu68a70b72025-01-08 22:54:44 +000081 HeaderLibs proptools.Configurable[[]string]
82 ImplementationModuleName *string
Yu Liu323d77a2024-12-16 23:13:57 +000083
84 BinaryDecoratorInfo *BinaryDecoratorInfo
85 LibraryDecoratorInfo *LibraryDecoratorInfo
86 TestBinaryInfo *TestBinaryInfo
87 BenchmarkDecoratorInfo *BenchmarkDecoratorInfo
88 ObjectLinkerInfo *ObjectLinkerInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +000089 StubDecoratorInfo *StubDecoratorInfo
Yu Liu323d77a2024-12-16 23:13:57 +000090}
91
92type BinaryDecoratorInfo struct{}
93type LibraryDecoratorInfo struct {
Yu Liu4f825132024-12-18 00:35:39 +000094 ExportIncludeDirs proptools.Configurable[[]string]
Yu Liu116610a2025-01-06 21:54:48 +000095 InjectBsslHash bool
Yu Liu323d77a2024-12-16 23:13:57 +000096}
Yu Liuffe86322024-12-18 18:53:12 +000097
Yu Liu8024b922024-12-20 23:31:32 +000098type SnapshotInfo struct {
99 SnapshotAndroidMkSuffix string
Yu Liuffe86322024-12-18 18:53:12 +0000100}
101
Yu Liu323d77a2024-12-16 23:13:57 +0000102type TestBinaryInfo struct {
103 Gtest bool
104}
105type BenchmarkDecoratorInfo struct{}
Yu Liu8a8d5b42025-01-07 00:48:08 +0000106
107type StubDecoratorInfo struct{}
108
Yu Liu323d77a2024-12-16 23:13:57 +0000109type ObjectLinkerInfo struct{}
110
Yu Liu8a8d5b42025-01-07 00:48:08 +0000111type LibraryInfo struct {
112 BuildStubs bool
113}
114
Yu Liub1bfa9d2024-12-05 18:57:51 +0000115// Common info about the cc module.
116type CcInfo struct {
Yu Liu323d77a2024-12-16 23:13:57 +0000117 IsPrebuilt bool
118 CmakeSnapshotSupported bool
Yu Liu68a70b72025-01-08 22:54:44 +0000119 HasLlndkStubs bool
Yu Liu323d77a2024-12-16 23:13:57 +0000120 CompilerInfo *CompilerInfo
121 LinkerInfo *LinkerInfo
Yu Liu8024b922024-12-20 23:31:32 +0000122 SnapshotInfo *SnapshotInfo
Yu Liu8a8d5b42025-01-07 00:48:08 +0000123 LibraryInfo *LibraryInfo
Yu Liub1bfa9d2024-12-05 18:57:51 +0000124}
125
Yu Liu8024b922024-12-20 23:31:32 +0000126var CcInfoProvider = blueprint.NewProvider[*CcInfo]()
Yu Liub1bfa9d2024-12-05 18:57:51 +0000127
Yu Liu986d98c2024-11-12 00:28:11 +0000128type LinkableInfo struct {
129 // StaticExecutable returns true if this is a binary module with "static_executable: true".
Yu Liu8024b922024-12-20 23:31:32 +0000130 StaticExecutable bool
131 Static bool
132 Shared bool
133 HasStubsVariants bool
134 StubsVersion string
135 IsStubs bool
136 UnstrippedOutputFile android.Path
137 OutputFile android.OptionalPath
138 CoverageFiles android.Paths
Yu Liuf6f85492025-01-13 21:02:36 +0000139 // CoverageOutputFile returns the output archive of gcno coverage information files.
140 CoverageOutputFile android.OptionalPath
141 SAbiDumpFiles android.Paths
142 // Partition returns the partition string for this module.
143 Partition string
Yu Liu8a8d5b42025-01-07 00:48:08 +0000144 CcLibrary bool
Yu Liu8024b922024-12-20 23:31:32 +0000145 CcLibraryInterface bool
146 RustLibraryInterface bool
147 // CrateName returns the crateName for a Rust library
148 CrateName string
149 // DepFlags returns a slice of Rustc string flags
150 ExportedCrateLinkDirs []string
151 // This can be different from the one on CommonModuleInfo
152 BaseModuleName string
153 HasNonSystemVariants bool
154 IsLlndk bool
Yu Liuf6f85492025-01-13 21:02:36 +0000155 // True if the library is in the configs known NDK list.
156 IsNdk bool
157 InVendorOrProduct bool
Yu Liu8024b922024-12-20 23:31:32 +0000158 // SubName returns the modules SubName, used for image and NDK/SDK variations.
159 SubName string
160 InRamdisk bool
161 OnlyInRamdisk bool
162 InVendorRamdisk bool
163 OnlyInVendorRamdisk bool
164 InRecovery bool
165 OnlyInRecovery bool
Yu Liu8a8d5b42025-01-07 00:48:08 +0000166 Installable *bool
Yu Liu97880e12025-01-07 19:03:34 +0000167 // RelativeInstallPath returns the relative install path for this module.
168 RelativeInstallPath string
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000169 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
170 RustApexExclude bool
Yu Liuf6f85492025-01-13 21:02:36 +0000171 // Bootstrap tests if this module is allowed to use non-APEX version of libraries.
172 Bootstrap bool
Yu Liu986d98c2024-11-12 00:28:11 +0000173}
174
Yu Liu8024b922024-12-20 23:31:32 +0000175var LinkableInfoProvider = blueprint.NewProvider[*LinkableInfo]()
Yu Liu986d98c2024-11-12 00:28:11 +0000176
Colin Cross463a90e2015-06-17 14:20:06 -0700177func init() {
Paul Duffin036e7002019-12-19 19:16:28 +0000178 RegisterCCBuildComponents(android.InitRegistrationContext)
Colin Cross463a90e2015-06-17 14:20:06 -0700179
Inseob Kim3b244062023-07-11 13:31:36 +0900180 pctx.Import("android/soong/android")
Paul Duffin036e7002019-12-19 19:16:28 +0000181 pctx.Import("android/soong/cc/config")
182}
183
184func RegisterCCBuildComponents(ctx android.RegistrationContext) {
185 ctx.RegisterModuleType("cc_defaults", defaultsFactory)
186
187 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Crossac57a6c2024-06-26 13:09:53 -0700188 ctx.Transition("sdk", &sdkTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700189 ctx.BottomUp("llndk", llndkMutator)
Colin Cross767819f2024-05-22 14:22:34 -0700190 ctx.Transition("link", &linkageTransitionMutator{})
Colin Crossadd04a82024-05-22 09:57:59 -0700191 ctx.Transition("version", &versionTransitionMutator{})
Colin Cross8a962802024-10-09 15:29:27 -0700192 ctx.BottomUp("begin", BeginMutator)
Colin Cross1e676be2016-10-12 14:38:15 -0700193 })
Colin Cross16b23492016-01-06 14:41:07 -0800194
Paul Duffin036e7002019-12-19 19:16:28 +0000195 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
Liz Kammer75db9312021-07-07 16:41:50 -0400196 for _, san := range Sanitizers {
197 san.registerMutators(ctx)
198 }
Dan Willemsen581341d2017-02-09 16:16:31 -0800199
Colin Cross8a962802024-10-09 15:29:27 -0700200 ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator)
201 ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator)
Ivan Lozano30c5db22018-02-21 15:49:20 -0800202
Colin Cross597bad62024-10-08 15:10:55 -0700203 ctx.Transition("fuzz", &fuzzTransitionMutator{})
Cory Barkera1da26f2022-06-07 20:12:06 +0000204
Colin Crossf5f4ad32024-01-19 15:41:48 -0800205 ctx.Transition("coverage", &coverageTransitionMutator{})
Stephen Craneba090d12017-05-09 15:44:35 -0700206
Colin Crossd38feb02024-01-23 16:38:06 -0800207 ctx.Transition("afdo", &afdoTransitionMutator{})
Yi Kongeb8efc92021-12-09 18:06:29 +0800208
Colin Cross33e0c812024-01-23 16:36:07 -0800209 ctx.Transition("orderfile", &orderfileTransitionMutator{})
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000210
Colin Cross6ac83a82024-01-23 11:23:10 -0800211 ctx.Transition("lto", &ltoTransitionMutator{})
Jooyung Hana70f0672019-01-18 15:20:43 +0900212
Colin Cross8a962802024-10-09 15:29:27 -0700213 ctx.BottomUp("check_linktype", checkLinkTypeMutator)
214 ctx.BottomUp("double_loadable", checkDoubleLoadableLibraries)
Colin Cross1e676be2016-10-12 14:38:15 -0700215 })
Colin Crossb98c8b02016-07-29 13:44:28 -0700216
Colin Cross91ae5ec2024-10-01 14:03:40 -0700217 ctx.PostApexMutators(func(ctx android.RegisterMutatorsContext) {
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800218 // sabi mutator needs to be run after apex mutator finishes.
Colin Cross91ae5ec2024-10-01 14:03:40 -0700219 ctx.Transition("sabi", &sabiTransitionMutator{})
Yo Chiang8aa4e3f2020-11-19 16:30:49 +0800220 })
221
LaMont Jones0c10e4d2023-05-16 00:58:37 +0000222 ctx.RegisterParallelSingletonType("kythe_extract_all", kytheExtractAllFactory)
Colin Cross463a90e2015-06-17 14:20:06 -0700223}
224
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500225// Deps is a struct containing module names of dependencies, separated by the kind of dependency.
226// Mutators should use `AddVariationDependencies` or its sibling methods to add actual dependency
227// edges to these modules.
228// This object is constructed in DepsMutator, by calling to various module delegates to set
229// relevant fields. For example, `module.compiler.compilerDeps()` may append type-specific
230// dependencies.
231// This is then consumed by the same DepsMutator, which will call `ctx.AddVariationDependencies()`
232// (or its sibling methods) to set real dependencies on the given modules.
Colin Crossca860ac2016-01-04 14:34:37 -0800233type Deps struct {
234 SharedLibs, LateSharedLibs []string
235 StaticLibs, LateStaticLibs, WholeStaticLibs []string
Colin Cross5950f382016-12-13 12:50:57 -0800236 HeaderLibs []string
Logan Chien43d34c32017-12-20 01:17:32 +0800237 RuntimeLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700238
Colin Cross3e5e7782022-06-17 22:17:05 +0000239 // UnexportedStaticLibs are static libraries that are also passed to -Wl,--exclude-libs= to
240 // prevent automatically exporting symbols.
241 UnexportedStaticLibs []string
242
Chris Parsons79d66a52020-06-05 17:26:16 -0400243 // Used for data dependencies adjacent to tests
244 DataLibs []string
Colin Crossc8caa062021-09-24 16:50:14 -0700245 DataBins []string
Chris Parsons79d66a52020-06-05 17:26:16 -0400246
Yo Chiang219968c2020-09-22 18:45:04 +0800247 // Used by DepsMutator to pass system_shared_libs information to check_elf_file.py.
248 SystemSharedLibs []string
249
Vinh Tran367d89d2023-04-28 11:21:25 -0400250 // Used by DepMutator to pass aidl_library modules to aidl compiler
251 AidlLibs []string
252
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500253 // If true, statically link the unwinder into native libraries/binaries.
Peter Collingbournedc4f9862020-02-12 17:13:25 -0800254 StaticUnwinderIfLegacy bool
255
Colin Cross5950f382016-12-13 12:50:57 -0800256 ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
Dan Willemsen490a8dc2016-06-06 18:22:19 -0700257
Colin Cross81413472016-04-11 14:37:39 -0700258 ObjFiles []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700259
Cole Faust65cb40a2024-10-21 15:41:42 -0700260 GeneratedSources []string
261 GeneratedHeaders []string
262 DeviceFirstGeneratedHeaders []string
263 GeneratedDeps []string
Dan Willemsenb40aab62016-04-20 14:21:14 -0700264
Dan Willemsenb3454ab2016-09-28 17:34:58 -0700265 ReexportGeneratedHeaders []string
266
Colin Crossc465efd2021-06-11 18:00:04 -0700267 CrtBegin, CrtEnd []string
Dan Willemsena0790e32018-10-12 00:24:23 -0700268
269 // Used for host bionic
Colin Cross9cfe6112021-06-11 18:02:22 -0700270 DynamicLinker string
Jiyong Parke3867542020-12-03 17:28:25 +0900271
272 // List of libs that need to be excluded for APEX variant
273 ExcludeLibsForApex []string
Jooyung Han9ffbe832023-11-28 22:31:35 +0900274 // List of libs that need to be excluded for non-APEX variant
275 ExcludeLibsForNonApex []string
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800276
277 // LLNDK headers for the ABI checker to check LLNDK implementation library.
278 // An LLNDK implementation is the core variant. LLNDK header libs are reexported by the vendor variant.
Colin Cross1e954b62024-09-13 13:50:00 -0700279 // The core variant cannot depend on the vendor variant because of the order of imageTransitionMutator.Split().
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800280 // Instead, the LLNDK implementation depends on the LLNDK header libs.
281 LlndkHeaderLibs []string
Colin Crossc472d572015-03-17 15:06:21 -0700282}
283
Ivan Lozano0a468a42024-05-13 21:03:34 -0400284// A struct which to collect flags for rlib dependencies
285type RustRlibDep struct {
286 LibPath android.Path // path to the rlib
287 LinkDirs []string // flags required for dependency (e.g. -L flags)
288 CrateName string // crateNames associated with rlibDeps
289}
290
291func EqRustRlibDeps(a RustRlibDep, b RustRlibDep) bool {
292 return a.LibPath == b.LibPath
293}
294
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500295// PathDeps is a struct containing file paths to dependencies of a module.
296// It's constructed in depsToPath() by traversing the direct dependencies of the current module.
297// It's used to construct flags for various build statements (such as for compiling and linking).
298// It is then passed to module decorator functions responsible for registering build statements
299// (such as `module.compiler.compile()`).`
Colin Crossca860ac2016-01-04 14:34:37 -0800300type PathDeps struct {
Colin Cross26c34ed2016-09-30 17:10:16 -0700301 // Paths to .so files
Jiyong Park64a44f22019-01-18 14:37:08 +0900302 SharedLibs, EarlySharedLibs, LateSharedLibs android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700303 // Paths to the dependencies to use for .so files (.so.toc files)
Jiyong Park64a44f22019-01-18 14:37:08 +0900304 SharedLibsDeps, EarlySharedLibsDeps, LateSharedLibsDeps android.Paths
Colin Cross26c34ed2016-09-30 17:10:16 -0700305 // Paths to .a files
Colin Cross635c3b02016-05-18 15:37:25 -0700306 StaticLibs, LateStaticLibs, WholeStaticLibs android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400307 // Paths and crateNames for RustStaticLib dependencies
308 RustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700309
Colin Cross0de8a1e2020-09-18 14:15:30 -0700310 // Transitive static library dependencies of static libraries for use in ordering.
Colin Crossa14fb6a2024-10-23 16:57:06 -0700311 TranstiveStaticLibrariesForOrdering depset.DepSet[android.Path]
Colin Cross0de8a1e2020-09-18 14:15:30 -0700312
Colin Cross26c34ed2016-09-30 17:10:16 -0700313 // Paths to .o files
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100314 Objs Objects
315 // Paths to .o files in dependencies that provide them. Note that these lists
316 // aren't complete since prebuilt modules don't provide the .o files.
Dan Willemsen581341d2017-02-09 16:16:31 -0800317 StaticLibObjs Objects
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700318 WholeStaticLibObjs Objects
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700319
Martin Stjernholm391d94c2020-04-17 17:34:31 +0100320 // Paths to .a files in prebuilts. Complements WholeStaticLibObjs to contain
321 // the libs from all whole_static_lib dependencies.
322 WholeStaticLibsFromPrebuilts android.Paths
323
Colin Cross26c34ed2016-09-30 17:10:16 -0700324 // Paths to generated source files
Colin Cross635c3b02016-05-18 15:37:25 -0700325 GeneratedSources android.Paths
Inseob Kimd110f872019-12-06 13:15:38 +0900326 GeneratedDeps android.Paths
Dan Willemsenb40aab62016-04-20 14:21:14 -0700327
Inseob Kimd110f872019-12-06 13:15:38 +0900328 Flags []string
Colin Cross3e5e7782022-06-17 22:17:05 +0000329 LdFlags []string
Inseob Kimd110f872019-12-06 13:15:38 +0900330 IncludeDirs android.Paths
331 SystemIncludeDirs android.Paths
332 ReexportedDirs android.Paths
333 ReexportedSystemDirs android.Paths
334 ReexportedFlags []string
335 ReexportedGeneratedHeaders android.Paths
336 ReexportedDeps android.Paths
Ivan Lozano0a468a42024-05-13 21:03:34 -0400337 ReexportedRustRlibDeps []RustRlibDep
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700338
Colin Cross26c34ed2016-09-30 17:10:16 -0700339 // Paths to crt*.o files
Colin Crossc465efd2021-06-11 18:00:04 -0700340 CrtBegin, CrtEnd android.Paths
Dan Willemsena0790e32018-10-12 00:24:23 -0700341
Dan Willemsena0790e32018-10-12 00:24:23 -0700342 // Path to the dynamic linker binary
343 DynamicLinker android.OptionalPath
Dan Willemsen47450072021-10-19 20:24:49 -0700344
345 // For Darwin builds, the path to the second architecture's output that should
346 // be combined with this architectures's output into a FAT MachO file.
347 DarwinSecondArchOutput android.OptionalPath
Vinh Tran367d89d2023-04-28 11:21:25 -0400348
349 // Paths to direct srcs and transitive include dirs from direct aidl_library deps
350 AidlLibraryInfos []aidl_library.AidlLibraryInfo
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800351
352 // LLNDK headers for the ABI checker to check LLNDK implementation library.
353 LlndkIncludeDirs android.Paths
354 LlndkSystemIncludeDirs android.Paths
Colin Crossb614cd42024-10-11 12:52:21 -0700355
356 directImplementationDeps android.Paths
357 transitiveImplementationDeps []depset.DepSet[android.Path]
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700358}
359
Colin Cross4af21ed2019-11-04 09:37:55 -0800360// LocalOrGlobalFlags contains flags that need to have values set globally by the build system or locally by the module
361// tracked separately, in order to maintain the required ordering (most of the global flags need to go first on the
362// command line so they can be overridden by the local module flags).
363type LocalOrGlobalFlags struct {
364 CommonFlags []string // Flags that apply to C, C++, and assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700365 AsFlags []string // Flags that apply to assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800366 YasmFlags []string // Flags that apply to yasm assembly source files
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700367 CFlags []string // Flags that apply to C and C++ source files
368 ToolingCFlags []string // Flags that apply to C and C++ source files parsed by clang LibTooling tools
369 ConlyFlags []string // Flags that apply to C source files
370 CppFlags []string // Flags that apply to C++ source files
371 ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -0700372 LdFlags []string // Flags that apply to linker command lines
Colin Cross4af21ed2019-11-04 09:37:55 -0800373}
374
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500375// Flags contains various types of command line flags (and settings) for use in building build
376// statements related to C++.
Colin Cross4af21ed2019-11-04 09:37:55 -0800377type Flags struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500378 // Local flags (which individual modules are responsible for). These may override global flags.
379 Local LocalOrGlobalFlags
380 // Global flags (which build system or toolchain is responsible for).
Luis Useche342fa6b2024-04-01 19:33:18 -0700381 Global LocalOrGlobalFlags
382 NoOverrideFlags []string // Flags applied to the end of list of flags so they are not overridden
Colin Cross4af21ed2019-11-04 09:37:55 -0800383
384 aidlFlags []string // Flags that apply to aidl source files
385 rsFlags []string // Flags that apply to renderscript source files
386 libFlags []string // Flags to add libraries early to the link order
387 extraLibFlags []string // Flags to add libraries late in the link order after LdFlags
388 TidyFlags []string // Flags that apply to clang-tidy
389 SAbiFlags []string // Flags that apply to header-abi-dumper
Colin Cross28344522015-04-22 13:07:53 -0700390
Colin Crossc3199482017-03-30 15:03:04 -0700391 // Global include flags that apply to C, C++, and assembly source files
Colin Cross4af21ed2019-11-04 09:37:55 -0800392 // These must be after any module include flags, which will be in CommonFlags.
Colin Crossc3199482017-03-30 15:03:04 -0700393 SystemIncludeFlags []string
394
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800395 Toolchain config.Toolchain
396 Tidy bool // True if ninja .tidy rules should be generated.
397 NeedTidyFiles bool // True if module link should depend on .tidy files
398 GcovCoverage bool // True if coverage files should be generated.
399 SAbiDump bool // True if header abi dumps should be generated.
400 EmitXrefs bool // If true, generate Ninja rules to generate emitXrefs input files for Kythe
kellyhungd62ea302024-05-19 21:16:07 +0800401 ClangVerify bool // If true, append cflags "-Xclang -verify" and append "&& touch $out" to the clang command line.
Colin Crossca860ac2016-01-04 14:34:37 -0800402
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500403 // The instruction set required for clang ("arm" or "thumb").
Colin Crossca860ac2016-01-04 14:34:37 -0800404 RequiredInstructionSet string
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500405 // The target-device system path to the dynamic linker.
406 DynamicLinker string
Colin Cross16b23492016-01-06 14:41:07 -0800407
Pirama Arumuga Nainarada83ec2017-08-31 23:38:27 -0700408 CFlagsDeps android.Paths // Files depended on by compiler flags
409 LdFlagsDeps android.Paths // Files depended on by linker flags
Colin Cross18c0c5a2016-12-01 14:45:23 -0800410
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500411 // True if .s files should be processed with the c preprocessor.
Dan Willemsen98ab3112019-08-27 21:20:40 -0700412 AssemblerWithCpp bool
Dan Willemsen60e62f02018-11-16 21:05:32 -0800413
Colin Cross19878da2019-03-28 14:45:07 -0700414 proto android.ProtoFlags
Colin Cross19878da2019-03-28 14:45:07 -0700415 protoC bool // Whether to use C instead of C++
416 protoOptionsFile bool // Whether to look for a .options file next to the .proto
Dan Willemsen4e0aa232019-04-10 22:59:54 -0700417
418 Yacc *YaccProperties
Matthias Maennich22fd4d12020-07-15 10:58:56 +0200419 Lex *LexProperties
Colin Crossc472d572015-03-17 15:06:21 -0700420}
421
Colin Crossca860ac2016-01-04 14:34:37 -0800422// Properties used to compile all C or C++ modules
423type BaseProperties struct {
Dan Willemsen742a5452018-07-23 17:19:36 -0700424 // Deprecated. true is the default, false is invalid.
Colin Crossca860ac2016-01-04 14:34:37 -0800425 Clang *bool `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -0700426
Yi Kong5786f5c2024-05-28 02:22:34 +0900427 // Aggresively trade performance for smaller binary size.
428 // This should only be used for on-device binaries that are rarely executed and not
429 // performance critical.
430 Optimize_for_size *bool `android:"arch_variant"`
431
Jiyong Parkb35a8192020-08-10 15:59:36 +0900432 // The API level that this module is built against. The APIs of this API level will be
433 // visible at build time, but use of any APIs newer than min_sdk_version will render the
434 // module unloadable on older devices. In the future it will be possible to weakly-link new
435 // APIs, making the behavior match Java: such modules will load on older devices, but
436 // calling new APIs on devices that do not support them will result in a crash.
437 //
438 // This property has the same behavior as sdk_version does for Java modules. For those
439 // familiar with Android Gradle, the property behaves similarly to how compileSdkVersion
440 // does for Java code.
441 //
442 // In addition, setting this property causes two variants to be built, one for the platform
443 // and one for apps.
Nan Zhang0007d812017-11-07 10:57:05 -0800444 Sdk_version *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700445
Jiyong Parkb35a8192020-08-10 15:59:36 +0900446 // Minimum OS API level supported by this C or C++ module. This property becomes the value
447 // of the __ANDROID_API__ macro. When the C or C++ module is included in an APEX or an APK,
448 // this property is also used to ensure that the min_sdk_version of the containing module is
449 // not older (i.e. less) than this module's min_sdk_version. When not set, this property
450 // defaults to the value of sdk_version. When this is set to "apex_inherit", this tracks
451 // min_sdk_version of the containing APEX. When the module
452 // is not built for an APEX, "apex_inherit" defaults to sdk_version.
Jooyung Han379660c2020-04-21 15:24:00 +0900453 Min_sdk_version *string
454
Colin Crossc511bc52020-04-07 16:50:32 +0000455 // If true, always create an sdk variant and don't create a platform variant.
456 Sdk_variant_only *bool
457
Colin Cross4297f402024-11-20 15:20:09 -0800458 AndroidMkSharedLibs []string `blueprint:"mutated"`
459 AndroidMkStaticLibs []string `blueprint:"mutated"`
460 AndroidMkRlibs []string `blueprint:"mutated"`
461 AndroidMkRuntimeLibs []string `blueprint:"mutated"`
462 AndroidMkWholeStaticLibs []string `blueprint:"mutated"`
463 AndroidMkHeaderLibs []string `blueprint:"mutated"`
464 HideFromMake bool `blueprint:"mutated"`
465 PreventInstall bool `blueprint:"mutated"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700466
Yo Chiang219968c2020-09-22 18:45:04 +0800467 // Set by DepsMutator.
468 AndroidMkSystemSharedLibs []string `blueprint:"mutated"`
469
Kiyoung Kimb5fdb2e2024-01-03 14:24:34 +0900470 // The name of the image this module is built for
471 ImageVariation string `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200472
473 // The VNDK version this module is built against. If empty, the module is not
474 // build against the VNDK.
475 VndkVersion string `blueprint:"mutated"`
476
477 // Suffix for the name of Android.mk entries generated by this module
478 SubName string `blueprint:"mutated"`
Colin Cross5beccee2017-12-07 15:28:59 -0800479
480 // *.logtags files, to combine together in order to generate the /system/etc/event-log-tags
481 // file
Inseob Kim37e0bb02024-04-29 15:54:44 +0900482 Logtags []string `android:"path"`
Jiyong Parkf9332f12018-02-01 00:54:12 +0900483
Yifan Hong39143a92020-10-26 12:43:12 -0700484 // Make this module available when building for ramdisk.
485 // On device without a dedicated recovery partition, the module is only
486 // available after switching root into
487 // /first_stage_ramdisk. To expose the module before switching root, install
488 // the recovery variant instead.
Yifan Hong1b3348d2020-01-21 15:53:22 -0800489 Ramdisk_available *bool
490
Yifan Hong39143a92020-10-26 12:43:12 -0700491 // Make this module available when building for vendor ramdisk.
492 // On device without a dedicated recovery partition, the module is only
493 // available after switching root into
494 // /first_stage_ramdisk. To expose the module before switching root, install
495 // the recovery variant instead.
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700496 Vendor_ramdisk_available *bool
497
Jiyong Parkf9332f12018-02-01 00:54:12 +0900498 // Make this module available when building for recovery
499 Recovery_available *bool
500
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200501 // Used by imageMutator, set by ImageMutatorBegin()
Jihoon Kang47e91842024-06-19 00:51:16 +0000502 VendorVariantNeeded bool `blueprint:"mutated"`
503 ProductVariantNeeded bool `blueprint:"mutated"`
Lukacs T. Berki2f5c3402021-06-15 11:27:56 +0200504 CoreVariantNeeded bool `blueprint:"mutated"`
505 RamdiskVariantNeeded bool `blueprint:"mutated"`
506 VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
507 RecoveryVariantNeeded bool `blueprint:"mutated"`
508
509 // A list of variations for the "image" mutator of the form
510 //<image name> '.' <version char>, for example, 'vendor.S'
511 ExtraVersionedImageVariations []string `blueprint:"mutated"`
Jiyong Parkb0788572018-12-20 22:10:17 +0900512
513 // Allows this module to use non-APEX version of libraries. Useful
514 // for building binaries that are started before APEXes are activated.
515 Bootstrap *bool
Jooyung Han097087b2019-10-22 19:32:18 +0900516
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000517 // Allows this module to be included in CMake release snapshots to be built outside of Android
518 // build system and source tree.
519 Cmake_snapshot_supported *bool
520
Colin Cross1bc94122021-10-28 13:25:54 -0700521 Installable *bool `android:"arch_variant"`
Colin Crossc511bc52020-04-07 16:50:32 +0000522
523 // Set by factories of module types that can only be referenced from variants compiled against
524 // the SDK.
525 AlwaysSdk bool `blueprint:"mutated"`
526
527 // Variant is an SDK variant created by sdkMutator
528 IsSdkVariant bool `blueprint:"mutated"`
529 // Set when both SDK and platform variants are exported to Make to trigger renaming the SDK
530 // variant to have a ".sdk" suffix.
531 SdkAndPlatformVariantVisibleToMake bool `blueprint:"mutated"`
Bill Peckham945441c2020-08-31 16:07:58 -0700532
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +0800533 Target struct {
534 Platform struct {
535 // List of modules required by the core variant.
536 Required []string `android:"arch_variant"`
537
538 // List of modules not required by the core variant.
539 Exclude_required []string `android:"arch_variant"`
540 } `android:"arch_variant"`
541
542 Recovery struct {
543 // List of modules required by the recovery variant.
544 Required []string `android:"arch_variant"`
545
546 // List of modules not required by the recovery variant.
547 Exclude_required []string `android:"arch_variant"`
548 } `android:"arch_variant"`
549 } `android:"arch_variant"`
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700550}
551
552type VendorProperties struct {
Jiyong Park82e2bf32017-08-16 14:05:54 +0900553 // whether this module should be allowed to be directly depended by other
554 // modules with `vendor: true`, `proprietary: true`, or `vendor_available:true`.
Justin Yun63e9ec72020-10-29 16:49:43 +0900555 // If set to true, two variants will be built separately, one like
556 // normal, and the other limited to the set of libraries and headers
557 // that are exposed to /vendor modules.
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700558 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900559 // The vendor variant may be used with a different (newer) /system,
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700560 // so it shouldn't have any unversioned runtime dependencies, or
561 // make assumptions about the system that may not be true in the
562 // future.
563 //
Justin Yun63e9ec72020-10-29 16:49:43 +0900564 // If set to false, this module becomes inaccessible from /vendor modules.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900565 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900566 // The modules with vndk: {enabled: true} must define 'vendor_available'
Justin Yun0b1db6d2021-01-08 15:22:34 +0900567 // to 'true'.
Jiyong Park82e2bf32017-08-16 14:05:54 +0900568 //
Dan Willemsen4416e5d2017-04-06 12:43:22 -0700569 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
570 Vendor_available *bool
Jiyong Park5fb8c102018-04-09 12:03:06 +0900571
Justin Yunebcf0c52021-01-08 18:00:19 +0900572 // This is the same as the "vendor_available" except that the install path
573 // of the vendor variant is /odm or /vendor/odm.
574 // By replacing "vendor_available: true" with "odm_available: true", the
575 // module will install its vendor variant to the /odm partition or /vendor/odm.
576 // As the modules with "odm_available: true" still create the vendor variants,
577 // they can link to the other vendor modules as the vendor_available modules do.
578 // Also, the vendor modules can link to odm_available modules.
579 //
580 // It may not be used for VNDK modules.
581 Odm_available *bool
582
Justin Yun63e9ec72020-10-29 16:49:43 +0900583 // whether this module should be allowed to be directly depended by other
584 // modules with `product_specific: true` or `product_available: true`.
585 // If set to true, an additional product variant will be built separately
586 // that is limited to the set of libraries and headers that are exposed to
587 // /product modules.
588 //
589 // The product variant may be used with a different (newer) /system,
590 // so it shouldn't have any unversioned runtime dependencies, or
591 // make assumptions about the system that may not be true in the
592 // future.
593 //
Justin Yun6977e8a2020-10-29 18:24:11 +0900594 // If set to false, this module becomes inaccessible from /product modules.
595 //
596 // Different from the 'vendor_available' property, the modules with
597 // vndk: {enabled: true} don't have to define 'product_available'. The VNDK
598 // library without 'product_available' may not be depended on by any other
599 // modules that has product variants including the product available VNDKs.
Justin Yun63e9ec72020-10-29 16:49:43 +0900600 //
601 // Nothing happens if BOARD_VNDK_VERSION isn't set in the BoardConfig.mk
602 // and PRODUCT_PRODUCT_VNDK_VERSION isn't set.
603 Product_available *bool
604
Jiyong Park5fb8c102018-04-09 12:03:06 +0900605 // whether this module is capable of being loaded with other instance
606 // (possibly an older version) of the same module in the same process.
607 // Currently, a shared library that is a member of VNDK (vndk: {enabled: true})
608 // can be double loaded in a vendor process if the library is also a
609 // (direct and indirect) dependency of an LLNDK library. Such libraries must be
610 // explicitly marked as `double_loadable: true` by the owner, or the dependency
611 // from the LLNDK lib should be cut if the lib is not designed to be double loaded.
612 Double_loadable *bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800613
614 // IsLLNDK is set to true for the vendor variant of a cc_library module that has LLNDK stubs.
615 IsLLNDK bool `blueprint:"mutated"`
616
Colin Cross5271fea2021-04-27 13:06:04 -0700617 // IsVendorPublicLibrary is set for the core and product variants of a library that has
618 // vendor_public_library stubs.
619 IsVendorPublicLibrary bool `blueprint:"mutated"`
Colin Crossca860ac2016-01-04 14:34:37 -0800620}
621
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500622// ModuleContextIntf is an interface (on a module context helper) consisting of functions related
623// to understanding details about the type of the current module.
624// For example, one might call these functions to determine whether the current module is a static
625// library and/or is installed in vendor directories.
Colin Crossca860ac2016-01-04 14:34:37 -0800626type ModuleContextIntf interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800627 static() bool
628 staticBinary() bool
Colin Cross6a730042024-12-05 13:53:43 -0800629 staticLibrary() bool
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -0700630 testBinary() bool
Yi Kong56fc1b62022-09-06 16:24:00 +0800631 testLibrary() bool
Jiyong Park1d1119f2019-07-29 21:27:18 +0900632 header() bool
Inseob Kim7f283f42020-06-01 21:53:49 +0900633 binary() bool
Inseob Kim1042d292020-06-01 23:23:05 +0900634 object() bool
Colin Crossb98c8b02016-07-29 13:44:28 -0700635 toolchain() config.Toolchain
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700636 useSdk() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800637 sdkVersion() string
Jiyong Parkb35a8192020-08-10 15:59:36 +0900638 minSdkVersion() string
639 isSdkVariant() bool
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -0700640 useVndk() bool
Colin Cross95f1ca02020-10-29 20:47:22 -0700641 isNdk(config android.Config) bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800642 IsLlndk() bool
Colin Cross127bb8b2020-12-16 16:46:01 -0800643 isImplementationForLLNDKPublic() bool
Colin Cross5271fea2021-04-27 13:06:04 -0700644 IsVendorPublicLibrary() bool
Justin Yun5f7f7e82019-11-18 19:52:14 +0900645 inProduct() bool
646 inVendor() bool
Yifan Hong1b3348d2020-01-21 15:53:22 -0800647 inRamdisk() bool
Yifan Hong60e0cfb2020-10-21 15:17:56 -0700648 inVendorRamdisk() bool
Jiyong Parkf9332f12018-02-01 00:54:12 +0900649 inRecovery() bool
Kiyoung Kimaa394802024-01-08 12:55:45 +0900650 InVendorOrProduct() bool
Dan Willemsen8146b2f2016-03-30 21:00:30 -0700651 selectedStl() string
Colin Crossce75d2c2016-10-06 16:12:58 -0700652 baseModuleName() string
Colin Cross3513fb12024-01-24 14:44:47 -0800653 isAfdoCompile(ctx ModuleContext) bool
Sharjeel Khanc6a93d82023-07-18 21:01:11 +0000654 isOrderfileCompile() bool
Yi Kongc702ebd2022-08-19 16:02:45 +0800655 isCfi() bool
Yi Konged79fa32023-06-04 17:15:42 +0900656 isFuzzer() bool
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -0800657 isNDKStubLibrary() bool
Ivan Lozanobd721262018-11-27 14:33:03 -0800658 useClangLld(actx ModuleContext) bool
Colin Crosse07f2312020-08-13 11:24:56 -0700659 apexVariationName() string
Jiyong Parka4b9dd02019-01-16 22:53:13 +0900660 bootstrap() bool
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700661 nativeCoverage() bool
Colin Cross95b07f22020-12-16 11:06:50 -0800662 isPreventInstall() bool
Cindy Zhou5d5cfc12021-01-09 08:25:22 -0800663 isCfiAssemblySupportEnabled() bool
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800664 getSharedFlags() *SharedFlags
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800665 notInPlatform() bool
Yi Kong5786f5c2024-05-28 02:22:34 +0900666 optimizeForSize() bool
Yu Liu76d94462024-10-31 23:32:36 +0000667 getOrCreateMakeVarsInfo() *CcMakeVarsInfo
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -0800668}
669
670type SharedFlags struct {
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000671 NumSharedFlags int
672 FlagsMap map[string]string
Colin Crossca860ac2016-01-04 14:34:37 -0800673}
674
675type ModuleContext interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700676 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800677 ModuleContextIntf
678}
679
680type BaseModuleContext interface {
Colin Cross0ea8ba82019-06-06 14:33:29 -0700681 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -0800682 ModuleContextIntf
683}
684
Colin Cross37047f12016-12-13 17:06:13 -0800685type DepsContext interface {
686 android.BottomUpMutatorContext
687 ModuleContextIntf
688}
689
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500690// feature represents additional (optional) steps to building cc-related modules, such as invocation
691// of clang-tidy.
Colin Crossca860ac2016-01-04 14:34:37 -0800692type feature interface {
Colin Crossca860ac2016-01-04 14:34:37 -0800693 flags(ctx ModuleContext, flags Flags) Flags
694 props() []interface{}
695}
696
Joe Onorato37f900c2023-07-18 16:58:16 -0700697// Information returned from Generator about the source code it's generating
698type GeneratedSource struct {
699 IncludeDirs android.Paths
700 Sources android.Paths
701 Headers android.Paths
702 ReexportedDirs android.Paths
703}
704
705// generator allows injection of generated code
706type Generator interface {
707 GeneratorProps() []interface{}
708 GeneratorInit(ctx BaseModuleContext)
709 GeneratorDeps(ctx DepsContext, deps Deps) Deps
710 GeneratorFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
711 GeneratorSources(ctx ModuleContext) GeneratedSource
712 GeneratorBuildActions(ctx ModuleContext, flags Flags, deps PathDeps)
713}
714
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500715// compiler is the interface for a compiler helper object. Different module decorators may implement
Liz Kammer718eb272022-01-07 10:53:37 -0500716// this helper differently.
Colin Crossca860ac2016-01-04 14:34:37 -0800717type compiler interface {
Colin Cross42742b82016-08-01 13:20:05 -0700718 compilerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800719 compilerDeps(ctx DepsContext, deps Deps) Deps
Colin Crossf18e1102017-11-16 14:33:08 -0800720 compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags
Colin Cross42742b82016-08-01 13:20:05 -0700721 compilerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000722 baseCompilerProps() BaseCompilerProperties
Colin Cross42742b82016-08-01 13:20:05 -0700723
Colin Cross76fada02016-07-27 10:31:13 -0700724 appendCflags([]string)
725 appendAsflags([]string)
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700726 compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects
Colin Crossca860ac2016-01-04 14:34:37 -0800727}
728
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500729// linker is the interface for a linker decorator object. Individual module types can provide
730// their own implementation for this decorator, and thus specify custom logic regarding build
731// statements pertaining to linking.
Colin Crossca860ac2016-01-04 14:34:37 -0800732type linker interface {
Colin Cross42742b82016-08-01 13:20:05 -0700733 linkerInit(ctx BaseModuleContext)
Colin Cross37047f12016-12-13 17:06:13 -0800734 linkerDeps(ctx DepsContext, deps Deps) Deps
Colin Cross42742b82016-08-01 13:20:05 -0700735 linkerFlags(ctx ModuleContext, flags Flags) Flags
736 linkerProps() []interface{}
Hao Chen1c8ea5b2023-10-20 23:03:45 +0000737 baseLinkerProps() BaseLinkerProperties
Ivan Lozanobd721262018-11-27 14:33:03 -0800738 useClangLld(actx ModuleContext) bool
Colin Cross42742b82016-08-01 13:20:05 -0700739
Dan Willemsen5cb580f2016-09-26 17:33:01 -0700740 link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path
Colin Cross76fada02016-07-27 10:31:13 -0700741 appendLdflags([]string)
Jiyong Parkaf6d8952019-01-31 12:21:23 +0900742 unstrippedOutputFilePath() android.Path
Wei Li5f5d2712023-12-11 15:40:29 -0800743 strippedAllOutputFilePath() android.Path
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -0700744
745 nativeCoverage() bool
Jiyong Parkee9a98d2019-08-09 14:44:36 +0900746 coverageOutputFilePath() android.OptionalPath
Paul Duffin13f02712020-03-06 12:30:43 +0000747
748 // Get the deps that have been explicitly specified in the properties.
Cole Fauste8a87832024-09-11 11:35:46 -0700749 linkerSpecifiedDeps(ctx android.ConfigurableEvaluatorContext, module *Module, specifiedDeps specifiedDeps) specifiedDeps
Colin Cross4a9e6ec2023-12-18 15:29:41 -0800750
751 moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON)
Paul Duffin13f02712020-03-06 12:30:43 +0000752}
753
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500754// specifiedDeps is a tuple struct representing dependencies of a linked binary owned by the linker.
Paul Duffin13f02712020-03-06 12:30:43 +0000755type specifiedDeps struct {
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500756 sharedLibs []string
757 // Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
758 // libc, libm, etc.)
Colin Cross6b8f4252021-07-22 11:39:44 -0700759 systemSharedLibs []string
Colin Crossca860ac2016-01-04 14:34:37 -0800760}
761
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500762// installer is the interface for an installer helper object. This helper is responsible for
763// copying build outputs to the appropriate locations so that they may be installed on device.
Colin Crossca860ac2016-01-04 14:34:37 -0800764type installer interface {
Colin Cross42742b82016-08-01 13:20:05 -0700765 installerProps() []interface{}
Colin Cross635c3b02016-05-18 15:37:25 -0700766 install(ctx ModuleContext, path android.Path)
Paul Duffin0cb37b92020-03-04 14:52:46 +0000767 everInstallable() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800768 inData() bool
Vishwath Mohan1dd88392017-03-29 22:00:18 -0700769 inSanitizerDir() bool
Dan Willemsen4aa75ca2016-09-28 16:18:03 -0700770 hostToolPath() android.OptionalPath
Jiyong Parkb7c24df2019-02-01 12:03:59 +0900771 relativeInstallPath() string
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +0000772 makeUninstallable(mod *Module)
Inseob Kim800d1142021-06-14 12:03:51 +0900773 installInRoot() bool
Colin Crossca860ac2016-01-04 14:34:37 -0800774}
775
Inseob Kima1888ce2022-10-04 14:42:02 +0900776type overridable interface {
777 overriddenModules() []string
778}
779
Colin Cross6e511a92020-07-27 21:26:48 -0700780type libraryDependencyKind int
781
782const (
783 headerLibraryDependency = iota
784 sharedLibraryDependency
785 staticLibraryDependency
Ivan Lozano0a468a42024-05-13 21:03:34 -0400786 rlibLibraryDependency
Colin Cross6e511a92020-07-27 21:26:48 -0700787)
788
789func (k libraryDependencyKind) String() string {
790 switch k {
791 case headerLibraryDependency:
792 return "headerLibraryDependency"
793 case sharedLibraryDependency:
794 return "sharedLibraryDependency"
795 case staticLibraryDependency:
796 return "staticLibraryDependency"
Ivan Lozano0a468a42024-05-13 21:03:34 -0400797 case rlibLibraryDependency:
798 return "rlibLibraryDependency"
Colin Cross6e511a92020-07-27 21:26:48 -0700799 default:
800 panic(fmt.Errorf("unknown libraryDependencyKind %d", k))
801 }
802}
803
804type libraryDependencyOrder int
805
806const (
807 earlyLibraryDependency = -1
808 normalLibraryDependency = 0
809 lateLibraryDependency = 1
810)
811
812func (o libraryDependencyOrder) String() string {
813 switch o {
814 case earlyLibraryDependency:
815 return "earlyLibraryDependency"
816 case normalLibraryDependency:
817 return "normalLibraryDependency"
818 case lateLibraryDependency:
819 return "lateLibraryDependency"
820 default:
821 panic(fmt.Errorf("unknown libraryDependencyOrder %d", o))
822 }
823}
824
825// libraryDependencyTag is used to tag dependencies on libraries. Unlike many dependency
826// tags that have a set of predefined tag objects that are reused for each dependency, a
827// libraryDependencyTag is designed to contain extra metadata and is constructed as needed.
828// That means that comparing a libraryDependencyTag for equality will only be equal if all
829// of the metadata is equal. Most usages will want to type assert to libraryDependencyTag and
830// then check individual metadata fields instead.
831type libraryDependencyTag struct {
832 blueprint.BaseDependencyTag
833
834 // These are exported so that fmt.Printf("%#v") can call their String methods.
835 Kind libraryDependencyKind
836 Order libraryDependencyOrder
837
838 wholeStatic bool
839
840 reexportFlags bool
841 explicitlyVersioned bool
Colin Crossbd930bc2025-02-03 12:17:42 -0800842 explicitlyImpl bool
Colin Cross6e511a92020-07-27 21:26:48 -0700843 dataLib bool
844 ndk bool
845
846 staticUnwinder bool
847
848 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900849
Cindy Zhou18417cb2020-12-10 07:12:38 -0800850 // Whether or not this dependency should skip the apex dependency check
851 skipApexAllowedDependenciesCheck bool
852
Jiyong Parke3867542020-12-03 17:28:25 +0900853 // Whether or not this dependency has to be followed for the apex variants
854 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900855 // Whether or not this dependency has to be followed for the non-apex variants
856 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000857
858 // If true, don't automatically export symbols from the static library into a shared library.
859 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700860}
861
862// header returns true if the libraryDependencyTag is tagging a header lib dependency.
863func (d libraryDependencyTag) header() bool {
864 return d.Kind == headerLibraryDependency
865}
866
867// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
868func (d libraryDependencyTag) shared() bool {
869 return d.Kind == sharedLibraryDependency
870}
871
872// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
873func (d libraryDependencyTag) static() bool {
874 return d.Kind == staticLibraryDependency
875}
876
Colin Cross65cb3142021-12-10 23:05:02 +0000877func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
878 if d.shared() {
879 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
880 }
881 return nil
882}
883
884var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
885
Colin Crosse9fe2942020-11-10 18:12:15 -0800886// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
887// binaries or other shared libraries are installed as dependencies.
888func (d libraryDependencyTag) InstallDepNeeded() bool {
889 return d.shared()
890}
891
892var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
893
Yu Liu67a28422024-03-05 00:36:31 +0000894func (d libraryDependencyTag) PropagateAconfigValidation() bool {
895 return d.static()
896}
897
898var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
899
Colin Crosse9fe2942020-11-10 18:12:15 -0800900// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700901// libraryDependencyTag. Each tag object is created globally and reused for multiple
902// dependencies (although since the object contains no references, assigning a tag to a
903// variable and modifying it will not modify the original). Users can compare the tag
904// returned by ctx.OtherModuleDependencyTag against the global original
905type dependencyTag struct {
906 blueprint.BaseDependencyTag
907 name string
908}
909
Colin Crosse9fe2942020-11-10 18:12:15 -0800910// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
911// libraryDependencyTag, but where the dependency needs to be installed when the parent is
912// installed.
913type installDependencyTag struct {
914 blueprint.BaseDependencyTag
915 android.InstallAlwaysNeededDependencyTag
916 name string
917}
918
Colin Crossc99deeb2016-04-11 15:06:20 -0700919var (
Colin Cross6e511a92020-07-27 21:26:48 -0700920 genSourceDepTag = dependencyTag{name: "gen source"}
921 genHeaderDepTag = dependencyTag{name: "gen header"}
922 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
923 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900924 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700925 reuseObjTag = dependencyTag{name: "reuse objects"}
926 staticVariantTag = dependencyTag{name: "static variant"}
927 vndkExtDepTag = dependencyTag{name: "vndk extends"}
928 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700929 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800930 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000931 StubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000932 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500933 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400934 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800935 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700936)
937
Colin Crossbd930bc2025-02-03 12:17:42 -0800938func IsExplicitImplSharedDepTag(depTag blueprint.DependencyTag) bool {
939 ccLibDepTag, ok := depTag.(libraryDependencyTag)
940 return ok && ccLibDepTag.shared() && ccLibDepTag.explicitlyImpl
941}
942
Roland Levillainf89cd092019-07-29 16:22:59 +0100943func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700944 ccLibDepTag, ok := depTag.(libraryDependencyTag)
945 return ok && ccLibDepTag.shared()
946}
947
948func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
949 ccLibDepTag, ok := depTag.(libraryDependencyTag)
950 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100951}
952
Zach Johnson3df4e632020-11-06 11:56:27 -0800953func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
954 ccLibDepTag, ok := depTag.(libraryDependencyTag)
955 return ok && ccLibDepTag.header()
956}
957
Roland Levillainf89cd092019-07-29 16:22:59 +0100958func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800959 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100960}
961
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000962func ExcludeInApexDepTag(depTag blueprint.DependencyTag) bool {
963 ccLibDepTag, ok := depTag.(libraryDependencyTag)
964 return ok && ccLibDepTag.excludeInApex
965}
966
Colin Crossca860ac2016-01-04 14:34:37 -0800967// Module contains the properties and members used by all C/C++ module types, and implements
968// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500969// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
970// interface.
971//
972// To define a C/C++ related module, construct a new Module object and point its delegates to
973// type-specific structs. These delegates will be invoked to register module-specific build
974// statements which may be unique to the module type. For example, module.compiler.compile() should
975// be defined so as to register build statements which are responsible for compiling the module.
976//
977// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
978// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
979// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
980// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800981type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700982 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700983
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700984 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700985 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700986 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700987
Colin Crossca860ac2016-01-04 14:34:37 -0800988 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +0000989 hod android.HostOrDeviceSupported
990 multilib android.Multilib
991 testModule bool
992 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -0700993
Paul Duffina0843f62019-12-13 19:50:38 +0000994 // Allowable SdkMemberTypes of this module type.
995 sdkMemberTypes []android.SdkMemberType
996
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500997 // decorator delegates, initialize before calling Init
998 // these may contain module-specific implementations, and effectively allow for custom
999 // type-specific logic. These members may reference different objects or the same object.
1000 // Functions of these decorators will be invoked to initialize and register type-specific
1001 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -08001002 generators []Generator
1003 compiler compiler
1004 linker linker
1005 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -05001006
Spandan Dase12d2522023-09-12 21:42:31 +00001007 features []feature
1008 stl *stl
1009 sanitize *sanitize
1010 coverage *coverage
1011 fuzzer *fuzzer
1012 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +00001013 lto *lto
1014 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001015 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -08001016
Colin Cross31076b32020-10-23 17:22:06 -07001017 library libraryInterface
1018
Colin Cross635c3b02016-05-18 15:37:25 -07001019 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -08001020
Colin Crossb98c8b02016-07-29 13:44:28 -07001021 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -07001022
Yu Liue70976d2024-10-15 20:45:35 +00001023 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001024
1025 // Flags used to compile this module
1026 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -07001027
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001028 // Shared flags among build rules of this module
1029 sharedFlags SharedFlags
1030
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08001031 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -07001032 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001033
1034 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001035
1036 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001037 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001038
1039 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001040
Inseob Kim37e0bb02024-04-29 15:54:44 +09001041 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001042
1043 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001044
1045 hasAidl bool
1046 hasLex bool
1047 hasProto bool
1048 hasRenderscript bool
1049 hasSysprop bool
1050 hasWinMsg bool
1051 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001052
1053 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001054}
1055
Yu Liu76d94462024-10-31 23:32:36 +00001056func (c *Module) IncrementalSupported() bool {
1057 return c.incremental
1058}
1059
1060var _ blueprint.Incremental = (*Module)(nil)
1061
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001062func (c *Module) AddJSONData(d *map[string]interface{}) {
1063 c.AndroidModuleBase().AddJSONData(d)
1064 (*d)["Cc"] = map[string]interface{}{
1065 "SdkVersion": c.SdkVersion(),
1066 "MinSdkVersion": c.MinSdkVersion(),
1067 "VndkVersion": c.VndkVersion(),
1068 "ProductSpecific": c.ProductSpecific(),
1069 "SocSpecific": c.SocSpecific(),
1070 "DeviceSpecific": c.DeviceSpecific(),
1071 "InProduct": c.InProduct(),
1072 "InVendor": c.InVendor(),
1073 "InRamdisk": c.InRamdisk(),
1074 "InVendorRamdisk": c.InVendorRamdisk(),
1075 "InRecovery": c.InRecovery(),
1076 "VendorAvailable": c.VendorAvailable(),
1077 "ProductAvailable": c.ProductAvailable(),
1078 "RamdiskAvailable": c.RamdiskAvailable(),
1079 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1080 "RecoveryAvailable": c.RecoveryAvailable(),
1081 "OdmAvailable": c.OdmAvailable(),
1082 "InstallInData": c.InstallInData(),
1083 "InstallInRamdisk": c.InstallInRamdisk(),
1084 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1085 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1086 "InstallInRecovery": c.InstallInRecovery(),
1087 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001088 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001089 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1090 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001091 "AidlSrcs": c.hasAidl,
1092 "LexSrcs": c.hasLex,
1093 "ProtoSrcs": c.hasProto,
1094 "RenderscriptSrcs": c.hasRenderscript,
1095 "SyspropSrcs": c.hasSysprop,
1096 "WinMsgSrcs": c.hasWinMsg,
1097 "YaccSrsc": c.hasYacc,
1098 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001099 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001100 }
1101}
1102
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001103func (c *Module) SetPreventInstall() {
1104 c.Properties.PreventInstall = true
1105}
1106
1107func (c *Module) SetHideFromMake() {
1108 c.Properties.HideFromMake = true
1109}
1110
Ivan Lozanod7586b62021-04-01 09:49:36 -04001111func (c *Module) HiddenFromMake() bool {
1112 return c.Properties.HideFromMake
1113}
1114
Cole Fauste8a87832024-09-11 11:35:46 -07001115func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001116 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001117 if c.ImageVariation().Variation == android.CoreVariation {
1118 required = append(required, c.Properties.Target.Platform.Required...)
1119 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1120 } else if c.InRecovery() {
1121 required = append(required, c.Properties.Target.Recovery.Required...)
1122 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1123 }
1124 return android.FirstUniqueStrings(required)
1125}
1126
Ivan Lozano52767be2019-10-18 14:49:46 -07001127func (c *Module) Toc() android.OptionalPath {
1128 if c.linker != nil {
1129 if library, ok := c.linker.(libraryInterface); ok {
1130 return library.toc()
1131 }
1132 }
1133 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1134}
1135
1136func (c *Module) ApiLevel() string {
1137 if c.linker != nil {
1138 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001139 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001140 }
1141 }
1142 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1143}
1144
1145func (c *Module) Static() bool {
1146 if c.linker != nil {
1147 if library, ok := c.linker.(libraryInterface); ok {
1148 return library.static()
1149 }
1150 }
1151 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1152}
1153
1154func (c *Module) Shared() bool {
1155 if c.linker != nil {
1156 if library, ok := c.linker.(libraryInterface); ok {
1157 return library.shared()
1158 }
1159 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001160
Ivan Lozano52767be2019-10-18 14:49:46 -07001161 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1162}
1163
1164func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001165 if c.stl != nil {
1166 return c.stl.Properties.SelectedStl
1167 }
1168 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001169}
1170
Ivan Lozano52767be2019-10-18 14:49:46 -07001171func (c *Module) StubDecorator() bool {
1172 if _, ok := c.linker.(*stubDecorator); ok {
1173 return true
1174 }
1175 return false
1176}
1177
Yi Kong5786f5c2024-05-28 02:22:34 +09001178func (c *Module) OptimizeForSize() bool {
1179 return Bool(c.Properties.Optimize_for_size)
1180}
1181
Ivan Lozano52767be2019-10-18 14:49:46 -07001182func (c *Module) SdkVersion() string {
1183 return String(c.Properties.Sdk_version)
1184}
1185
Artur Satayev480e25b2020-04-27 18:53:18 +01001186func (c *Module) MinSdkVersion() string {
1187 return String(c.Properties.Min_sdk_version)
1188}
1189
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001190func (c *Module) SetSdkVersion(s string) {
1191 c.Properties.Sdk_version = StringPtr(s)
1192}
1193
1194func (c *Module) SetMinSdkVersion(s string) {
1195 c.Properties.Min_sdk_version = StringPtr(s)
1196}
1197
1198func (c *Module) SetStl(s string) {
1199 if c.stl != nil {
1200 c.stl.Properties.Stl = StringPtr(s)
1201 }
1202}
1203
1204func (c *Module) IsCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001205 if linker, ok := c.linker.(*objectLinker); ok {
1206 return linker.isCrt()
1207 }
1208 return false
1209}
1210
Jiyong Park5df7bd32021-08-25 16:18:46 +09001211func (c *Module) SplitPerApiLevel() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001212 return CanUseSdk(c) && c.IsCrt()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001213}
1214
Colin Crossc511bc52020-04-07 16:50:32 +00001215func (c *Module) AlwaysSdk() bool {
1216 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1217}
1218
Ivan Lozano183a3212019-10-18 14:18:45 -07001219func (c *Module) CcLibrary() bool {
1220 if c.linker != nil {
1221 if _, ok := c.linker.(*libraryDecorator); ok {
1222 return true
1223 }
Colin Crossd48fe732020-09-23 20:37:24 -07001224 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1225 return true
1226 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001227 }
1228 return false
1229}
1230
1231func (c *Module) CcLibraryInterface() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001232 if c.library != nil {
Ivan Lozano183a3212019-10-18 14:18:45 -07001233 return true
1234 }
1235 return false
1236}
1237
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001238func (c *Module) RlibStd() bool {
1239 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1240}
1241
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001242func (c *Module) RustLibraryInterface() bool {
1243 return false
1244}
1245
Ivan Lozano0a468a42024-05-13 21:03:34 -04001246func (c *Module) CrateName() string {
1247 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1248}
1249
1250func (c *Module) ExportedCrateLinkDirs() []string {
1251 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1252}
1253
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001254func (c *Module) IsFuzzModule() bool {
1255 if _, ok := c.compiler.(*fuzzBinary); ok {
1256 return true
1257 }
1258 return false
1259}
1260
1261func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1262 return c.FuzzModule
1263}
1264
1265func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1266 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1267 return fuzzer.fuzzPackagedModule
1268 }
1269 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1270}
1271
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001272func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001273 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1274 return fuzzer.sharedLibraries
1275 }
1276 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1277}
1278
Ivan Lozano2b262972019-11-21 12:30:50 -08001279func (c *Module) NonCcVariants() bool {
1280 return false
1281}
1282
Ivan Lozano183a3212019-10-18 14:18:45 -07001283func (c *Module) SetStatic() {
1284 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001285 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001286 library.setStatic()
1287 return
1288 }
1289 }
1290 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1291}
1292
1293func (c *Module) SetShared() {
1294 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001295 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001296 library.setShared()
1297 return
1298 }
1299 }
1300 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1301}
1302
1303func (c *Module) BuildStaticVariant() bool {
1304 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001305 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001306 return library.buildStatic()
1307 }
1308 }
1309 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1310}
1311
1312func (c *Module) BuildSharedVariant() bool {
1313 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001314 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001315 return library.buildShared()
1316 }
1317 }
1318 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1319}
1320
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001321func (c *Module) BuildRlibVariant() bool {
1322 // cc modules can never build rlib variants
1323 return false
1324}
1325
Ivan Lozano183a3212019-10-18 14:18:45 -07001326func (c *Module) Module() android.Module {
1327 return c
1328}
1329
Jiyong Parkc20eee32018-09-05 22:36:17 +09001330func (c *Module) OutputFile() android.OptionalPath {
1331 return c.outputFile
1332}
1333
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001334func (c *Module) CoverageFiles() android.Paths {
1335 if c.linker != nil {
1336 if library, ok := c.linker.(libraryInterface); ok {
1337 return library.objs().coverageFiles
1338 }
1339 }
1340 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1341}
1342
Ivan Lozano183a3212019-10-18 14:18:45 -07001343var _ LinkableInterface = (*Module)(nil)
1344
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001345func (c *Module) VersionedInterface() VersionedInterface {
1346 if c.library != nil {
1347 return c.library
1348 }
1349 return nil
1350}
1351
Jiyong Park719b4462019-01-13 00:39:51 +09001352func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001353 if c.linker != nil {
1354 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001355 }
1356 return nil
1357}
1358
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001359func (c *Module) CoverageOutputFile() android.OptionalPath {
1360 if c.linker != nil {
1361 return c.linker.coverageOutputFilePath()
1362 }
1363 return android.OptionalPath{}
1364}
1365
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001366func (c *Module) RelativeInstallPath() string {
1367 if c.installer != nil {
1368 return c.installer.relativeInstallPath()
1369 }
1370 return ""
1371}
1372
Jooyung Han344d5432019-08-23 11:17:39 +09001373func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001374 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001375}
1376
Colin Cross36242852017-06-23 15:06:31 -07001377func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001378 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001379 for _, generator := range c.generators {
1380 c.AddProperties(generator.GeneratorProps()...)
1381 }
Colin Crossca860ac2016-01-04 14:34:37 -08001382 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001383 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001384 }
1385 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001386 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001387 }
1388 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001389 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001390 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001391 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001392 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001393 }
Colin Cross16b23492016-01-06 14:41:07 -08001394 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001395 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001396 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001397 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001398 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001399 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001400 if c.fuzzer != nil {
1401 c.AddProperties(c.fuzzer.props()...)
1402 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001403 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001404 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001405 }
Stephen Craneba090d12017-05-09 15:44:35 -07001406 if c.lto != nil {
1407 c.AddProperties(c.lto.props()...)
1408 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001409 if c.afdo != nil {
1410 c.AddProperties(c.afdo.props()...)
1411 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001412 if c.orderfile != nil {
1413 c.AddProperties(c.orderfile.props()...)
1414 }
Colin Crossca860ac2016-01-04 14:34:37 -08001415 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001416 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001417 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001418 // Allow test-only on libraries that are not cc_test_library
1419 if c.library != nil && !c.testLibrary() {
1420 c.AddProperties(&c.sourceProperties)
1421 }
Colin Crossc472d572015-03-17 15:06:21 -07001422
Colin Cross36242852017-06-23 15:06:31 -07001423 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001424 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001425 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001426
Colin Cross36242852017-06-23 15:06:31 -07001427 return c
Colin Crossc472d572015-03-17 15:06:21 -07001428}
1429
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001430// UseVndk() returns true if this module is built against VNDK.
1431// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001432func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001433 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001434}
1435
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001436func CanUseSdk(c LinkableInterface) bool {
1437 return c.Module().Target().Os == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001438 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001439}
1440
1441func (c *Module) UseSdk() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001442 if CanUseSdk(c) {
Colin Cross1348ce32020-10-01 13:37:16 -07001443 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001444 }
1445 return false
1446}
1447
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001448func (c *Module) isCoverageVariant() bool {
1449 return c.coverage.Properties.IsCoverageVariant
1450}
1451
Colin Cross95f1ca02020-10-29 20:47:22 -07001452func (c *Module) IsNdk(config android.Config) bool {
1453 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001454}
1455
Colin Cross127bb8b2020-12-16 16:46:01 -08001456func (c *Module) IsLlndk() bool {
1457 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001458}
1459
Colin Cross1f3f1302021-04-26 18:37:44 -07001460func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001461 lib := moduleVersionedInterface(m)
1462 return lib != nil && (lib.HasLLNDKStubs() || lib.HasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001463}
1464
Colin Cross5271fea2021-04-27 13:06:04 -07001465func (m *Module) NeedsVendorPublicLibraryVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001466 lib := moduleVersionedInterface(m)
1467 return lib != nil && (lib.HasVendorPublicLibrary())
Colin Cross5271fea2021-04-27 13:06:04 -07001468}
1469
1470// IsVendorPublicLibrary returns true for vendor public libraries.
1471func (c *Module) IsVendorPublicLibrary() bool {
1472 return c.VendorProperties.IsVendorPublicLibrary
1473}
1474
Ivan Lozanof1868af2022-04-12 13:08:36 -04001475func (c *Module) IsVndkPrebuiltLibrary() bool {
1476 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1477 return true
1478 }
1479 return false
1480}
1481
1482func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1483 return c.Properties.SdkAndPlatformVariantVisibleToMake
1484}
1485
Ivan Lozanod7586b62021-04-01 09:49:36 -04001486func (c *Module) HasLlndkStubs() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001487 lib := moduleVersionedInterface(c)
1488 return lib != nil && lib.HasLLNDKStubs()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001489}
1490
1491func (c *Module) StubsVersion() string {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001492 if lib, ok := c.linker.(VersionedInterface); ok {
1493 return lib.StubsVersion()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001494 }
1495 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1496}
1497
Colin Cross127bb8b2020-12-16 16:46:01 -08001498// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1499// and does not set llndk.vendor_available: false.
1500func (c *Module) isImplementationForLLNDKPublic() bool {
1501 library, _ := c.library.(*libraryDecorator)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001502 return library != nil && library.HasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001503 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001504}
1505
Colin Cross3513fb12024-01-24 14:44:47 -08001506func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001507 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001508 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001509 }
1510 return false
1511}
1512
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001513func (c *Module) isOrderfileCompile() bool {
1514 if orderfile := c.orderfile; orderfile != nil {
1515 return orderfile.Properties.OrderfileLoad
1516 }
1517 return false
1518}
1519
Yi Kongc702ebd2022-08-19 16:02:45 +08001520func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001521 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001522}
1523
Yi Konged79fa32023-06-04 17:15:42 +09001524func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001525 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001526}
1527
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001528func (c *Module) isNDKStubLibrary() bool {
1529 if _, ok := c.compiler.(*stubDecorator); ok {
1530 return true
1531 }
1532 return false
1533}
1534
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001535func (c *Module) SubName() string {
1536 return c.Properties.SubName
1537}
1538
Jiyong Park25fc6a92018-11-18 18:02:45 +09001539func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001540 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001541 return lib.BuildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001542 }
1543 return false
1544}
1545
1546func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001547 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001548 return lib.HasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001549 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001550 return false
1551}
1552
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001553func (c *Module) RustApexExclude() bool {
1554 return false
1555}
1556
Alan Stokes73feba32022-11-14 12:21:24 +00001557func (c *Module) IsStubsImplementationRequired() bool {
1558 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001559 return lib.IsStubsImplementationRequired()
Alan Stokes73feba32022-11-14 12:21:24 +00001560 }
1561 return false
1562}
1563
Colin Cross0477b422020-10-13 18:43:54 -07001564// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1565// the implementation. If it is an implementation library it returns its own name.
1566func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1567 name := ctx.OtherModuleName(c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001568 if versioned, ok := c.linker.(VersionedInterface); ok {
1569 name = versioned.ImplementationModuleName(name)
Colin Cross0477b422020-10-13 18:43:54 -07001570 }
1571 return name
1572}
1573
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001574// Similar to ImplementationModuleNameByCtx, but uses the Make variant of the module
Martin Stjernholm2856c662020-12-02 15:03:42 +00001575// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1576// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1577// under the premise that the prebuilt module overrides its source counterpart
1578// if it is exposed to Make).
1579func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1580 name := c.BaseModuleName()
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001581 if versioned, ok := c.linker.(VersionedInterface); ok {
1582 name = versioned.ImplementationModuleName(name)
Martin Stjernholm2856c662020-12-02 15:03:42 +00001583 }
1584 return name
1585}
1586
Jiyong Park7d55b612021-06-11 17:22:09 +09001587func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001588 return Bool(c.Properties.Bootstrap)
1589}
1590
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001591func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001592 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1593 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1594 return false
1595 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001596 return c.linker != nil && c.linker.nativeCoverage()
1597}
1598
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001599func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001600 if p, ok := c.linker.(SnapshotInterface); ok {
1601 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001602 }
1603 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001604}
1605
Jiyong Parkf1194352019-02-25 11:05:47 +09001606func isBionic(name string) bool {
1607 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001608 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001609 return true
1610 }
1611 return false
1612}
1613
Martin Stjernholm279de572019-09-10 23:18:20 +01001614func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001615 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001616 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001617 }
1618 return isBionic(name)
1619}
1620
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001621func (c *Module) isCfiAssemblySupportEnabled() bool {
1622 return c.sanitize != nil &&
1623 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1624}
1625
Inseob Kim800d1142021-06-14 12:03:51 +09001626func (c *Module) InstallInRoot() bool {
1627 return c.installer != nil && c.installer.installInRoot()
1628}
1629
Colin Crossca860ac2016-01-04 14:34:37 -08001630type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001631 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001632 moduleContextImpl
1633}
1634
Colin Cross37047f12016-12-13 17:06:13 -08001635type depsContext struct {
1636 android.BottomUpMutatorContext
1637 moduleContextImpl
1638}
1639
Colin Crossca860ac2016-01-04 14:34:37 -08001640type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001641 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001642 moduleContextImpl
1643}
1644
1645type moduleContextImpl struct {
1646 mod *Module
1647 ctx BaseModuleContext
1648}
1649
Colin Crossb98c8b02016-07-29 13:44:28 -07001650func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001651 return ctx.mod.toolchain(ctx.ctx)
1652}
1653
1654func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001655 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001656}
1657
1658func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001659 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001660}
1661
Colin Cross6a730042024-12-05 13:53:43 -08001662func (ctx *moduleContextImpl) staticLibrary() bool {
1663 return ctx.mod.staticLibrary()
1664}
1665
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001666func (ctx *moduleContextImpl) testBinary() bool {
1667 return ctx.mod.testBinary()
1668}
1669
Yi Kong56fc1b62022-09-06 16:24:00 +08001670func (ctx *moduleContextImpl) testLibrary() bool {
1671 return ctx.mod.testLibrary()
1672}
1673
Jiyong Park1d1119f2019-07-29 21:27:18 +09001674func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001675 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001676}
1677
Inseob Kim7f283f42020-06-01 21:53:49 +09001678func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001679 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001680}
1681
Inseob Kim1042d292020-06-01 23:23:05 +09001682func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001683 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001684}
1685
Yi Kong5786f5c2024-05-28 02:22:34 +09001686func (ctx *moduleContextImpl) optimizeForSize() bool {
1687 return ctx.mod.OptimizeForSize()
1688}
1689
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001690func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001691 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001692}
1693
1694func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001695 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001696 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001697 }
1698 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001699}
1700
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001701func MinSdkVersion(mod VersionedLinkableInterface, ctxIsForPlatform bool, device bool,
1702 platformSdkVersion string) string {
1703
1704 ver := mod.MinSdkVersion()
1705 if ver == "apex_inherit" && !ctxIsForPlatform {
1706 ver = mod.ApexSdkVersion().String()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001707 }
1708 if ver == "apex_inherit" || ver == "" {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001709 ver = mod.SdkVersion()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001710 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001711
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001712 if device {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001713 // When building for vendor/product, use the latest _stable_ API as "current".
1714 // This is passed to clang/aidl compilers so that compiled/generated code works
1715 // with the system.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001716 if (mod.InVendor() || mod.InProduct()) && (ver == "" || ver == "current") {
1717 ver = platformSdkVersion
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001718 }
1719 }
1720
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001721 // For crt objects, the meaning of min_sdk_version is very different from other types of
1722 // module. For them, min_sdk_version defines the oldest version that the build system will
1723 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1724 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1725 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001726 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1727 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1728 // support such an old version. The version is set to the later version in case when the
1729 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1730 // it's for an APEX.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001731 if mod.IsCrt() && !mod.IsSdkVariant() {
1732 if ctxIsForPlatform {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001733 ver = strconv.Itoa(android.FutureApiLevelInt)
1734 } else { // for apex
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001735 ver = mod.ApexSdkVersion().String()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001736 if ver == "" { // in case when min_sdk_version was not set by the APEX
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001737 ver = mod.SdkVersion()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001738 }
1739 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001740 }
1741
Jiyong Parkb35a8192020-08-10 15:59:36 +09001742 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001743 sdkVersionInt, err := strconv.Atoi(mod.SdkVersion())
Jiyong Parkb35a8192020-08-10 15:59:36 +09001744 minSdkVersionInt, err2 := strconv.Atoi(ver)
1745 if err == nil && err2 == nil {
1746 if sdkVersionInt < minSdkVersionInt {
1747 return strconv.Itoa(sdkVersionInt)
1748 }
1749 }
1750 return ver
1751}
1752
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001753func (ctx *moduleContextImpl) minSdkVersion() string {
1754 platformSdkVersion := ""
1755 if ctx.ctx.Device() {
1756 platformSdkVersion = ctx.ctx.Config().PlatformSdkVersion().String()
1757 }
1758 return MinSdkVersion(ctx.mod, CtxIsForPlatform(ctx.ctx), ctx.ctx.Device(), platformSdkVersion)
1759}
1760
Jiyong Parkb35a8192020-08-10 15:59:36 +09001761func (ctx *moduleContextImpl) isSdkVariant() bool {
1762 return ctx.mod.IsSdkVariant()
1763}
1764
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001765func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001766 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001767}
Justin Yun8effde42017-06-23 19:24:43 +09001768
Kiyoung Kimaa394802024-01-08 12:55:45 +09001769func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1770 return ctx.mod.InVendorOrProduct()
1771}
1772
Colin Cross95f1ca02020-10-29 20:47:22 -07001773func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1774 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001775}
1776
Colin Cross127bb8b2020-12-16 16:46:01 -08001777func (ctx *moduleContextImpl) IsLlndk() bool {
1778 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001779}
1780
Colin Cross127bb8b2020-12-16 16:46:01 -08001781func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1782 return ctx.mod.isImplementationForLLNDKPublic()
1783}
1784
Colin Cross3513fb12024-01-24 14:44:47 -08001785func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1786 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001787}
1788
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001789func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1790 return ctx.mod.isOrderfileCompile()
1791}
1792
Yi Kongc702ebd2022-08-19 16:02:45 +08001793func (ctx *moduleContextImpl) isCfi() bool {
1794 return ctx.mod.isCfi()
1795}
1796
Yi Konged79fa32023-06-04 17:15:42 +09001797func (ctx *moduleContextImpl) isFuzzer() bool {
1798 return ctx.mod.isFuzzer()
1799}
1800
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001801func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1802 return ctx.mod.isNDKStubLibrary()
1803}
1804
Colin Cross5271fea2021-04-27 13:06:04 -07001805func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1806 return ctx.mod.IsVendorPublicLibrary()
1807}
1808
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001809func (ctx *moduleContextImpl) selectedStl() string {
1810 if stl := ctx.mod.stl; stl != nil {
1811 return stl.Properties.SelectedStl
1812 }
1813 return ""
1814}
1815
Ivan Lozanobd721262018-11-27 14:33:03 -08001816func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1817 return ctx.mod.linker.useClangLld(actx)
1818}
1819
Colin Crossce75d2c2016-10-06 16:12:58 -07001820func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001821 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001822}
1823
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001824func CtxIsForPlatform(ctx android.BaseModuleContext) bool {
1825 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Colin Crossff694a82023-12-13 15:54:49 -08001826 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001827}
1828
Colin Crosse07f2312020-08-13 11:24:56 -07001829func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001830 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1831 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001832}
1833
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001834func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001835 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001836}
1837
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001838func (ctx *moduleContextImpl) nativeCoverage() bool {
1839 return ctx.mod.nativeCoverage()
1840}
1841
Colin Cross95b07f22020-12-16 11:06:50 -08001842func (ctx *moduleContextImpl) isPreventInstall() bool {
1843 return ctx.mod.Properties.PreventInstall
1844}
1845
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001846func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1847 shared := &ctx.mod.sharedFlags
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001848 if shared.FlagsMap == nil {
1849 shared.NumSharedFlags = 0
1850 shared.FlagsMap = make(map[string]string)
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001851 }
1852 return shared
1853}
1854
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001855func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1856 return ctx.mod.isCfiAssemblySupportEnabled()
1857}
1858
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001859func (ctx *moduleContextImpl) notInPlatform() bool {
1860 return ctx.mod.NotInPlatform()
1861}
1862
Yu Liu76d94462024-10-31 23:32:36 +00001863func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1864 if ctx.mod.makeVarsInfo == nil {
1865 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1866 }
1867 return ctx.mod.makeVarsInfo
1868}
1869
Colin Cross635c3b02016-05-18 15:37:25 -07001870func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001871 return &Module{
1872 hod: hod,
1873 multilib: multilib,
1874 }
1875}
1876
Colin Cross635c3b02016-05-18 15:37:25 -07001877func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001878 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001879 module.features = []feature{
1880 &tidyFeature{},
1881 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001882 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001883 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001884 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001885 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001886 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001887 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001888 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001889 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001890 return module
1891}
1892
Colin Crossce75d2c2016-10-06 16:12:58 -07001893func (c *Module) Prebuilt() *android.Prebuilt {
1894 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1895 return p.prebuilt()
1896 }
1897 return nil
1898}
1899
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001900func (c *Module) IsPrebuilt() bool {
1901 return c.Prebuilt() != nil
1902}
1903
Colin Crossce75d2c2016-10-06 16:12:58 -07001904func (c *Module) Name() string {
1905 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001906 if p, ok := c.linker.(interface {
1907 Name(string) string
1908 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001909 name = p.Name(name)
1910 }
1911 return name
1912}
1913
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001914func (c *Module) Multilib() string {
1915 return c.Arch().ArchType.Multilib
1916}
1917
1918func (c *Module) ApexSdkVersion() android.ApiLevel {
1919 return c.apexSdkVersion
1920}
1921
Alex Light3d673592019-01-18 14:37:31 -08001922func (c *Module) Symlinks() []string {
1923 if p, ok := c.installer.(interface {
1924 symlinkList() []string
1925 }); ok {
1926 return p.symlinkList()
1927 }
1928 return nil
1929}
1930
Chris Parsons216e10a2020-07-09 17:12:52 -04001931func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001932 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001933 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001934 }); ok {
1935 return p.dataPaths()
1936 }
1937 return nil
1938}
1939
Ivan Lozanof1868af2022-04-12 13:08:36 -04001940func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001941 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1942 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001943 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001944 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001945 if c.ProductSpecific() {
1946 // If the module is product specific with 'product_specific: true',
1947 // do not add a name suffix because it is a base module.
1948 return ""
1949 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001950 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001951 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001952 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001953 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001954 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001955 // add version suffix only if the module is using different vndk version than the
1956 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001957 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001958 }
1959 return nameSuffix
1960}
1961
Ivan Lozanof1868af2022-04-12 13:08:36 -04001962func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1963 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001964
1965 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001966 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001967 }
1968
Colin Cross127bb8b2020-12-16 16:46:01 -08001969 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001970 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001971 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1972 // added for product variant only when we have vendor and product variants with core
1973 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001974 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001975 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001976 subName += vendorPublicLibrarySuffix
1977 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001978 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1979 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001980 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001981 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001982 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001983 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001984 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001985 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001986 subName += RecoverySuffix
1987 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1988 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001989 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001990 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001991 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001992 } else if c.IsStubs() && c.IsSdkVariant() {
1993 // Public API surface (NDK)
1994 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1995 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001996 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001997
1998 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001999}
2000
Sam Delmerico75dbca22023-04-20 13:13:25 +00002001func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
2002 ctx := &moduleContext{
2003 ModuleContext: actx,
2004 moduleContextImpl: moduleContextImpl{
2005 mod: c,
2006 },
2007 }
2008 ctx.ctx = ctx
2009 return ctx
2010}
2011
Spandan Das20fce2d2023-04-12 17:21:39 +00002012// TODO (b/277651159): Remove this allowlist
2013var (
2014 skipStubLibraryMultipleApexViolation = map[string]bool{
2015 "libclang_rt.asan": true,
2016 "libclang_rt.hwasan": true,
2017 // runtime apex
2018 "libc": true,
2019 "libc_hwasan": true,
2020 "libdl_android": true,
2021 "libm": true,
2022 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00002023 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00002024 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01002025 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00002026 "libandroidio": true,
2027 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01002028 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00002029 "libnativebridge": true,
2030 "libnativehelper": true,
2031 "libnativeloader": true,
2032 "libsigchain": true,
2033 }
2034)
2035
2036// Returns true if a stub library could be installed in multiple apexes
2037func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2038 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08002039 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00002040 return false
2041 }
2042 // If this is not a stub library, no check necessary
2043 if !c.HasStubsVariants() {
2044 return false
2045 }
2046 // Skip the allowlist
2047 // Use BaseModuleName so that this matches prebuilts.
2048 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2049 return false
2050 }
2051
Spandan Das20fce2d2023-04-12 17:21:39 +00002052 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08002053 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
2054 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00002055 return true
2056 }
2057 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08002058 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00002059 return true
2060 }
2061 // Default: no violation
2062 return false
2063}
2064
Chris Parsons8d6e4332021-02-22 16:13:50 -05002065func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002066 ctx := moduleContextFromAndroidModuleContext(actx, c)
2067
Inseob Kim37e0bb02024-04-29 15:54:44 +09002068 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2069 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2070 Logtags: c.logtagsPaths,
2071 })
2072
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002073 // If Test_only is set on a module in bp file, respect the setting, otherwise
2074 // see if is a known test module type.
2075 testOnly := c.testModule || c.testLibrary()
2076 if c.sourceProperties.Test_only != nil {
2077 testOnly = Bool(c.sourceProperties.Test_only)
2078 }
2079 // Keep before any early returns.
2080 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2081 TestOnly: testOnly,
2082 TopLevelTarget: c.testModule,
2083 })
2084
Ivan Lozanof1868af2022-04-12 13:08:36 -04002085 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002086 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002087 if !apexInfo.IsForPlatform() {
2088 c.hideApexVariantFromMake = true
2089 }
2090
Chris Parsonseefc9e62021-04-02 17:36:47 -04002091 c.makeLinkType = GetMakeLinkType(actx, c)
2092
Colin Crossf18e1102017-11-16 14:33:08 -08002093 deps := c.depsToPaths(ctx)
2094 if ctx.Failed() {
2095 return
2096 }
2097
Joe Onorato37f900c2023-07-18 16:58:16 -07002098 for _, generator := range c.generators {
2099 gen := generator.GeneratorSources(ctx)
2100 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2101 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2102 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2103 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2104 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2105 if len(deps.Objs.objFiles) == 0 {
2106 // If we are reusuing object files (which happens when we're a shared library and we're
2107 // reusing our static variant's object files), then skip adding the actual source files,
2108 // because we already have the object for it.
2109 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2110 }
2111 }
2112
2113 if ctx.Failed() {
2114 return
2115 }
2116
Spandan Das20fce2d2023-04-12 17:21:39 +00002117 if c.stubLibraryMultipleApexViolation(actx) {
2118 actx.PropertyErrorf("apex_available",
2119 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2120 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002121 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2122 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002123 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2124 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002125 }
2126
Colin Crossca860ac2016-01-04 14:34:37 -08002127 flags := Flags{
2128 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002129 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002130 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002131 for _, generator := range c.generators {
2132 flags = generator.GeneratorFlags(ctx, flags, deps)
2133 }
Colin Crossca860ac2016-01-04 14:34:37 -08002134 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002135 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002136 }
2137 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002138 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002139 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002140 if c.stl != nil {
2141 flags = c.stl.flags(ctx, flags)
2142 }
Colin Cross16b23492016-01-06 14:41:07 -08002143 if c.sanitize != nil {
2144 flags = c.sanitize.flags(ctx, flags)
2145 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002146 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002147 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002148 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002149 if c.fuzzer != nil {
2150 flags = c.fuzzer.flags(ctx, flags)
2151 }
Stephen Craneba090d12017-05-09 15:44:35 -07002152 if c.lto != nil {
2153 flags = c.lto.flags(ctx, flags)
2154 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002155 if c.afdo != nil {
2156 flags = c.afdo.flags(ctx, flags)
2157 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002158 if c.orderfile != nil {
2159 flags = c.orderfile.flags(ctx, flags)
2160 }
Colin Crossca860ac2016-01-04 14:34:37 -08002161 for _, feature := range c.features {
2162 flags = feature.flags(ctx, flags)
2163 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002164 if ctx.Failed() {
2165 return
2166 }
2167
Colin Cross4af21ed2019-11-04 09:37:55 -08002168 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2169 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2170 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002171
Colin Cross4af21ed2019-11-04 09:37:55 -08002172 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002173
2174 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002175 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002176 }
2177 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002178 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002179 }
2180
Colin Cross3e5e7782022-06-17 22:17:05 +00002181 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2182
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002183 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002184 // We need access to all the flags seen by a source file.
2185 if c.sabi != nil {
2186 flags = c.sabi.flags(ctx, flags)
2187 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002188
Colin Cross4af21ed2019-11-04 09:37:55 -08002189 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002190
Joe Onorato37f900c2023-07-18 16:58:16 -07002191 for _, generator := range c.generators {
2192 generator.GeneratorBuildActions(ctx, flags, deps)
2193 }
2194
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002195 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002196 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002197 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002198 if ctx.Failed() {
2199 return
2200 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002201 }
2202
Colin Crossca860ac2016-01-04 14:34:37 -08002203 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002204 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002205 if ctx.Failed() {
2206 return
2207 }
Colin Cross635c3b02016-05-18 15:37:25 -07002208 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002209
Chris Parsons94a0bba2021-06-04 15:03:47 -04002210 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002211
2212 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2213 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2214 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002215 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002216
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002217 if Bool(c.Properties.Cmake_snapshot_supported) {
2218 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2219 }
2220
Chris Parsons94a0bba2021-06-04 15:03:47 -04002221 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002222
2223 if c.linker != nil {
2224 moduleInfoJSON := ctx.ModuleInfoJSON()
2225 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2226 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2227 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2228 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2229 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2230
2231 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2232 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2233 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2234 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2235
2236 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2237 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2238 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2239 moduleInfoJSON.SubName += ".cfi"
2240 }
2241 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2242 moduleInfoJSON.SubName += ".hwasan"
2243 }
2244 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2245 moduleInfoJSON.SubName += ".scs"
2246 }
2247 }
2248 moduleInfoJSON.SubName += c.Properties.SubName
2249
2250 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2251 moduleInfoJSON.Uninstallable = true
2252 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002253 }
Wei Lia1aa2972024-06-21 13:08:51 -07002254
2255 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002256
Cole Faust96a692b2024-08-08 14:47:51 -07002257 if b, ok := c.compiler.(*baseCompiler); ok {
2258 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2259 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2260 c.hasProto = b.hasSrcExt(ctx, ".proto")
2261 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2262 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2263 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2264 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2265 }
2266
Yu Liuec7043d2024-11-05 18:22:20 +00002267 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002268 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002269 }
2270 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002271 ccObjectInfo.ObjFiles = objs.objFiles
2272 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002273 }
Yu Liu4f825132024-12-18 00:35:39 +00002274 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002275 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2276 }
2277
Yu Liuf6f85492025-01-13 21:02:36 +00002278 linkableInfo := CreateCommonLinkableInfo(ctx, c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002279 if lib, ok := c.linker.(VersionedInterface); ok {
2280 linkableInfo.StubsVersion = lib.StubsVersion()
Yu Liu8024b922024-12-20 23:31:32 +00002281 }
2282 if c.linker != nil {
2283 if library, ok := c.linker.(libraryInterface); ok {
2284 linkableInfo.Static = library.static()
Yu Liu8a8d5b42025-01-07 00:48:08 +00002285 linkableInfo.Shared = library.shared()
Yu Liu8024b922024-12-20 23:31:32 +00002286 linkableInfo.CoverageFiles = library.objs().coverageFiles
2287 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2288 }
2289 }
2290 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002291
Yu Liu323d77a2024-12-16 23:13:57 +00002292 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002293 IsPrebuilt: c.IsPrebuilt(),
2294 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
Yu Liu68a70b72025-01-08 22:54:44 +00002295 HasLlndkStubs: c.HasLlndkStubs(),
Yu Liu323d77a2024-12-16 23:13:57 +00002296 }
2297 if c.compiler != nil {
2298 ccInfo.CompilerInfo = &CompilerInfo{
2299 Srcs: c.compiler.(CompiledInterface).Srcs(),
2300 Cflags: c.compiler.baseCompilerProps().Cflags,
2301 AidlInterfaceInfo: AidlInterfaceInfo{
2302 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2303 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2304 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2305 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2306 },
2307 }
2308 switch decorator := c.compiler.(type) {
2309 case *libraryDecorator:
2310 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002311 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs,
Yu Liu323d77a2024-12-16 23:13:57 +00002312 }
2313 }
2314 }
2315 if c.linker != nil {
2316 ccInfo.LinkerInfo = &LinkerInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002317 WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs,
2318 StaticLibs: c.linker.baseLinkerProps().Static_libs,
2319 SharedLibs: c.linker.baseLinkerProps().Shared_libs,
2320 HeaderLibs: c.linker.baseLinkerProps().Header_libs,
Yu Liu323d77a2024-12-16 23:13:57 +00002321 }
2322 switch decorator := c.linker.(type) {
2323 case *binaryDecorator:
2324 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2325 case *libraryDecorator:
Yu Liu116610a2025-01-06 21:54:48 +00002326 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
2327 InjectBsslHash: Bool(c.linker.(*libraryDecorator).Properties.Inject_bssl_hash),
2328 }
Yu Liu323d77a2024-12-16 23:13:57 +00002329 case *testBinary:
2330 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2331 Gtest: decorator.testDecorator.gtest(),
2332 }
2333 case *benchmarkDecorator:
2334 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2335 case *objectLinker:
2336 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{}
Yu Liu8a8d5b42025-01-07 00:48:08 +00002337 case *stubDecorator:
2338 ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{}
Yu Liu323d77a2024-12-16 23:13:57 +00002339 }
Yu Liu8024b922024-12-20 23:31:32 +00002340
2341 if s, ok := c.linker.(SnapshotInterface); ok {
2342 ccInfo.SnapshotInfo = &SnapshotInfo{
2343 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2344 }
Yu Liuffe86322024-12-18 18:53:12 +00002345 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002346 if v, ok := c.linker.(VersionedInterface); ok {
2347 name := v.ImplementationModuleName(ctx.OtherModuleName(c))
Yu Liu68a70b72025-01-08 22:54:44 +00002348 ccInfo.LinkerInfo.ImplementationModuleName = &name
2349 }
Yu Liuffe86322024-12-18 18:53:12 +00002350 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002351 if c.library != nil {
2352 ccInfo.LibraryInfo = &LibraryInfo{
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002353 BuildStubs: c.library.BuildStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002354 }
2355 }
Yu Liu8024b922024-12-20 23:31:32 +00002356 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002357
mrziwangabdb2932024-06-18 12:43:41 -07002358 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002359
2360 if c.makeVarsInfo != nil {
2361 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2362 }
mrziwangabdb2932024-06-18 12:43:41 -07002363}
2364
Yu Liuf6f85492025-01-13 21:02:36 +00002365func CreateCommonLinkableInfo(ctx android.ModuleContext, mod VersionedLinkableInterface) *LinkableInfo {
Yu Liu8024b922024-12-20 23:31:32 +00002366 return &LinkableInfo{
2367 StaticExecutable: mod.StaticExecutable(),
2368 HasStubsVariants: mod.HasStubsVariants(),
2369 OutputFile: mod.OutputFile(),
2370 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
Yu Liuf6f85492025-01-13 21:02:36 +00002371 CoverageOutputFile: mod.CoverageOutputFile(),
2372 Partition: mod.Partition(),
Yu Liu8024b922024-12-20 23:31:32 +00002373 IsStubs: mod.IsStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002374 CcLibrary: mod.CcLibrary(),
Yu Liu8024b922024-12-20 23:31:32 +00002375 CcLibraryInterface: mod.CcLibraryInterface(),
2376 RustLibraryInterface: mod.RustLibraryInterface(),
2377 BaseModuleName: mod.BaseModuleName(),
2378 IsLlndk: mod.IsLlndk(),
Yu Liuf6f85492025-01-13 21:02:36 +00002379 IsNdk: mod.IsNdk(ctx.Config()),
Yu Liu8024b922024-12-20 23:31:32 +00002380 HasNonSystemVariants: mod.HasNonSystemVariants(),
2381 SubName: mod.SubName(),
2382 InVendorOrProduct: mod.InVendorOrProduct(),
2383 InRamdisk: mod.InRamdisk(),
2384 OnlyInRamdisk: mod.OnlyInRamdisk(),
2385 InVendorRamdisk: mod.InVendorRamdisk(),
2386 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2387 InRecovery: mod.InRecovery(),
2388 OnlyInRecovery: mod.OnlyInRecovery(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002389 Installable: mod.Installable(),
Yu Liu97880e12025-01-07 19:03:34 +00002390 RelativeInstallPath: mod.RelativeInstallPath(),
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002391 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
2392 RustApexExclude: mod.RustApexExclude(),
Yu Liu2da9d9a2025-01-15 00:27:02 +00002393 Bootstrap: mod.Bootstrap(),
Yu Liu8024b922024-12-20 23:31:32 +00002394 }
2395}
2396
Yu Liuec7043d2024-11-05 18:22:20 +00002397func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2398 if len(files) > 0 {
2399 ctx.SetOutputFiles(files, tag)
2400 }
2401}
2402
mrziwangabdb2932024-06-18 12:43:41 -07002403func (c *Module) setOutputFiles(ctx ModuleContext) {
2404 if c.outputFile.Valid() {
2405 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2406 } else {
2407 ctx.SetOutputFiles(android.Paths{}, "")
2408 }
2409 if c.linker != nil {
2410 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2411 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2412 }
Wei Lia1aa2972024-06-21 13:08:51 -07002413}
2414
2415func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2416 // Dump metadata that can not be done in android/compliance-metadata.go
2417 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
Wei Li8ede4f72025-01-15 21:24:22 -08002418 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static() || ctx.ModuleType() == "cc_object"))
Wei Lia1aa2972024-06-21 13:08:51 -07002419 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2420
2421 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002422 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002423 staticDepNames := make([]string, 0, len(staticDeps))
2424 for _, dep := range staticDeps {
2425 staticDepNames = append(staticDepNames, dep.Name())
2426 }
Wei Li8ede4f72025-01-15 21:24:22 -08002427 // Process CrtBegin and CrtEnd as static libs
Yu Liu727204c2025-01-23 20:58:32 +00002428 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Wei Li8ede4f72025-01-15 21:24:22 -08002429 depName := ctx.OtherModuleName(dep)
2430 depTag := ctx.OtherModuleDependencyTag(dep)
2431 switch depTag {
2432 case CrtBeginDepTag:
2433 staticDepNames = append(staticDepNames, depName)
2434 case CrtEndDepTag:
2435 staticDepNames = append(staticDepNames, depName)
2436 }
2437 })
Wei Lia1aa2972024-06-21 13:08:51 -07002438
Wei Li8ede4f72025-01-15 21:24:22 -08002439 staticDepPaths := make([]string, 0, len(deps.StaticLibs)+len(deps.CrtBegin)+len(deps.CrtEnd))
Wei Lia1aa2972024-06-21 13:08:51 -07002440 for _, dep := range deps.StaticLibs {
2441 staticDepPaths = append(staticDepPaths, dep.String())
2442 }
Wei Li8ede4f72025-01-15 21:24:22 -08002443 for _, dep := range deps.CrtBegin {
2444 staticDepPaths = append(staticDepPaths, dep.String())
2445 }
2446 for _, dep := range deps.CrtEnd {
2447 staticDepPaths = append(staticDepPaths, dep.String())
2448 }
Wei Lia1aa2972024-06-21 13:08:51 -07002449 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2450 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2451
2452 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002453 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002454 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2455 for _, dep := range wholeStaticDeps {
2456 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2457 }
2458
2459 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2460 for _, dep := range deps.WholeStaticLibs {
2461 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2462 }
2463 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2464 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Wei Li8ede4f72025-01-15 21:24:22 -08002465
2466 // Header libs
2467 headerLibDeps := ctx.GetDirectDepsProxyWithTag(HeaderDepTag())
2468 headerLibDepNames := make([]string, 0, len(headerLibDeps))
2469 for _, dep := range headerLibDeps {
2470 headerLibDepNames = append(headerLibDepNames, dep.Name())
2471 }
2472 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.HEADER_LIBS, android.FirstUniqueStrings(headerLibDepNames))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002473}
2474
2475func (c *Module) maybeUnhideFromMake() {
2476 // If a lib is directly included in any of the APEXes or is not available to the
2477 // platform (which is often the case when the stub is provided as a prebuilt),
2478 // unhide the stubs variant having the latest version gets visible to make. In
2479 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2480 // force anything in the make world to link against the stubs library. (unless it
2481 // is explicitly referenced via .bootstrap suffix or the module is marked with
2482 // 'bootstrap: true').
2483 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002484 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002485 c.IsStubs() && !c.InVendorRamdisk() {
2486 c.Properties.HideFromMake = false // unhide
2487 // Note: this is still non-installable
2488 }
2489}
2490
Colin Cross8ff10582023-12-07 13:10:56 -08002491// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2492// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002493func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002494 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002495 // If the module has been specifically configure to not be installed then
2496 // hide from make as otherwise it will break when running inside make
2497 // as the output path to install will not be specified. Not all uninstallable
2498 // modules can be hidden from make as some are needed for resolving make side
2499 // dependencies.
2500 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002501 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002502 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002503 c.SkipInstall()
2504 }
2505
2506 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2507 // to allow using the outputs in a genrule.
2508 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002509 c.installer.install(ctx, c.outputFile.Path())
2510 if ctx.Failed() {
2511 return
Colin Crossca860ac2016-01-04 14:34:37 -08002512 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002513 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002514}
2515
Colin Cross0ea8ba82019-06-06 14:33:29 -07002516func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002517 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002518 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002519 }
Colin Crossca860ac2016-01-04 14:34:37 -08002520 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002521}
2522
Colin Crossca860ac2016-01-04 14:34:37 -08002523func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002524 for _, generator := range c.generators {
2525 generator.GeneratorInit(ctx)
2526 }
Colin Crossca860ac2016-01-04 14:34:37 -08002527 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002528 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002529 }
Colin Crossca860ac2016-01-04 14:34:37 -08002530 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002531 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002532 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002533 if c.stl != nil {
2534 c.stl.begin(ctx)
2535 }
Colin Cross16b23492016-01-06 14:41:07 -08002536 if c.sanitize != nil {
2537 c.sanitize.begin(ctx)
2538 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002539 if c.coverage != nil {
2540 c.coverage.begin(ctx)
2541 }
Yi Kong9723e332023-12-04 14:52:53 +09002542 if c.afdo != nil {
2543 c.afdo.begin(ctx)
2544 }
Stephen Craneba090d12017-05-09 15:44:35 -07002545 if c.lto != nil {
2546 c.lto.begin(ctx)
2547 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002548 if c.orderfile != nil {
2549 c.orderfile.begin(ctx)
2550 }
Dan Albert92fe7402020-07-15 13:33:30 -07002551 if ctx.useSdk() && c.IsSdkVariant() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002552 version, err := NativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002553 if err != nil {
2554 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002555 c.Properties.Sdk_version = nil
2556 } else {
2557 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002558 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002559 }
Colin Crossca860ac2016-01-04 14:34:37 -08002560}
2561
Colin Cross37047f12016-12-13 17:06:13 -08002562func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002563 deps := Deps{}
2564
Joe Onorato37f900c2023-07-18 16:58:16 -07002565 for _, generator := range c.generators {
2566 deps = generator.GeneratorDeps(ctx, deps)
2567 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002568 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002569 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002570 }
2571 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002572 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002573 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002574 if c.stl != nil {
2575 deps = c.stl.deps(ctx, deps)
2576 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002577 if c.coverage != nil {
2578 deps = c.coverage.deps(ctx, deps)
2579 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002580
Colin Crossb6715442017-10-24 11:13:31 -07002581 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2582 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2583 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2584 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2585 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2586 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002587 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002588 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002589
Colin Cross516c5452024-10-28 13:45:21 -07002590 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2591 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2592 }
2593
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002594 for _, lib := range deps.ReexportSharedLibHeaders {
2595 if !inList(lib, deps.SharedLibs) {
2596 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2597 }
2598 }
2599
2600 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002601 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2602 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 -07002603 }
2604 }
2605
Colin Cross5950f382016-12-13 12:50:57 -08002606 for _, lib := range deps.ReexportHeaderLibHeaders {
2607 if !inList(lib, deps.HeaderLibs) {
2608 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2609 }
2610 }
2611
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002612 for _, gen := range deps.ReexportGeneratedHeaders {
2613 if !inList(gen, deps.GeneratedHeaders) {
2614 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2615 }
2616 }
2617
Colin Crossc99deeb2016-04-11 15:06:20 -07002618 return deps
2619}
2620
Colin Cross516c5452024-10-28 13:45:21 -07002621func checkConflictingExplicitVersions(libs []string) error {
2622 withoutVersion := func(s string) string {
2623 name, _ := StubsLibNameAndVersion(s)
2624 return name
2625 }
2626 var errs []error
2627 for i, lib := range libs {
2628 libName := withoutVersion(lib)
2629 libsToCompare := libs[i+1:]
2630 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2631 return withoutVersion(s) == libName
2632 })
2633 if j >= 0 {
2634 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2635 lib, libsToCompare[j]))
2636 }
2637 }
2638 return errors.Join(errs...)
2639}
2640
Dan Albert7e9d2952016-08-04 13:02:36 -07002641func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002642 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002643 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002644 moduleContextImpl: moduleContextImpl{
2645 mod: c,
2646 },
2647 }
2648 ctx.ctx = ctx
2649
Colin Crossca860ac2016-01-04 14:34:37 -08002650 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002651}
2652
Jiyong Park7ed9de32018-10-15 22:25:07 +09002653// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002654func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002655 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2656 version := name[sharp+1:]
2657 libname := name[:sharp]
2658 return libname, version
2659 }
2660 return name, ""
2661}
2662
Dan Albert92fe7402020-07-15 13:33:30 -07002663func GetCrtVariations(ctx android.BottomUpMutatorContext,
2664 m LinkableInterface) []blueprint.Variation {
2665 if ctx.Os() != android.Android {
2666 return nil
2667 }
2668 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002669 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2670 minSdkVersion := m.MinSdkVersion()
2671 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2672 minSdkVersion = m.SdkVersion()
2673 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002674 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2675 if err != nil {
2676 ctx.PropertyErrorf("min_sdk_version", err.Error())
2677 }
Colin Cross363ec762023-01-13 13:45:14 -08002678
2679 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002680 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002681 if apiLevel.LessThan(minApiForArch) {
2682 apiLevel = minApiForArch
2683 }
2684
Dan Albert92fe7402020-07-15 13:33:30 -07002685 return []blueprint.Variation{
2686 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002687 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002688 }
2689 }
2690 return []blueprint.Variation{
2691 {Mutator: "sdk", Variation: ""},
2692 }
2693}
2694
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002695func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2696 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002697
2698 variations = append([]blueprint.Variation(nil), variations...)
2699
Liz Kammer23942242022-04-08 15:41:00 -04002700 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002701 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002702 if version == "impl" {
2703 version = ""
2704 }
Colin Crosse7257d22020-09-24 09:56:18 -07002705 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002706 if tag, ok := depTag.(libraryDependencyTag); ok {
2707 tag.explicitlyVersioned = true
Colin Crossbd930bc2025-02-03 12:17:42 -08002708 if version == "" {
2709 tag.explicitlyImpl = true
2710 }
Colin Crossafcdce82024-10-22 13:59:33 -07002711 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2712 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2713 // the modified copy to depTag.
2714 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002715 } else {
2716 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2717 }
Colin Crosse7257d22020-09-24 09:56:18 -07002718 }
Colin Crosse7257d22020-09-24 09:56:18 -07002719
Colin Cross0de8a1e2020-09-18 14:15:30 -07002720 if far {
2721 ctx.AddFarVariationDependencies(variations, depTag, name)
2722 } else {
2723 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002724 }
2725}
2726
Kiyoung Kim487689e2022-07-26 09:48:22 +09002727func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2728 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002729 return snapshot
2730 }
2731
2732 return lib
2733}
2734
Kiyoung Kim37693d02024-04-04 09:56:15 +09002735// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002736// of names:
2737//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002738// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002739//
2740// For each of these, it adds the name of the ndk_library module to the list of
2741// variant libs.
2742//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002743// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002744//
2745// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002746//
2747// The caller can then know to add the variantLibs dependencies differently from the
2748// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002749func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002750 variantLibs = []string{}
2751
2752 nonvariantLibs = []string{}
2753 for _, entry := range list {
2754 // strip #version suffix out
2755 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002756 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002757 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002758 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002759 nonvariantLibs = append(nonvariantLibs, entry)
2760 }
2761 }
2762 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002763
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002764}
2765
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002766func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2767 nonVariantLibs := []string{}
2768 variantLibs := []string{}
2769
2770 for _, lib := range libs {
2771 replaceLibName := GetReplaceModuleName(lib, replaceList)
2772 if replaceLibName == lib {
2773 // Do not handle any libs which are not in API imports
2774 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2775 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2776 variantLibs = append(variantLibs, replaceLibName)
2777 } else {
2778 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2779 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002780 }
2781
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002782 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002783}
2784
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002785func (c *Module) shouldUseApiSurface() bool {
2786 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2787 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2788 // LLNDK Variant
2789 return true
2790 }
2791
2792 if c.Properties.IsSdkVariant {
2793 // NDK Variant
2794 return true
2795 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002796 }
2797
2798 return false
2799}
2800
Colin Cross1e676be2016-10-12 14:38:15 -07002801func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002802 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002803 return
2804 }
2805
Colin Cross37047f12016-12-13 17:06:13 -08002806 ctx := &depsContext{
2807 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002808 moduleContextImpl: moduleContextImpl{
2809 mod: c,
2810 },
2811 }
2812 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002813
Colin Crossc99deeb2016-04-11 15:06:20 -07002814 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002815
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002816 apiNdkLibs := []string{}
2817 apiLateNdkLibs := []string{}
2818
Yo Chiang219968c2020-09-22 18:45:04 +08002819 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2820
Dan Albert914449f2016-06-17 16:45:24 -07002821 variantNdkLibs := []string{}
2822 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002823 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002824 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2825 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2826 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002827 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002828
Colin Cross32ec36c2016-12-15 07:39:51 -08002829 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002830 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002831 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002832 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002833 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002834
Spandan Das73bcafc2022-08-18 23:26:00 +00002835 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002836 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2837 if variationExists {
2838 actx.AddVariationDependencies(nil, depTag, lib)
2839 } else {
2840 // dependencies to ndk_headers fall here as ndk_headers do not have
2841 // any variants.
2842 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2843 }
Spandan Dasff665182024-09-11 18:48:44 +00002844 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002845 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002846 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002847 } else {
2848 actx.AddVariationDependencies(nil, depTag, lib)
2849 }
2850 }
2851
Dan Albertf1d14c72020-07-30 14:32:55 -07002852 if c.isNDKStubLibrary() {
2853 // NDK stubs depend on their implementation because the ABI dumps are
2854 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002855
Spandan Das8b08aea2023-03-14 19:29:34 +00002856 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2857 c.ImageVariation(),
2858 blueprint.Variation{Mutator: "link", Variation: "shared"},
2859 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002860 }
2861
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002862 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2863 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2864 c.Target().NativeBridge == android.NativeBridgeDisabled {
2865 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002866 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002867 llndkHeaderLibTag,
2868 deps.LlndkHeaderLibs...)
2869 }
2870
Jiyong Park5d1598f2019-02-25 22:14:17 +09002871 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002872 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002873
Jiyong Park5d1598f2019-02-25 22:14:17 +09002874 actx.AddVariationDependencies([]blueprint.Variation{
2875 {Mutator: "link", Variation: "static"},
2876 }, depTag, lib)
2877 }
2878
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002879 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002880 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002881 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002882
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002883 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002884 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002885 }
Jiyong Parke3867542020-12-03 17:28:25 +09002886 if inList(lib, deps.ExcludeLibsForApex) {
2887 depTag.excludeInApex = true
2888 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002889 actx.AddVariationDependencies([]blueprint.Variation{
2890 {Mutator: "link", Variation: "static"},
2891 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002892 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002893
Jooyung Han75568392020-03-20 04:29:24 +09002894 // staticUnwinderDep is treated as staticDep for Q apexes
2895 // so that native libraries/binaries are linked with static unwinder
2896 // because Q libc doesn't have unwinder APIs
2897 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002898 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002899 actx.AddVariationDependencies([]blueprint.Variation{
2900 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002901 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002902 }
2903
Jiyong Park7ed9de32018-10-15 22:25:07 +09002904 // shared lib names without the #version suffix
2905 var sharedLibNames []string
2906
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002907 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002908 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002909 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002910 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002911 }
Jiyong Parke3867542020-12-03 17:28:25 +09002912 if inList(lib, deps.ExcludeLibsForApex) {
2913 depTag.excludeInApex = true
2914 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002915 if inList(lib, deps.ExcludeLibsForNonApex) {
2916 depTag.excludeInNonApex = true
2917 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002918
Jiyong Park73c54ee2019-10-22 20:31:18 +09002919 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002920 sharedLibNames = append(sharedLibNames, name)
2921
Colin Crosse7257d22020-09-24 09:56:18 -07002922 variations := []blueprint.Variation{
2923 {Mutator: "link", Variation: "shared"},
2924 }
Spandan Dasff665182024-09-11 18:48:44 +00002925 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002926 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002927
Colin Crossfe9acfe2021-06-14 16:13:03 -07002928 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002929 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002930 actx.AddVariationDependencies([]blueprint.Variation{
2931 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002932 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002933 }
2934
Colin Cross3e5e7782022-06-17 22:17:05 +00002935 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002936 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002937 actx.AddVariationDependencies([]blueprint.Variation{
2938 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002939 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002940 }
2941
Jiyong Park7ed9de32018-10-15 22:25:07 +09002942 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002943 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002944 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2945 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2946 // linking against both the stubs lib and the non-stubs lib at the same time.
2947 continue
2948 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002949 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002950 variations := []blueprint.Variation{
2951 {Mutator: "link", Variation: "shared"},
2952 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002953 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002954 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002955
Dan Willemsen59339a22018-07-22 21:18:45 -07002956 actx.AddVariationDependencies([]blueprint.Variation{
2957 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002958 }, dataLibDepTag, deps.DataLibs...)
2959
Colin Crossc8caa062021-09-24 16:50:14 -07002960 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2961
Chris Parsons79d66a52020-06-05 17:26:16 -04002962 actx.AddVariationDependencies([]blueprint.Variation{
2963 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002964 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002965
Colin Cross68861832016-07-08 10:41:41 -07002966 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002967
2968 for _, gen := range deps.GeneratedHeaders {
2969 depTag := genHeaderDepTag
2970 if inList(gen, deps.ReexportGeneratedHeaders) {
2971 depTag = genHeaderExportDepTag
2972 }
2973 actx.AddDependency(c, depTag, gen)
2974 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002975
Cole Faust65cb40a2024-10-21 15:41:42 -07002976 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2977 depTag := genHeaderDepTag
2978 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2979 }
2980
Dan Albert92fe7402020-07-15 13:33:30 -07002981 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002982 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002983 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002984 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002985 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002986 }
Colin Crossc465efd2021-06-11 18:00:04 -07002987 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002988 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002989 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002990 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002991 if deps.DynamicLinker != "" {
2992 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002993 }
Dan Albert914449f2016-06-17 16:45:24 -07002994
2995 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002996
Colin Cross8acea3e2024-12-12 14:53:30 -08002997 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002998 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002999 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07003000 {Mutator: "link", Variation: "shared"},
3001 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003002 actx.AddVariationDependencies([]blueprint.Variation{
3003 {Mutator: "version", Variation: version},
3004 {Mutator: "link", Variation: "shared"},
3005 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07003006
Colin Cross8acea3e2024-12-12 14:53:30 -08003007 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07003008 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07003009 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07003010 {Mutator: "link", Variation: "shared"},
3011 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003012 actx.AddVariationDependencies([]blueprint.Variation{
3013 {Mutator: "version", Variation: version},
3014 {Mutator: "link", Variation: "shared"},
3015 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08003016
Vinh Tran367d89d2023-04-28 11:21:25 -04003017 if len(deps.AidlLibs) > 0 {
3018 actx.AddDependency(
3019 c,
3020 aidlLibraryTag,
3021 deps.AidlLibs...,
3022 )
3023 }
3024
Colin Cross6362e272015-10-29 15:25:03 -07003025}
Colin Cross21b9a242015-03-24 14:15:58 -07003026
Colin Crosse40b4ea2018-10-02 22:25:58 -07003027func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07003028 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07003029 c.beginMutator(ctx)
3030 }
3031}
3032
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003033// Whether a module can link to another module, taking into
3034// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09003035func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07003036 tag blueprint.DependencyTag) {
3037
3038 switch t := tag.(type) {
3039 case dependencyTag:
3040 if t != vndkExtDepTag {
3041 return
3042 }
3043 case libraryDependencyTag:
3044 default:
3045 return
3046 }
3047
Ivan Lozanof9e21722020-12-02 09:00:51 -05003048 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003049 // Host code is not restricted
3050 return
3051 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003052
Ivan Lozano52767be2019-10-18 14:49:46 -07003053 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003054 // Platform code can link to anything
3055 return
3056 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08003057 if from.InRamdisk() {
3058 // Ramdisk code is not NDK
3059 return
3060 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003061 if from.InVendorRamdisk() {
3062 // Vendor ramdisk code is not NDK
3063 return
3064 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003065 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09003066 // Recovery code is not NDK
3067 return
3068 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003069 // Change this to LinkableInterface if Rust gets NDK support, which stubDecorators are for
Colin Cross31076b32020-10-23 17:22:06 -07003070 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003071 if c.StubDecorator() {
3072 // These aren't real libraries, but are the stub shared libraries that are included in
3073 // the NDK.
3074 return
3075 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003076 }
Logan Chien834b9a62019-01-14 15:39:03 +08003077
Ivan Lozano52767be2019-10-18 14:49:46 -07003078 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003079 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3080 // to link to libc++ (non-NDK and without sdk_version).
3081 return
3082 }
3083
Ivan Lozano52767be2019-10-18 14:49:46 -07003084 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003085 // NDK code linking to platform code is never okay.
3086 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003087 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003088 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003089 }
3090
3091 // At this point we know we have two NDK libraries, but we need to
3092 // check that we're not linking against anything built against a higher
3093 // API level, as it is only valid to link against older or equivalent
3094 // APIs.
3095
Inseob Kim01a28722018-04-11 09:48:45 +09003096 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003097 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003098 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003099 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003100 // Current can't be linked against by anything else.
3101 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003102 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003103 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003104 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003105 if err != nil {
3106 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003107 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003108 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003109 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003110 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003111 if err != nil {
3112 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003113 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003114 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003115 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003116
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003117 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003118 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003119 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003120 }
3121 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003122 }
Dan Albert202fe492017-12-15 13:56:59 -08003123
3124 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003125 fromStl := from.SelectedStl()
3126 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003127 if fromStl == "" || toStl == "" {
3128 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003129 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003130 // We can be permissive with the system "STL" since it is only the C++
3131 // ABI layer, but in the future we should make sure that everyone is
3132 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003133 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003134 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003135 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3136 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003137 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003138}
3139
Jooyung Han479ca172020-10-19 18:51:07 +09003140func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3141 if c, ok := ctx.Module().(*Module); ok {
3142 ctx.VisitDirectDeps(func(dep android.Module) {
3143 depTag := ctx.OtherModuleDependencyTag(dep)
3144 ccDep, ok := dep.(LinkableInterface)
3145 if ok {
3146 checkLinkType(ctx, c, ccDep, depTag)
3147 }
3148 })
3149 }
3150}
3151
Jiyong Park5fb8c102018-04-09 12:03:06 +09003152// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003153// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3154// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003155// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003156func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003157 check := func(child, parent android.Module) bool {
3158 to, ok := child.(*Module)
3159 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003160 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003161 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003162
Jooyung Hana70f0672019-01-18 15:20:43 +09003163 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3164 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003165 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003166
Jiyong Park0474e1f2021-01-14 14:26:06 +09003167 // These dependencies are not excercised at runtime. Tracking these will give us
3168 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003169 depTag := ctx.OtherModuleDependencyTag(child)
3170 if IsHeaderDepTag(depTag) {
3171 return false
3172 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003173 if depTag == staticVariantTag {
3174 return false
3175 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003176 if depTag == StubImplDepTag {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003177 return false
3178 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003179 if depTag == android.RequiredDepTag {
3180 return false
3181 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003182
Justin Yun63e9ec72020-10-29 16:49:43 +09003183 // Even if target lib has no vendor variant, keep checking dependency
3184 // graph in case it depends on vendor_available or product_available
3185 // but not double_loadable transtively.
3186 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003187 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003188 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003189
Jiyong Park0474e1f2021-01-14 14:26:06 +09003190 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3191 // one.
3192 if Bool(to.VendorProperties.Double_loadable) {
3193 return true
3194 }
3195
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003196 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003197 return false
3198 }
3199
Jooyung Hana70f0672019-01-18 15:20:43 +09003200 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3201 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003202 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003203 return false
3204 }
3205 if module, ok := ctx.Module().(*Module); ok {
3206 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003207 if lib.HasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003208 ctx.WalkDeps(check)
3209 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003210 }
3211 }
3212}
3213
Yu Liue4312402023-01-18 09:15:31 -08003214func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3215 // For the dependency from platform to apex, use the latest stubs
3216 apexSdkVersion := android.FutureApiLevel
3217 if !apexInfo.IsForPlatform() {
3218 apexSdkVersion = apexInfo.MinSdkVersion
3219 }
3220
3221 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3222 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3223 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3224 // (b/144430859)
3225 apexSdkVersion = android.FutureApiLevel
3226 }
3227
3228 return apexSdkVersion
3229}
3230
Colin Crossc99deeb2016-04-11 15:06:20 -07003231// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003232func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003233 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003234
Colin Cross0de8a1e2020-09-18 14:15:30 -07003235 var directStaticDeps []StaticLibraryInfo
3236 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003237
Colin Cross0de8a1e2020-09-18 14:15:30 -07003238 reexportExporter := func(exporter FlagExporterInfo) {
3239 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3240 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3241 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3242 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3243 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003244 }
3245
Colin Crossff694a82023-12-13 15:54:49 -08003246 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003247 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003248
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003249 skipModuleList := map[string]bool{}
3250
Yu Liu8024b922024-12-20 23:31:32 +00003251 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003252 depName := ctx.OtherModuleName(dep)
3253 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003254
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003255 if _, ok := skipModuleList[depName]; ok {
3256 // skip this module because original module or API imported module matching with this should be used instead.
3257 return
3258 }
3259
Yu Liu8024b922024-12-20 23:31:32 +00003260 var ccInfo *CcInfo
3261 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3262 if hasCcInfo {
3263 ccInfo = v
3264 }
3265 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003266 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003267 if !hasCcInfo {
3268 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3269 }
3270 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003271 return
3272 }
3273
Vinh Tran367d89d2023-04-28 11:21:25 -04003274 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003275 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003276 depPaths.AidlLibraryInfos = append(
3277 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003278 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003279 )
3280 }
3281 }
3282
Yu Liu8024b922024-12-20 23:31:32 +00003283 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003284 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003285 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003286 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003287 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003288 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003289 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003290 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003291 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003292 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003293 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003294 // Support exported headers from a generated_sources dependency
3295 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003296 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003297 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003298 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003299 genRule.GeneratedDeps...)
3300 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003301 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003302 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003303 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003304 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003305 genRule.GeneratedSourceFiles...)
3306 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003307 // 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 +09003308 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003309 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003310 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003311 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003312 }
Colin Crosscef792e2021-06-11 18:01:26 -07003313 case CrtBeginDepTag:
3314 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3315 case CrtEndDepTag:
3316 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003317 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003318 return
3319 }
3320
Colin Crossfe17f6f2019-03-28 19:30:56 -07003321 if depTag == android.ProtoPluginDepTag {
3322 return
3323 }
3324
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003325 if depTag == android.RequiredDepTag {
3326 return
3327 }
3328
Yu Liu8024b922024-12-20 23:31:32 +00003329 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3330 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003331 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 -07003332 return
3333 }
Yu Liu8024b922024-12-20 23:31:32 +00003334 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003335 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003336 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003337 return
3338 }
3339
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003340 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003341 // Skip reused objects for stub libraries, they use their own stub object file instead.
3342 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3343 // version mutator, so the stubs variant is created from the shared variant that
3344 // already has the reuseObjTag dependency on the static variant.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003345 if !c.library.BuildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003346 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003347 objs := staticAnalogue.ReuseObjects
3348 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003349 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003350 reexportExporter(depExporterInfo)
3351 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003352 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003353 }
3354
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003355 if depTag == llndkHeaderLibTag {
3356 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3357 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3358 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3359 }
3360
Yu Liu8024b922024-12-20 23:31:32 +00003361 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003362
3363 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3364 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003365 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003366 return
3367 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003368
Jiyong Parke3867542020-12-03 17:28:25 +09003369 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3370 return
3371 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003372 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3373 return
3374 }
Jiyong Parke3867542020-12-03 17:28:25 +09003375
Colin Cross313aa542023-12-13 13:47:44 -08003376 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003377
Colin Cross6e511a92020-07-27 21:26:48 -07003378 var ptr *android.Paths
3379 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003380
Colin Cross6e511a92020-07-27 21:26:48 -07003381 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003382
Colin Cross6e511a92020-07-27 21:26:48 -07003383 switch {
3384 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003385 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003386 if !ctx.Config().AllowMissingDependencies() {
3387 ctx.ModuleErrorf("module %q is not a header library", depName)
3388 } else {
3389 ctx.AddMissingDependencies([]string{depName})
3390 }
3391 return
3392 }
Colin Cross6e511a92020-07-27 21:26:48 -07003393 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003394 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003395 if !ctx.Config().AllowMissingDependencies() {
3396 ctx.ModuleErrorf("module %q is not a shared library", depName)
3397 } else {
3398 ctx.AddMissingDependencies([]string{depName})
3399 }
3400 return
3401 }
Jiyong Parke3867542020-12-03 17:28:25 +09003402
Jiyong Park7d55b612021-06-11 17:22:09 +09003403 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3404 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003405
Jiyong Park1ad8e162020-12-01 23:40:09 +09003406 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3407 // linkFile, depFile, and ptr.
3408 if c.IsStubs() {
3409 break
3410 }
3411
Colin Cross0de8a1e2020-09-18 14:15:30 -07003412 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3413 depFile = sharedLibraryInfo.TableOfContents
3414
Colin Crossb614cd42024-10-11 12:52:21 -07003415 if !sharedLibraryInfo.IsStubs {
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003416 // TODO(b/362509506): remove this additional check once all apex_exclude uses are switched to stubs.
3417 if !linkableInfo.RustApexExclude {
3418 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3419 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3420 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3421 }
Colin Crossb614cd42024-10-11 12:52:21 -07003422 }
3423 }
3424
Colin Cross6e511a92020-07-27 21:26:48 -07003425 ptr = &depPaths.SharedLibs
3426 switch libDepTag.Order {
3427 case earlyLibraryDependency:
3428 ptr = &depPaths.EarlySharedLibs
3429 depPtr = &depPaths.EarlySharedLibsDeps
3430 case normalLibraryDependency:
3431 ptr = &depPaths.SharedLibs
3432 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003433 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003434 case lateLibraryDependency:
3435 ptr = &depPaths.LateSharedLibs
3436 depPtr = &depPaths.LateSharedLibsDeps
3437 default:
3438 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003439 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003440
Colin Cross6e511a92020-07-27 21:26:48 -07003441 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003442 if linkableInfo.RustLibraryInterface {
3443 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003444 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3445 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3446 if libDepTag.wholeStatic {
3447 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3448 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003449
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003450 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3451 // exported functions from the rust generated staticlib still exported.
3452 if c.CcLibrary() && c.Shared() {
3453 c.WholeRustStaticlib = true
3454 }
Colin Cross6e511a92020-07-27 21:26:48 -07003455 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003456
Colin Cross6e511a92020-07-27 21:26:48 -07003457 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003458 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3459 if !isStaticLib {
3460 if !ctx.Config().AllowMissingDependencies() {
3461 ctx.ModuleErrorf("module %q is not a static library", depName)
3462 } else {
3463 ctx.AddMissingDependencies([]string{depName})
3464 }
3465 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003466 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003467
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003468 // Stubs lib doesn't link to the static lib dependencies. Don't set
3469 // linkFile, depFile, and ptr.
3470 if c.IsStubs() {
3471 break
3472 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003473
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003474 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3475 if libDepTag.wholeStatic {
3476 ptr = &depPaths.WholeStaticLibs
3477 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3478 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3479 } else {
3480 // This case normally catches prebuilt static
3481 // libraries, but it can also occur when
3482 // AllowMissingDependencies is on and the
3483 // dependencies has no sources of its own
3484 // but has a whole_static_libs dependency
3485 // on a missing library. We want to depend
3486 // on the .a file so that there is something
3487 // in the dependency tree that contains the
3488 // error rule for the missing transitive
3489 // dependency.
3490 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3491 }
3492 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3493 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3494 } else {
3495 switch libDepTag.Order {
3496 case earlyLibraryDependency:
3497 panic(fmt.Errorf("early static libs not supported"))
3498 case normalLibraryDependency:
3499 // static dependencies will be handled separately so they can be ordered
3500 // using transitive dependencies.
3501 ptr = nil
3502 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3503 case lateLibraryDependency:
3504 ptr = &depPaths.LateStaticLibs
3505 default:
3506 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3507 }
3508 }
3509
3510 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3511 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3512
3513 if libDepTag.unexportedSymbols {
3514 depPaths.LdFlags = append(depPaths.LdFlags,
3515 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3516 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003517 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003518 }
3519
Yu Liu8024b922024-12-20 23:31:32 +00003520 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3521 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003522 ctx.ModuleErrorf("module %q not a static library", depName)
3523 return
3524 }
Logan Chien43d34c32017-12-20 01:17:32 +08003525
Colin Cross6e511a92020-07-27 21:26:48 -07003526 // When combining coverage files for shared libraries and executables, coverage files
3527 // in static libraries act as if they were whole static libraries. The same goes for
3528 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003529 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003530 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003531 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003532 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003533 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003534 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003535 // Handle non-CC modules here
3536 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003537 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003538 }
3539 }
3540
Colin Cross6e511a92020-07-27 21:26:48 -07003541 if ptr != nil {
3542 if !linkFile.Valid() {
3543 if !ctx.Config().AllowMissingDependencies() {
3544 ctx.ModuleErrorf("module %q missing output file", depName)
3545 } else {
3546 ctx.AddMissingDependencies([]string{depName})
3547 }
3548 return
3549 }
3550 *ptr = append(*ptr, linkFile.Path())
3551 }
3552
3553 if depPtr != nil {
3554 dep := depFile
3555 if !dep.Valid() {
3556 dep = linkFile
3557 }
3558 *depPtr = append(*depPtr, dep.Path())
3559 }
3560
Colin Cross0de8a1e2020-09-18 14:15:30 -07003561 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3562 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3563 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3564 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003565 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3566
3567 // Only re-export RustRlibDeps for cc static libs
3568 if c.static() {
3569 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3570 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003571
3572 if libDepTag.reexportFlags {
3573 reexportExporter(depExporterInfo)
3574 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3575 // Re-exported shared library headers must be included as well since they can help us with type information
3576 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003577 c.sabi.Properties.ReexportedIncludes = append(
3578 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003579 c.sabi.Properties.ReexportedSystemIncludes = append(
3580 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003581 }
3582
Yu Liu8024b922024-12-20 23:31:32 +00003583 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003584 switch {
3585 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003586 c.Properties.AndroidMkHeaderLibs = append(
3587 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003588 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003589 // Note: the order of libs in this list is not important because
3590 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003591 c.Properties.AndroidMkSharedLibs = append(
3592 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003593 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003594 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003595 if libDepTag.wholeStatic {
3596 c.Properties.AndroidMkWholeStaticLibs = append(
3597 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3598 } else {
3599 c.Properties.AndroidMkStaticLibs = append(
3600 c.Properties.AndroidMkStaticLibs, makeLibName)
3601 }
Colin Cross6e511a92020-07-27 21:26:48 -07003602 }
3603 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003604 } else if !c.IsStubs() {
3605 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3606
Colin Cross6e511a92020-07-27 21:26:48 -07003607 switch depTag {
3608 case runtimeDepTag:
3609 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu8024b922024-12-20 23:31:32 +00003610 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003611 case objDepTag:
3612 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3613 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003614 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003615 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003616 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003617 case dynamicLinkerDepTag:
3618 depPaths.DynamicLinker = linkFile
3619 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003620 }
Colin Crossca860ac2016-01-04 14:34:37 -08003621 })
3622
Jeff Gaston294356f2017-09-27 17:05:30 -07003623 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003624 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3625 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3626 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003627
Colin Crossdd84e052017-05-17 13:44:16 -07003628 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003629 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003630 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3631 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003632 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003633 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3634
Jiyong Park74955042019-10-22 20:19:51 +09003635 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3636 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003637 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003638 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003639 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003640 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003641
3642 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003643 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003644 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003645 }
Colin Crossdd84e052017-05-17 13:44:16 -07003646
Colin Crossca860ac2016-01-04 14:34:37 -08003647 return depPaths
3648}
3649
Yu Liuf6f85492025-01-13 21:02:36 +00003650func ShouldUseStubForApex(ctx android.ModuleContext, parent android.Module, dep android.ModuleProxy) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003651 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003652 bootstrap := false
Yu Liuf6f85492025-01-13 21:02:36 +00003653 if ctx.EqualModules(ctx.Module(), parent) {
3654 if linkable, ok := parent.(LinkableInterface); !ok {
3655 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3656 } else {
3657 inVendorOrProduct = linkable.InVendorOrProduct()
3658 bootstrap = linkable.Bootstrap()
3659 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003660 } else {
Yu Liuf6f85492025-01-13 21:02:36 +00003661 if linkable, ok := android.OtherModuleProvider(ctx, parent, LinkableInfoProvider); !ok {
3662 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3663 } else {
3664 inVendorOrProduct = linkable.InVendorOrProduct
3665 bootstrap = linkable.Bootstrap
3666 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003667 }
3668
Spandan Das10c41362024-12-03 01:33:09 +00003669 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003670
3671 useStubs := false
3672
Yu Liu8024b922024-12-20 23:31:32 +00003673 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003674 if !apexInfo.IsForPlatform() {
3675 // For platform libraries, use current version of LLNDK
3676 // If this is for use_vendor apex we will apply the same rules
3677 // of apex sdk enforcement below to choose right version.
3678 useStubs = true
3679 }
3680 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3681 // If not building for APEX or the containing APEX allows the use of
3682 // platform APIs, use stubs only when it is from an APEX (and not from
3683 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3684 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003685 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003686
Spandan Dasff665182024-09-11 18:48:44 +00003687 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003688 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003689 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3690 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003691 }
3692
3693 return useStubs
3694}
3695
3696// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3697// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3698// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3699// has different level of updatability. For example, if a library foo in an APEX depends on a
3700// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3701// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3702// same APEX as foo, the non-stub variant of bar is used.
Yu Liuf6f85492025-01-13 21:02:36 +00003703func ChooseStubOrImpl(ctx android.ModuleContext, dep android.ModuleProxy) (SharedLibraryInfo, FlagExporterInfo) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003704 depTag := ctx.OtherModuleDependencyTag(dep)
3705 libDepTag, ok := depTag.(libraryDependencyTag)
3706 if !ok || !libDepTag.shared() {
3707 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3708 }
3709
Colin Cross313aa542023-12-13 13:47:44 -08003710 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3711 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3712 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003713
3714 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003715 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003716 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003717 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3718 toUse := stubs[len(stubs)-1]
3719 sharedLibraryInfo = toUse.SharedLibraryInfo
3720 depExporterInfo = toUse.FlagExporterInfo
3721 }
3722 }
3723 return sharedLibraryInfo, depExporterInfo
3724}
3725
Colin Cross0de8a1e2020-09-18 14:15:30 -07003726// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3727// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003728// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003729// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003730func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3731 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003732 var staticPaths android.Paths
3733 for _, staticDep := range staticDeps {
3734 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3735 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3736 }
3737 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003738 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003739 }
3740 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3741
3742 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3743
3744 // reorder the dependencies based on transitive dependencies
3745 staticPaths = android.FirstUniquePaths(staticPaths)
3746 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3747
3748 if len(orderedStaticPaths) != len(staticPaths) {
3749 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3750 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3751 }
3752
3753 return orderedStaticPaths, transitiveStaticLibs
3754}
3755
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003756// BaseLibName trims known prefixes and suffixes
3757func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003758 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3759 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003760 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003761 return libName
3762}
3763
Yu Liu8024b922024-12-20 23:31:32 +00003764func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003765 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003766 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3767 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003768
Yu Liu8024b922024-12-20 23:31:32 +00003769 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003770 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003771 if ccInfo.SnapshotInfo != nil {
3772 return linkableInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003773 }
3774 }
3775
Yu Liu8024b922024-12-20 23:31:32 +00003776 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003777 // The vendor and product modules in Make will have been renamed to not conflict with the
3778 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003779 return libName + linkableInfo.SubName
3780 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003781 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003782 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003783 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003784 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003785 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003786 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003787 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003788 } else {
3789 return libName
3790 }
3791}
3792
Colin Crossca860ac2016-01-04 14:34:37 -08003793func (c *Module) InstallInData() bool {
3794 if c.installer == nil {
3795 return false
3796 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003797 return c.installer.inData()
3798}
3799
3800func (c *Module) InstallInSanitizerDir() bool {
3801 if c.installer == nil {
3802 return false
3803 }
3804 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003805 return true
3806 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003807 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003808}
3809
Yifan Hong1b3348d2020-01-21 15:53:22 -08003810func (c *Module) InstallInRamdisk() bool {
3811 return c.InRamdisk()
3812}
3813
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003814func (c *Module) InstallInVendorRamdisk() bool {
3815 return c.InVendorRamdisk()
3816}
3817
Jiyong Parkf9332f12018-02-01 00:54:12 +09003818func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003819 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003820}
3821
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003822func (c *Module) MakeUninstallable() {
3823 if c.installer == nil {
3824 c.ModuleBase.MakeUninstallable()
3825 return
3826 }
3827 c.installer.makeUninstallable(c)
3828}
3829
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003830func (c *Module) HostToolPath() android.OptionalPath {
3831 if c.installer == nil {
3832 return android.OptionalPath{}
3833 }
3834 return c.installer.hostToolPath()
3835}
3836
Nan Zhangd4e641b2017-07-12 12:55:28 -07003837func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3838 return c.outputFile
3839}
3840
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003841func (c *Module) static() bool {
3842 if static, ok := c.linker.(interface {
3843 static() bool
3844 }); ok {
3845 return static.static()
3846 }
3847 return false
3848}
3849
Colin Cross6a730042024-12-05 13:53:43 -08003850func (c *Module) staticLibrary() bool {
3851 if static, ok := c.linker.(interface {
3852 staticLibrary() bool
3853 }); ok {
3854 return static.staticLibrary()
3855 }
3856 return false
3857}
3858
Jiyong Park379de2f2018-12-19 02:47:14 +09003859func (c *Module) staticBinary() bool {
3860 if static, ok := c.linker.(interface {
3861 staticBinary() bool
3862 }); ok {
3863 return static.staticBinary()
3864 }
3865 return false
3866}
3867
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003868func (c *Module) testBinary() bool {
3869 if test, ok := c.linker.(interface {
3870 testBinary() bool
3871 }); ok {
3872 return test.testBinary()
3873 }
3874 return false
3875}
3876
Jingwen Chen537242c2022-08-24 11:53:27 +00003877func (c *Module) testLibrary() bool {
3878 if test, ok := c.linker.(interface {
3879 testLibrary() bool
3880 }); ok {
3881 return test.testLibrary()
3882 }
3883 return false
3884}
3885
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003886func (c *Module) benchmarkBinary() bool {
3887 if b, ok := c.linker.(interface {
3888 benchmarkBinary() bool
3889 }); ok {
3890 return b.benchmarkBinary()
3891 }
3892 return false
3893}
3894
3895func (c *Module) fuzzBinary() bool {
3896 if f, ok := c.linker.(interface {
3897 fuzzBinary() bool
3898 }); ok {
3899 return f.fuzzBinary()
3900 }
3901 return false
3902}
3903
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003904// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3905func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003906 if h, ok := c.linker.(interface {
3907 header() bool
3908 }); ok {
3909 return h.header()
3910 }
3911 return false
3912}
3913
Ivan Lozanod7586b62021-04-01 09:49:36 -04003914func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003915 if b, ok := c.linker.(interface {
3916 binary() bool
3917 }); ok {
3918 return b.binary()
3919 }
3920 return false
3921}
3922
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003923func (c *Module) ForceDisableSanitizers() {
3924 c.sanitize.Properties.ForceDisable = true
3925}
3926
Justin Yun5e035862021-06-29 20:50:37 +09003927func (c *Module) StaticExecutable() bool {
3928 if b, ok := c.linker.(*binaryDecorator); ok {
3929 return b.static()
3930 }
3931 return false
3932}
3933
Ivan Lozanod7586b62021-04-01 09:49:36 -04003934func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003935 if o, ok := c.linker.(interface {
3936 object() bool
3937 }); ok {
3938 return o.object()
3939 }
3940 return false
3941}
3942
Kiyoung Kim37693d02024-04-04 09:56:15 +09003943func (m *Module) Dylib() bool {
3944 return false
3945}
3946
3947func (m *Module) Rlib() bool {
3948 return false
3949}
3950
Ivan Lozanof9e21722020-12-02 09:00:51 -05003951func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003952 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003953 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003954 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003955 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003956 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003957 return "native:product"
3958 }
Jooyung Han38002912019-05-16 04:01:54 +09003959 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003960 } else if c.InRamdisk() {
3961 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003962 } else if c.InVendorRamdisk() {
3963 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003964 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003965 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003966 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003967 return "native:ndk:none:none"
3968 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3969 //family, link := getNdkStlFamilyAndLinkType(c)
3970 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3971 } else {
3972 return "native:platform"
3973 }
3974}
3975
Jiyong Park9d452992018-10-03 00:38:19 +09003976// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003977// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003978func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003979 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003980 // Stub libs and prebuilt libs in a versioned SDK are not
3981 // installable to APEX even though they are shared libs.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003982 return lib.shared() && !lib.BuildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003983 }
3984 return false
3985}
3986
Jiyong Parka90ca002019-10-07 15:47:24 +09003987func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003988 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3989}
3990
3991func (c *Module) ApexAvailableFor() []string {
3992 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003993 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003994 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003995 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003996 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003997 }
Yu Liub73c3a62024-12-10 00:58:06 +00003998
3999 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09004000}
4001
Paul Duffin0cb37b92020-03-04 14:52:46 +00004002func (c *Module) EverInstallable() bool {
4003 return c.installer != nil &&
4004 // Check to see whether the module is actually ever installable.
4005 c.installer.everInstallable()
4006}
4007
Ivan Lozanod7586b62021-04-01 09:49:36 -04004008func (c *Module) PreventInstall() bool {
4009 return c.Properties.PreventInstall
4010}
4011
4012func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07004013 if c.library != nil {
4014 if i := c.library.installable(); i != nil {
4015 return i
4016 }
4017 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04004018 return c.Properties.Installable
4019}
4020
4021func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00004022 ret := c.EverInstallable() &&
4023 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04004024 proptools.BoolDefault(c.Installable(), true) &&
4025 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004026
4027 // The platform variant doesn't need further condition. Apex variants however might not
4028 // be installable because it will likely to be included in the APEX and won't appear
4029 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07004030 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004031 return ret
4032 }
4033
4034 // Special case for modules that are configured to be installed to /data, which includes
4035 // test modules. For these modules, both APEX and non-APEX variants are considered as
4036 // installable. This is because even the APEX variants won't be included in the APEX, but
4037 // will anyway be installed to /data/*.
4038 // See b/146995717
4039 if c.InstallInData() {
4040 return ret
4041 }
4042
4043 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09004044}
4045
Logan Chien41eabe62019-04-10 13:33:58 +08004046func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
4047 if c.linker != nil {
4048 if library, ok := c.linker.(*libraryDecorator); ok {
4049 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
4050 }
4051 }
4052}
4053
Jiyong Park45bf82e2020-12-15 22:29:02 +09004054var _ android.ApexModule = (*Module)(nil)
4055
4056// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004057func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004058 if depTag == StubImplDepTag {
Colin Crossc1b36442021-05-06 13:42:48 -07004059 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004060 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004061 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004062 if depTag == staticVariantTag {
4063 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4064 // actually mean that the static lib (and its dependencies) are copied into the
4065 // APEX.
4066 return false
4067 }
Colin Cross8acea3e2024-12-12 14:53:30 -08004068
4069 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
4070 if isLibDepTag && c.static() && libDepTag.shared() {
4071 // shared_lib dependency from a static lib is considered as crossing
4072 // the APEX boundary because the dependency doesn't actually is
4073 // linked; the dependency is used only during the compilation phase.
4074 return false
4075 }
4076
4077 if isLibDepTag && libDepTag.excludeInApex {
4078 return false
4079 }
4080
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004081 return true
4082}
4083
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004084func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004085 if c.HasStubsVariants() {
Colin Crossbd930bc2025-02-03 12:17:42 -08004086 if IsSharedDepTag(depTag) && !IsExplicitImplSharedDepTag(depTag) {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004087 // dynamic dep to a stubs lib crosses APEX boundary
4088 return false
4089 }
4090 if IsRuntimeDepTag(depTag) {
4091 // runtime dep to a stubs lib also crosses APEX boundary
4092 return false
4093 }
4094 if IsHeaderDepTag(depTag) {
4095 return false
4096 }
4097 }
4098 if c.IsLlndk() {
4099 return false
4100 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004101
4102 return true
4103}
4104
Jiyong Park45bf82e2020-12-15 22:29:02 +09004105// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07004106func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
4107 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09004108 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4109 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
4110 return nil
4111 }
Jooyung Han749dc692020-04-15 11:03:39 +09004112 // We don't check for prebuilt modules
4113 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4114 return nil
4115 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004116
Jooyung Han749dc692020-04-15 11:03:39 +09004117 minSdkVersion := c.MinSdkVersion()
4118 if minSdkVersion == "apex_inherit" {
4119 return nil
4120 }
4121 if minSdkVersion == "" {
4122 // JNI libs within APK-in-APEX fall into here
4123 // Those are okay to set sdk_version instead
4124 // We don't have to check if this is a SDK variant because
4125 // non-SDK variant resets sdk_version, which works too.
4126 minSdkVersion = c.SdkVersion()
4127 }
Dan Albertc8060532020-07-22 22:32:17 -07004128 if minSdkVersion == "" {
4129 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4130 }
4131 // Not using nativeApiLevelFromUser because the context here is not
4132 // necessarily a native context.
4133 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004134 if err != nil {
4135 return err
4136 }
Dan Albertc8060532020-07-22 22:32:17 -07004137
Colin Cross8ca61c12022-10-06 21:00:14 -07004138 // A dependency only needs to support a min_sdk_version at least
4139 // as high as the api level that the architecture was introduced in.
4140 // This allows introducing new architectures in the platform that
4141 // need to be included in apexes that normally require an older
4142 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004143 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004144 if sdkVersion.LessThan(minApiForArch) {
4145 sdkVersion = minApiForArch
4146 }
4147
Dan Albertc8060532020-07-22 22:32:17 -07004148 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004149 return fmt.Errorf("newer SDK(%v)", ver)
4150 }
4151 return nil
4152}
4153
Paul Duffinb5769c12021-05-12 16:16:51 +01004154// Implements android.ApexModule
4155func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4156 // stub libraries and native bridge libraries are always available to platform
4157 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4158}
4159
Inseob Kima1888ce2022-10-04 14:42:02 +09004160func (c *Module) overriddenModules() []string {
4161 if o, ok := c.linker.(overridable); ok {
4162 return o.overriddenModules()
4163 }
4164 return nil
4165}
4166
Liz Kammer35ca77e2021-12-22 15:31:40 -05004167type moduleType int
4168
4169const (
4170 unknownType moduleType = iota
4171 binary
4172 object
4173 fullLibrary
4174 staticLibrary
4175 sharedLibrary
4176 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004177 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004178 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004179)
4180
4181func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004182 if c.testBinary() {
4183 // testBinary is also a binary, so this comes before the c.Binary()
4184 // conditional. A testBinary has additional implicit dependencies and
4185 // other test-only semantics.
4186 return testBin
4187 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004188 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004189 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004190 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004191 } else if c.testLibrary() {
4192 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4193 // will let them add implicit compile deps on gtest, for example.
4194 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004195 // For now, treat them as regular libraries.
4196 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004197 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004198 static := false
4199 shared := false
4200 if library, ok := c.linker.(*libraryDecorator); ok {
4201 static = library.MutatedProperties.BuildStatic
4202 shared = library.MutatedProperties.BuildShared
4203 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4204 static = library.MutatedProperties.BuildStatic
4205 shared = library.MutatedProperties.BuildShared
4206 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004207 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004208 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004209 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004210 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004211 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004212 return staticLibrary
4213 }
4214 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004215 } else if c.isNDKStubLibrary() {
4216 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004217 }
4218 return unknownType
4219}
4220
Colin Crosscfad1192015-11-02 16:43:11 -08004221// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004222type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004223 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004224 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004225 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004226}
4227
Patrice Arrudac249c712019-03-19 17:00:29 -07004228// cc_defaults provides a set of properties that can be inherited by other cc
4229// modules. A module can use the properties from a cc_defaults using
4230// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4231// merged (when possible) by prepending the default module's values to the
4232// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004233func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004234 return DefaultsFactory()
4235}
4236
Colin Cross36242852017-06-23 15:06:31 -07004237func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004238 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004239
Colin Cross36242852017-06-23 15:06:31 -07004240 module.AddProperties(props...)
4241 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004242 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004243 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004244 &BaseCompilerProperties{},
4245 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004246 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004247 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004248 &StaticProperties{},
4249 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004250 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004251 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004252 &TestLinkerProperties{},
4253 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004254 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004255 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004256 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004257 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004258 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004259 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004260 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004261 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004262 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004263 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004264 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004265 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004266 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004267 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004268 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4269 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004270 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004271 )
Colin Crosscfad1192015-11-02 16:43:11 -08004272
Jooyung Hancc372c52019-09-25 15:18:44 +09004273 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004274
4275 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004276}
4277
Jiyong Park2286afd2020-06-16 21:58:53 +09004278func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004279 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004280}
4281
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004282func kytheExtractAllFactory() android.Singleton {
4283 return &kytheExtractAllSingleton{}
4284}
4285
4286type kytheExtractAllSingleton struct {
4287}
4288
4289func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4290 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004291 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004292 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004293 if len(files) > 0 {
4294 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004295 }
4296 })
4297 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4298 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004299 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004300 }
4301}
4302
Jihoon Kangf78a8902022-09-01 22:47:07 +00004303func (c *Module) Partition() string {
4304 if p, ok := c.installer.(interface {
4305 getPartition() string
4306 }); ok {
4307 return p.getPartition()
4308 }
4309 return ""
4310}
4311
Spandan Das2b6dfb52024-01-19 00:22:22 +00004312type sourceModuleName interface {
4313 sourceModuleName() string
4314}
4315
4316func (c *Module) BaseModuleName() string {
4317 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4318 // if the prebuilt module sets a source_module_name in Android.bp, use that
4319 return smn.sourceModuleName()
4320 }
4321 return c.ModuleBase.BaseModuleName()
4322}
4323
Spandan Dase20c56c2024-07-23 21:34:24 +00004324func (c *Module) stubsSymbolFilePath() android.Path {
4325 if library, ok := c.linker.(*libraryDecorator); ok {
4326 return library.stubsSymbolFilePath
4327 }
4328 return android.OptionalPath{}.Path()
4329}
4330
Colin Cross06a931b2015-10-28 17:23:31 -07004331var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004332var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004333var BoolPtr = proptools.BoolPtr
4334var String = proptools.String
4335var StringPtr = proptools.StringPtr