blob: b51d74d1cf10884d00676728bc5c82824b2e0e8b [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
842 dataLib bool
843 ndk bool
844
845 staticUnwinder bool
846
847 makeSuffix string
Jiyong Parke3867542020-12-03 17:28:25 +0900848
Cindy Zhou18417cb2020-12-10 07:12:38 -0800849 // Whether or not this dependency should skip the apex dependency check
850 skipApexAllowedDependenciesCheck bool
851
Jiyong Parke3867542020-12-03 17:28:25 +0900852 // Whether or not this dependency has to be followed for the apex variants
853 excludeInApex bool
Jooyung Han9ffbe832023-11-28 22:31:35 +0900854 // Whether or not this dependency has to be followed for the non-apex variants
855 excludeInNonApex bool
Colin Cross3e5e7782022-06-17 22:17:05 +0000856
857 // If true, don't automatically export symbols from the static library into a shared library.
858 unexportedSymbols bool
Colin Cross6e511a92020-07-27 21:26:48 -0700859}
860
861// header returns true if the libraryDependencyTag is tagging a header lib dependency.
862func (d libraryDependencyTag) header() bool {
863 return d.Kind == headerLibraryDependency
864}
865
866// shared returns true if the libraryDependencyTag is tagging a shared lib dependency.
867func (d libraryDependencyTag) shared() bool {
868 return d.Kind == sharedLibraryDependency
869}
870
871// shared returns true if the libraryDependencyTag is tagging a static lib dependency.
872func (d libraryDependencyTag) static() bool {
873 return d.Kind == staticLibraryDependency
874}
875
Colin Cross65cb3142021-12-10 23:05:02 +0000876func (d libraryDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
877 if d.shared() {
878 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
879 }
880 return nil
881}
882
883var _ android.LicenseAnnotationsDependencyTag = libraryDependencyTag{}
884
Colin Crosse9fe2942020-11-10 18:12:15 -0800885// InstallDepNeeded returns true for shared libraries so that shared library dependencies of
886// binaries or other shared libraries are installed as dependencies.
887func (d libraryDependencyTag) InstallDepNeeded() bool {
888 return d.shared()
889}
890
891var _ android.InstallNeededDependencyTag = libraryDependencyTag{}
892
Yu Liu67a28422024-03-05 00:36:31 +0000893func (d libraryDependencyTag) PropagateAconfigValidation() bool {
894 return d.static()
895}
896
897var _ android.PropagateAconfigValidationDependencyTag = libraryDependencyTag{}
898
Colin Crosse9fe2942020-11-10 18:12:15 -0800899// dependencyTag is used for tagging miscellaneous dependency types that don't fit into
Colin Cross6e511a92020-07-27 21:26:48 -0700900// libraryDependencyTag. Each tag object is created globally and reused for multiple
901// dependencies (although since the object contains no references, assigning a tag to a
902// variable and modifying it will not modify the original). Users can compare the tag
903// returned by ctx.OtherModuleDependencyTag against the global original
904type dependencyTag struct {
905 blueprint.BaseDependencyTag
906 name string
907}
908
Colin Crosse9fe2942020-11-10 18:12:15 -0800909// installDependencyTag is used for tagging miscellaneous dependency types that don't fit into
910// libraryDependencyTag, but where the dependency needs to be installed when the parent is
911// installed.
912type installDependencyTag struct {
913 blueprint.BaseDependencyTag
914 android.InstallAlwaysNeededDependencyTag
915 name string
916}
917
Colin Crossc99deeb2016-04-11 15:06:20 -0700918var (
Colin Cross6e511a92020-07-27 21:26:48 -0700919 genSourceDepTag = dependencyTag{name: "gen source"}
920 genHeaderDepTag = dependencyTag{name: "gen header"}
921 genHeaderExportDepTag = dependencyTag{name: "gen header export"}
922 objDepTag = dependencyTag{name: "obj"}
Jiyong Parkd630bdd2020-11-25 11:47:24 +0900923 dynamicLinkerDepTag = installDependencyTag{name: "dynamic linker"}
Colin Cross6e511a92020-07-27 21:26:48 -0700924 reuseObjTag = dependencyTag{name: "reuse objects"}
925 staticVariantTag = dependencyTag{name: "static variant"}
926 vndkExtDepTag = dependencyTag{name: "vndk extends"}
927 dataLibDepTag = dependencyTag{name: "data lib"}
Colin Crossc8caa062021-09-24 16:50:14 -0700928 dataBinDepTag = dependencyTag{name: "data bin"}
Colin Crosse9fe2942020-11-10 18:12:15 -0800929 runtimeDepTag = installDependencyTag{name: "runtime lib"}
Ivan Lozano9eaacc82024-10-30 14:28:17 +0000930 StubImplDepTag = dependencyTag{name: "stub_impl"}
Muhammad Haseeb Ahmad7e744052022-03-25 22:50:53 +0000931 JniFuzzLibTag = dependencyTag{name: "jni_fuzz_lib_tag"}
Vinh Tran44cb78c2023-03-09 22:07:19 -0500932 FdoProfileTag = dependencyTag{name: "fdo_profile"}
Vinh Tran367d89d2023-04-28 11:21:25 -0400933 aidlLibraryTag = dependencyTag{name: "aidl_library"}
Hsin-Yi Chen715142a2024-03-27 16:31:16 +0800934 llndkHeaderLibTag = dependencyTag{name: "llndk_header_lib"}
Colin Crossc99deeb2016-04-11 15:06:20 -0700935)
936
Roland Levillainf89cd092019-07-29 16:22:59 +0100937func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
Colin Cross6e511a92020-07-27 21:26:48 -0700938 ccLibDepTag, ok := depTag.(libraryDependencyTag)
939 return ok && ccLibDepTag.shared()
940}
941
942func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
943 ccLibDepTag, ok := depTag.(libraryDependencyTag)
944 return ok && ccLibDepTag.static()
Roland Levillainf89cd092019-07-29 16:22:59 +0100945}
946
Zach Johnson3df4e632020-11-06 11:56:27 -0800947func IsHeaderDepTag(depTag blueprint.DependencyTag) bool {
948 ccLibDepTag, ok := depTag.(libraryDependencyTag)
949 return ok && ccLibDepTag.header()
950}
951
Roland Levillainf89cd092019-07-29 16:22:59 +0100952func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
Colin Crosse9fe2942020-11-10 18:12:15 -0800953 return depTag == runtimeDepTag
Roland Levillainf89cd092019-07-29 16:22:59 +0100954}
955
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000956func ExcludeInApexDepTag(depTag blueprint.DependencyTag) bool {
957 ccLibDepTag, ok := depTag.(libraryDependencyTag)
958 return ok && ccLibDepTag.excludeInApex
959}
960
Colin Crossca860ac2016-01-04 14:34:37 -0800961// Module contains the properties and members used by all C/C++ module types, and implements
962// the blueprint.Module interface. It delegates to compiler, linker, and installer interfaces
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500963// to construct the output file. Behavior can be customized with a Customizer, or "decorator",
964// interface.
965//
966// To define a C/C++ related module, construct a new Module object and point its delegates to
967// type-specific structs. These delegates will be invoked to register module-specific build
968// statements which may be unique to the module type. For example, module.compiler.compile() should
969// be defined so as to register build statements which are responsible for compiling the module.
970//
971// Another example: to construct a cc_binary module, one can create a `cc.binaryDecorator` struct
972// which implements the `linker` and `installer` interfaces, and points the `linker` and `installer`
973// members of the cc.Module to this decorator. Thus, a cc_binary module has custom linker and
974// installer logic.
Colin Crossca860ac2016-01-04 14:34:37 -0800975type Module struct {
hamzehc0a671f2021-07-22 12:05:08 -0700976 fuzz.FuzzModule
hamzeh41ad8812021-07-07 14:00:07 -0700977
Dan Willemsen3e5bdf22017-09-13 18:37:08 -0700978 VendorProperties VendorProperties
hamzeh41ad8812021-07-07 14:00:07 -0700979 Properties BaseProperties
Ronald Braunsteina115e262024-04-09 18:07:38 -0700980 sourceProperties android.SourceProperties
Colin Crossfa138792015-04-24 17:31:52 -0700981
Colin Crossca860ac2016-01-04 14:34:37 -0800982 // initialize before calling Init
Yu Liu76d94462024-10-31 23:32:36 +0000983 hod android.HostOrDeviceSupported
984 multilib android.Multilib
985 testModule bool
986 incremental bool
Colin Crossc472d572015-03-17 15:06:21 -0700987
Paul Duffina0843f62019-12-13 19:50:38 +0000988 // Allowable SdkMemberTypes of this module type.
989 sdkMemberTypes []android.SdkMemberType
990
Chris Parsonsef6e0cf2020-12-01 18:26:21 -0500991 // decorator delegates, initialize before calling Init
992 // these may contain module-specific implementations, and effectively allow for custom
993 // type-specific logic. These members may reference different objects or the same object.
994 // Functions of these decorators will be invoked to initialize and register type-specific
995 // build statements.
Colin Cross8ff10582023-12-07 13:10:56 -0800996 generators []Generator
997 compiler compiler
998 linker linker
999 installer installer
Chris Parsonsef6e0cf2020-12-01 18:26:21 -05001000
Spandan Dase12d2522023-09-12 21:42:31 +00001001 features []feature
1002 stl *stl
1003 sanitize *sanitize
1004 coverage *coverage
1005 fuzzer *fuzzer
1006 sabi *sabi
Spandan Dase12d2522023-09-12 21:42:31 +00001007 lto *lto
1008 afdo *afdo
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001009 orderfile *orderfile
Colin Cross16b23492016-01-06 14:41:07 -08001010
Colin Cross31076b32020-10-23 17:22:06 -07001011 library libraryInterface
1012
Colin Cross635c3b02016-05-18 15:37:25 -07001013 outputFile android.OptionalPath
Colin Crossca860ac2016-01-04 14:34:37 -08001014
Colin Crossb98c8b02016-07-29 13:44:28 -07001015 cachedToolchain config.Toolchain
Colin Crossb916a382016-07-29 17:28:03 -07001016
Yu Liue70976d2024-10-15 20:45:35 +00001017 subAndroidMkOnce map[subAndroidMkProviderInfoProducer]bool
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08001018
1019 // Flags used to compile this module
1020 flags Flags
Jeff Gaston294356f2017-09-27 17:05:30 -07001021
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001022 // Shared flags among build rules of this module
1023 sharedFlags SharedFlags
1024
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08001025 // only non-nil when this is a shared library that reuses the objects of a static library
Colin Cross0de8a1e2020-09-18 14:15:30 -07001026 staticAnalogue *StaticLibraryInfo
Inseob Kim9516ee92019-05-09 10:56:13 +09001027
1028 makeLinkType string
Jooyung Han75568392020-03-20 04:29:24 +09001029
1030 // For apex variants, this is set as apex.min_sdk_version
Dan Albertc8060532020-07-22 22:32:17 -07001031 apexSdkVersion android.ApiLevel
Colin Cross56a83212020-09-15 18:30:11 -07001032
1033 hideApexVariantFromMake bool
Yu Liueae7b362023-11-16 17:05:47 -08001034
Inseob Kim37e0bb02024-04-29 15:54:44 +09001035 logtagsPaths android.Paths
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001036
1037 WholeRustStaticlib bool
Cole Faust96a692b2024-08-08 14:47:51 -07001038
1039 hasAidl bool
1040 hasLex bool
1041 hasProto bool
1042 hasRenderscript bool
1043 hasSysprop bool
1044 hasWinMsg bool
1045 hasYacc bool
Yu Liu76d94462024-10-31 23:32:36 +00001046
1047 makeVarsInfo *CcMakeVarsInfo
Colin Crossc472d572015-03-17 15:06:21 -07001048}
1049
Yu Liu76d94462024-10-31 23:32:36 +00001050func (c *Module) IncrementalSupported() bool {
1051 return c.incremental
1052}
1053
1054var _ blueprint.Incremental = (*Module)(nil)
1055
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001056func (c *Module) AddJSONData(d *map[string]interface{}) {
1057 c.AndroidModuleBase().AddJSONData(d)
1058 (*d)["Cc"] = map[string]interface{}{
1059 "SdkVersion": c.SdkVersion(),
1060 "MinSdkVersion": c.MinSdkVersion(),
1061 "VndkVersion": c.VndkVersion(),
1062 "ProductSpecific": c.ProductSpecific(),
1063 "SocSpecific": c.SocSpecific(),
1064 "DeviceSpecific": c.DeviceSpecific(),
1065 "InProduct": c.InProduct(),
1066 "InVendor": c.InVendor(),
1067 "InRamdisk": c.InRamdisk(),
1068 "InVendorRamdisk": c.InVendorRamdisk(),
1069 "InRecovery": c.InRecovery(),
1070 "VendorAvailable": c.VendorAvailable(),
1071 "ProductAvailable": c.ProductAvailable(),
1072 "RamdiskAvailable": c.RamdiskAvailable(),
1073 "VendorRamdiskAvailable": c.VendorRamdiskAvailable(),
1074 "RecoveryAvailable": c.RecoveryAvailable(),
1075 "OdmAvailable": c.OdmAvailable(),
1076 "InstallInData": c.InstallInData(),
1077 "InstallInRamdisk": c.InstallInRamdisk(),
1078 "InstallInSanitizerDir": c.InstallInSanitizerDir(),
1079 "InstallInVendorRamdisk": c.InstallInVendorRamdisk(),
1080 "InstallInRecovery": c.InstallInRecovery(),
1081 "InstallInRoot": c.InstallInRoot(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001082 "IsLlndk": c.IsLlndk(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001083 "IsVendorPublicLibrary": c.IsVendorPublicLibrary(),
1084 "ApexSdkVersion": c.apexSdkVersion,
Cole Faust96a692b2024-08-08 14:47:51 -07001085 "AidlSrcs": c.hasAidl,
1086 "LexSrcs": c.hasLex,
1087 "ProtoSrcs": c.hasProto,
1088 "RenderscriptSrcs": c.hasRenderscript,
1089 "SyspropSrcs": c.hasSysprop,
1090 "WinMsgSrcs": c.hasWinMsg,
1091 "YaccSrsc": c.hasYacc,
1092 "OnlyCSrcs": !(c.hasAidl || c.hasLex || c.hasProto || c.hasRenderscript || c.hasSysprop || c.hasWinMsg || c.hasYacc),
Yi Kong5786f5c2024-05-28 02:22:34 +09001093 "OptimizeForSize": c.OptimizeForSize(),
Lukacs T. Berkid18d8ca2021-06-25 09:11:22 +02001094 }
1095}
1096
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001097func (c *Module) SetPreventInstall() {
1098 c.Properties.PreventInstall = true
1099}
1100
1101func (c *Module) SetHideFromMake() {
1102 c.Properties.HideFromMake = true
1103}
1104
Ivan Lozanod7586b62021-04-01 09:49:36 -04001105func (c *Module) HiddenFromMake() bool {
1106 return c.Properties.HideFromMake
1107}
1108
Cole Fauste8a87832024-09-11 11:35:46 -07001109func (c *Module) RequiredModuleNames(ctx android.ConfigurableEvaluatorContext) []string {
Cole Faust43ddd082024-06-17 12:32:40 -07001110 required := android.CopyOf(c.ModuleBase.RequiredModuleNames(ctx))
Yi-Yo Chiangc7e044f2021-06-18 19:44:24 +08001111 if c.ImageVariation().Variation == android.CoreVariation {
1112 required = append(required, c.Properties.Target.Platform.Required...)
1113 required = removeListFromList(required, c.Properties.Target.Platform.Exclude_required)
1114 } else if c.InRecovery() {
1115 required = append(required, c.Properties.Target.Recovery.Required...)
1116 required = removeListFromList(required, c.Properties.Target.Recovery.Exclude_required)
1117 }
1118 return android.FirstUniqueStrings(required)
1119}
1120
Ivan Lozano52767be2019-10-18 14:49:46 -07001121func (c *Module) Toc() android.OptionalPath {
1122 if c.linker != nil {
1123 if library, ok := c.linker.(libraryInterface); ok {
1124 return library.toc()
1125 }
1126 }
1127 panic(fmt.Errorf("Toc() called on non-library module: %q", c.BaseModuleName()))
1128}
1129
1130func (c *Module) ApiLevel() string {
1131 if c.linker != nil {
1132 if stub, ok := c.linker.(*stubDecorator); ok {
Dan Albert1a246272020-07-06 14:49:35 -07001133 return stub.apiLevel.String()
Ivan Lozano52767be2019-10-18 14:49:46 -07001134 }
1135 }
1136 panic(fmt.Errorf("ApiLevel() called on non-stub library module: %q", c.BaseModuleName()))
1137}
1138
1139func (c *Module) Static() bool {
1140 if c.linker != nil {
1141 if library, ok := c.linker.(libraryInterface); ok {
1142 return library.static()
1143 }
1144 }
1145 panic(fmt.Errorf("Static() called on non-library module: %q", c.BaseModuleName()))
1146}
1147
1148func (c *Module) Shared() bool {
1149 if c.linker != nil {
1150 if library, ok := c.linker.(libraryInterface); ok {
1151 return library.shared()
1152 }
1153 }
Lukacs T. Berki6c716762022-06-13 20:50:39 +02001154
Ivan Lozano52767be2019-10-18 14:49:46 -07001155 panic(fmt.Errorf("Shared() called on non-library module: %q", c.BaseModuleName()))
1156}
1157
1158func (c *Module) SelectedStl() string {
Colin Crossc511bc52020-04-07 16:50:32 +00001159 if c.stl != nil {
1160 return c.stl.Properties.SelectedStl
1161 }
1162 return ""
Ivan Lozano52767be2019-10-18 14:49:46 -07001163}
1164
Ivan Lozano52767be2019-10-18 14:49:46 -07001165func (c *Module) StubDecorator() bool {
1166 if _, ok := c.linker.(*stubDecorator); ok {
1167 return true
1168 }
1169 return false
1170}
1171
Yi Kong5786f5c2024-05-28 02:22:34 +09001172func (c *Module) OptimizeForSize() bool {
1173 return Bool(c.Properties.Optimize_for_size)
1174}
1175
Ivan Lozano52767be2019-10-18 14:49:46 -07001176func (c *Module) SdkVersion() string {
1177 return String(c.Properties.Sdk_version)
1178}
1179
Artur Satayev480e25b2020-04-27 18:53:18 +01001180func (c *Module) MinSdkVersion() string {
1181 return String(c.Properties.Min_sdk_version)
1182}
1183
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001184func (c *Module) SetSdkVersion(s string) {
1185 c.Properties.Sdk_version = StringPtr(s)
1186}
1187
1188func (c *Module) SetMinSdkVersion(s string) {
1189 c.Properties.Min_sdk_version = StringPtr(s)
1190}
1191
1192func (c *Module) SetStl(s string) {
1193 if c.stl != nil {
1194 c.stl.Properties.Stl = StringPtr(s)
1195 }
1196}
1197
1198func (c *Module) IsCrt() bool {
Dan Albert92fe7402020-07-15 13:33:30 -07001199 if linker, ok := c.linker.(*objectLinker); ok {
1200 return linker.isCrt()
1201 }
1202 return false
1203}
1204
Jiyong Park5df7bd32021-08-25 16:18:46 +09001205func (c *Module) SplitPerApiLevel() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001206 return CanUseSdk(c) && c.IsCrt()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001207}
1208
Colin Crossc511bc52020-04-07 16:50:32 +00001209func (c *Module) AlwaysSdk() bool {
1210 return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only)
1211}
1212
Ivan Lozano183a3212019-10-18 14:18:45 -07001213func (c *Module) CcLibrary() bool {
1214 if c.linker != nil {
1215 if _, ok := c.linker.(*libraryDecorator); ok {
1216 return true
1217 }
Colin Crossd48fe732020-09-23 20:37:24 -07001218 if _, ok := c.linker.(*prebuiltLibraryLinker); ok {
1219 return true
1220 }
Ivan Lozano183a3212019-10-18 14:18:45 -07001221 }
1222 return false
1223}
1224
1225func (c *Module) CcLibraryInterface() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001226 if c.library != nil {
Ivan Lozano183a3212019-10-18 14:18:45 -07001227 return true
1228 }
1229 return false
1230}
1231
Ivan Lozanoadd122a2023-07-13 11:01:41 -04001232func (c *Module) RlibStd() bool {
1233 panic(fmt.Errorf("RlibStd called on non-Rust module: %q", c.BaseModuleName()))
1234}
1235
Ivan Lozano61c02cc2023-06-09 14:06:44 -04001236func (c *Module) RustLibraryInterface() bool {
1237 return false
1238}
1239
Ivan Lozano0a468a42024-05-13 21:03:34 -04001240func (c *Module) CrateName() string {
1241 panic(fmt.Errorf("CrateName called on non-Rust module: %q", c.BaseModuleName()))
1242}
1243
1244func (c *Module) ExportedCrateLinkDirs() []string {
1245 panic(fmt.Errorf("ExportedCrateLinkDirs called on non-Rust module: %q", c.BaseModuleName()))
1246}
1247
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001248func (c *Module) IsFuzzModule() bool {
1249 if _, ok := c.compiler.(*fuzzBinary); ok {
1250 return true
1251 }
1252 return false
1253}
1254
1255func (c *Module) FuzzModuleStruct() fuzz.FuzzModule {
1256 return c.FuzzModule
1257}
1258
1259func (c *Module) FuzzPackagedModule() fuzz.FuzzPackagedModule {
1260 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1261 return fuzzer.fuzzPackagedModule
1262 }
1263 panic(fmt.Errorf("FuzzPackagedModule called on non-fuzz module: %q", c.BaseModuleName()))
1264}
1265
Hamzeh Zawawy38917492023-04-05 22:08:46 +00001266func (c *Module) FuzzSharedLibraries() android.RuleBuilderInstalls {
Ivan Lozano0f9963e2023-02-06 13:31:02 -05001267 if fuzzer, ok := c.compiler.(*fuzzBinary); ok {
1268 return fuzzer.sharedLibraries
1269 }
1270 panic(fmt.Errorf("FuzzSharedLibraries called on non-fuzz module: %q", c.BaseModuleName()))
1271}
1272
Ivan Lozano2b262972019-11-21 12:30:50 -08001273func (c *Module) NonCcVariants() bool {
1274 return false
1275}
1276
Ivan Lozano183a3212019-10-18 14:18:45 -07001277func (c *Module) SetStatic() {
1278 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001279 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001280 library.setStatic()
1281 return
1282 }
1283 }
1284 panic(fmt.Errorf("SetStatic called on non-library module: %q", c.BaseModuleName()))
1285}
1286
1287func (c *Module) SetShared() {
1288 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001289 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001290 library.setShared()
1291 return
1292 }
1293 }
1294 panic(fmt.Errorf("SetShared called on non-library module: %q", c.BaseModuleName()))
1295}
1296
1297func (c *Module) BuildStaticVariant() bool {
1298 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001299 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001300 return library.buildStatic()
1301 }
1302 }
1303 panic(fmt.Errorf("BuildStaticVariant called on non-library module: %q", c.BaseModuleName()))
1304}
1305
1306func (c *Module) BuildSharedVariant() bool {
1307 if c.linker != nil {
Ivan Lozano52767be2019-10-18 14:49:46 -07001308 if library, ok := c.linker.(libraryInterface); ok {
Ivan Lozano183a3212019-10-18 14:18:45 -07001309 return library.buildShared()
1310 }
1311 }
1312 panic(fmt.Errorf("BuildSharedVariant called on non-library module: %q", c.BaseModuleName()))
1313}
1314
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04001315func (c *Module) BuildRlibVariant() bool {
1316 // cc modules can never build rlib variants
1317 return false
1318}
1319
Ivan Lozano183a3212019-10-18 14:18:45 -07001320func (c *Module) Module() android.Module {
1321 return c
1322}
1323
Jiyong Parkc20eee32018-09-05 22:36:17 +09001324func (c *Module) OutputFile() android.OptionalPath {
1325 return c.outputFile
1326}
1327
Ivan Lozanoa0cd8f92020-04-09 09:56:02 -04001328func (c *Module) CoverageFiles() android.Paths {
1329 if c.linker != nil {
1330 if library, ok := c.linker.(libraryInterface); ok {
1331 return library.objs().coverageFiles
1332 }
1333 }
1334 panic(fmt.Errorf("CoverageFiles called on non-library module: %q", c.BaseModuleName()))
1335}
1336
Ivan Lozano183a3212019-10-18 14:18:45 -07001337var _ LinkableInterface = (*Module)(nil)
1338
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001339func (c *Module) VersionedInterface() VersionedInterface {
1340 if c.library != nil {
1341 return c.library
1342 }
1343 return nil
1344}
1345
Jiyong Park719b4462019-01-13 00:39:51 +09001346func (c *Module) UnstrippedOutputFile() android.Path {
Jiyong Parkaf6d8952019-01-31 12:21:23 +09001347 if c.linker != nil {
1348 return c.linker.unstrippedOutputFilePath()
Jiyong Park719b4462019-01-13 00:39:51 +09001349 }
1350 return nil
1351}
1352
Jiyong Parkee9a98d2019-08-09 14:44:36 +09001353func (c *Module) CoverageOutputFile() android.OptionalPath {
1354 if c.linker != nil {
1355 return c.linker.coverageOutputFilePath()
1356 }
1357 return android.OptionalPath{}
1358}
1359
Jiyong Parkb7c24df2019-02-01 12:03:59 +09001360func (c *Module) RelativeInstallPath() string {
1361 if c.installer != nil {
1362 return c.installer.relativeInstallPath()
1363 }
1364 return ""
1365}
1366
Jooyung Han344d5432019-08-23 11:17:39 +09001367func (c *Module) VndkVersion() string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001368 return c.Properties.VndkVersion
Jooyung Han344d5432019-08-23 11:17:39 +09001369}
1370
Colin Cross36242852017-06-23 15:06:31 -07001371func (c *Module) Init() android.Module {
Dan Willemsenf923f2b2018-05-09 13:45:03 -07001372 c.AddProperties(&c.Properties, &c.VendorProperties)
Joe Onorato37f900c2023-07-18 16:58:16 -07001373 for _, generator := range c.generators {
1374 c.AddProperties(generator.GeneratorProps()...)
1375 }
Colin Crossca860ac2016-01-04 14:34:37 -08001376 if c.compiler != nil {
Colin Cross36242852017-06-23 15:06:31 -07001377 c.AddProperties(c.compiler.compilerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001378 }
1379 if c.linker != nil {
Colin Cross36242852017-06-23 15:06:31 -07001380 c.AddProperties(c.linker.linkerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001381 }
1382 if c.installer != nil {
Colin Cross36242852017-06-23 15:06:31 -07001383 c.AddProperties(c.installer.installerProps()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001384 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001385 if c.stl != nil {
Colin Cross36242852017-06-23 15:06:31 -07001386 c.AddProperties(c.stl.props()...)
Colin Crossa8e07cc2016-04-04 15:07:06 -07001387 }
Colin Cross16b23492016-01-06 14:41:07 -08001388 if c.sanitize != nil {
Colin Cross36242852017-06-23 15:06:31 -07001389 c.AddProperties(c.sanitize.props()...)
Colin Cross16b23492016-01-06 14:41:07 -08001390 }
Dan Willemsen581341d2017-02-09 16:16:31 -08001391 if c.coverage != nil {
Colin Cross36242852017-06-23 15:06:31 -07001392 c.AddProperties(c.coverage.props()...)
Dan Willemsen581341d2017-02-09 16:16:31 -08001393 }
Cory Barkera1da26f2022-06-07 20:12:06 +00001394 if c.fuzzer != nil {
1395 c.AddProperties(c.fuzzer.props()...)
1396 }
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001397 if c.sabi != nil {
Colin Cross36242852017-06-23 15:06:31 -07001398 c.AddProperties(c.sabi.props()...)
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001399 }
Stephen Craneba090d12017-05-09 15:44:35 -07001400 if c.lto != nil {
1401 c.AddProperties(c.lto.props()...)
1402 }
Yi Kongeb8efc92021-12-09 18:06:29 +08001403 if c.afdo != nil {
1404 c.AddProperties(c.afdo.props()...)
1405 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001406 if c.orderfile != nil {
1407 c.AddProperties(c.orderfile.props()...)
1408 }
Colin Crossca860ac2016-01-04 14:34:37 -08001409 for _, feature := range c.features {
Colin Cross36242852017-06-23 15:06:31 -07001410 c.AddProperties(feature.props()...)
Colin Crossca860ac2016-01-04 14:34:37 -08001411 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07001412 // Allow test-only on libraries that are not cc_test_library
1413 if c.library != nil && !c.testLibrary() {
1414 c.AddProperties(&c.sourceProperties)
1415 }
Colin Crossc472d572015-03-17 15:06:21 -07001416
Colin Cross36242852017-06-23 15:06:31 -07001417 android.InitAndroidArchModule(c, c.hod, c.multilib)
Jiyong Park7916bfc2019-09-30 19:13:12 +09001418 android.InitApexModule(c)
Jooyung Han18020ea2019-11-13 10:50:48 +09001419 android.InitDefaultableModule(c)
Jiyong Park9d452992018-10-03 00:38:19 +09001420
Colin Cross36242852017-06-23 15:06:31 -07001421 return c
Colin Crossc472d572015-03-17 15:06:21 -07001422}
1423
Yi-Yo Chiang1080f0c2022-11-22 18:24:14 +08001424// UseVndk() returns true if this module is built against VNDK.
1425// This means the vendor and product variants of a module.
Ivan Lozano52767be2019-10-18 14:49:46 -07001426func (c *Module) UseVndk() bool {
Inseob Kim64c43952019-08-26 16:52:35 +09001427 return c.Properties.VndkVersion != ""
Dan Willemsen4416e5d2017-04-06 12:43:22 -07001428}
1429
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001430func CanUseSdk(c LinkableInterface) bool {
1431 return c.Module().Target().Os == android.Android && c.Target().NativeBridge == android.NativeBridgeDisabled &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09001432 !c.InVendorOrProduct() && !c.InRamdisk() && !c.InRecovery() && !c.InVendorRamdisk()
Colin Crossc511bc52020-04-07 16:50:32 +00001433}
1434
1435func (c *Module) UseSdk() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001436 if CanUseSdk(c) {
Colin Cross1348ce32020-10-01 13:37:16 -07001437 return String(c.Properties.Sdk_version) != ""
Colin Crossc511bc52020-04-07 16:50:32 +00001438 }
1439 return false
1440}
1441
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001442func (c *Module) isCoverageVariant() bool {
1443 return c.coverage.Properties.IsCoverageVariant
1444}
1445
Colin Cross95f1ca02020-10-29 20:47:22 -07001446func (c *Module) IsNdk(config android.Config) bool {
1447 return inList(c.BaseModuleName(), *getNDKKnownLibs(config))
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001448}
1449
Colin Cross127bb8b2020-12-16 16:46:01 -08001450func (c *Module) IsLlndk() bool {
1451 return c.VendorProperties.IsLLNDK
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001452}
1453
Colin Cross1f3f1302021-04-26 18:37:44 -07001454func (m *Module) NeedsLlndkVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001455 lib := moduleVersionedInterface(m)
1456 return lib != nil && (lib.HasLLNDKStubs() || lib.HasLLNDKHeaders())
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001457}
1458
Colin Cross5271fea2021-04-27 13:06:04 -07001459func (m *Module) NeedsVendorPublicLibraryVariants() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001460 lib := moduleVersionedInterface(m)
1461 return lib != nil && (lib.HasVendorPublicLibrary())
Colin Cross5271fea2021-04-27 13:06:04 -07001462}
1463
1464// IsVendorPublicLibrary returns true for vendor public libraries.
1465func (c *Module) IsVendorPublicLibrary() bool {
1466 return c.VendorProperties.IsVendorPublicLibrary
1467}
1468
Ivan Lozanof1868af2022-04-12 13:08:36 -04001469func (c *Module) IsVndkPrebuiltLibrary() bool {
1470 if _, ok := c.linker.(*vndkPrebuiltLibraryDecorator); ok {
1471 return true
1472 }
1473 return false
1474}
1475
1476func (c *Module) SdkAndPlatformVariantVisibleToMake() bool {
1477 return c.Properties.SdkAndPlatformVariantVisibleToMake
1478}
1479
Ivan Lozanod7586b62021-04-01 09:49:36 -04001480func (c *Module) HasLlndkStubs() bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001481 lib := moduleVersionedInterface(c)
1482 return lib != nil && lib.HasLLNDKStubs()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001483}
1484
1485func (c *Module) StubsVersion() string {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001486 if lib, ok := c.linker.(VersionedInterface); ok {
1487 return lib.StubsVersion()
Ivan Lozanod7586b62021-04-01 09:49:36 -04001488 }
1489 panic(fmt.Errorf("StubsVersion called on non-versioned module: %q", c.BaseModuleName()))
1490}
1491
Colin Cross127bb8b2020-12-16 16:46:01 -08001492// isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
1493// and does not set llndk.vendor_available: false.
1494func (c *Module) isImplementationForLLNDKPublic() bool {
1495 library, _ := c.library.(*libraryDecorator)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001496 return library != nil && library.HasLLNDKStubs() &&
Colin Cross0fb7fcd2021-03-02 11:00:07 -08001497 !Bool(library.Properties.Llndk.Private)
Colin Cross127bb8b2020-12-16 16:46:01 -08001498}
1499
Colin Cross3513fb12024-01-24 14:44:47 -08001500func (c *Module) isAfdoCompile(ctx ModuleContext) bool {
Yi Kong4ef54592022-02-14 20:00:10 +08001501 if afdo := c.afdo; afdo != nil {
Colin Cross3513fb12024-01-24 14:44:47 -08001502 return afdo.isAfdoCompile(ctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001503 }
1504 return false
1505}
1506
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001507func (c *Module) isOrderfileCompile() bool {
1508 if orderfile := c.orderfile; orderfile != nil {
1509 return orderfile.Properties.OrderfileLoad
1510 }
1511 return false
1512}
1513
Yi Kongc702ebd2022-08-19 16:02:45 +08001514func (c *Module) isCfi() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001515 return c.sanitize.isSanitizerEnabled(cfi)
Yi Kongc702ebd2022-08-19 16:02:45 +08001516}
1517
Yi Konged79fa32023-06-04 17:15:42 +09001518func (c *Module) isFuzzer() bool {
Colin Cross694fced2024-06-25 14:56:42 -07001519 return c.sanitize.isSanitizerEnabled(Fuzzer)
Yi Konged79fa32023-06-04 17:15:42 +09001520}
1521
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001522func (c *Module) isNDKStubLibrary() bool {
1523 if _, ok := c.compiler.(*stubDecorator); ok {
1524 return true
1525 }
1526 return false
1527}
1528
Ivan Lozanoc08897c2021-04-02 12:41:32 -04001529func (c *Module) SubName() string {
1530 return c.Properties.SubName
1531}
1532
Jiyong Park25fc6a92018-11-18 18:02:45 +09001533func (c *Module) IsStubs() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001534 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001535 return lib.BuildStubs()
Jiyong Park25fc6a92018-11-18 18:02:45 +09001536 }
1537 return false
1538}
1539
1540func (c *Module) HasStubsVariants() bool {
Colin Cross31076b32020-10-23 17:22:06 -07001541 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001542 return lib.HasStubsVariants()
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001543 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001544 return false
1545}
1546
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001547func (c *Module) RustApexExclude() bool {
1548 return false
1549}
1550
Alan Stokes73feba32022-11-14 12:21:24 +00001551func (c *Module) IsStubsImplementationRequired() bool {
1552 if lib := c.library; lib != nil {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001553 return lib.IsStubsImplementationRequired()
Alan Stokes73feba32022-11-14 12:21:24 +00001554 }
1555 return false
1556}
1557
Colin Cross0477b422020-10-13 18:43:54 -07001558// If this is a stubs library, ImplementationModuleName returns the name of the module that contains
1559// the implementation. If it is an implementation library it returns its own name.
1560func (c *Module) ImplementationModuleName(ctx android.BaseModuleContext) string {
1561 name := ctx.OtherModuleName(c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001562 if versioned, ok := c.linker.(VersionedInterface); ok {
1563 name = versioned.ImplementationModuleName(name)
Colin Cross0477b422020-10-13 18:43:54 -07001564 }
1565 return name
1566}
1567
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001568// Similar to ImplementationModuleNameByCtx, but uses the Make variant of the module
Martin Stjernholm2856c662020-12-02 15:03:42 +00001569// name as base name, for use in AndroidMk output. E.g. for a prebuilt module
1570// where the Soong name is prebuilt_foo, this returns foo (which works in Make
1571// under the premise that the prebuilt module overrides its source counterpart
1572// if it is exposed to Make).
1573func (c *Module) ImplementationModuleNameForMake(ctx android.BaseModuleContext) string {
1574 name := c.BaseModuleName()
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001575 if versioned, ok := c.linker.(VersionedInterface); ok {
1576 name = versioned.ImplementationModuleName(name)
Martin Stjernholm2856c662020-12-02 15:03:42 +00001577 }
1578 return name
1579}
1580
Jiyong Park7d55b612021-06-11 17:22:09 +09001581func (c *Module) Bootstrap() bool {
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001582 return Bool(c.Properties.Bootstrap)
1583}
1584
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001585func (c *Module) nativeCoverage() bool {
Pirama Arumuga Nainar5f69b9a2019-09-12 13:18:48 -07001586 // Bug: http://b/137883967 - native-bridge modules do not currently work with coverage
1587 if c.Target().NativeBridge == android.NativeBridgeEnabled {
1588 return false
1589 }
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001590 return c.linker != nil && c.linker.nativeCoverage()
1591}
1592
Ivan Lozano3a7d0002021-03-30 12:19:36 -04001593func (c *Module) IsSnapshotPrebuilt() bool {
Ivan Lozanod1dec542021-05-26 15:33:11 -04001594 if p, ok := c.linker.(SnapshotInterface); ok {
1595 return p.IsSnapshotPrebuilt()
Inseob Kimeec88e12020-01-22 11:11:29 +09001596 }
1597 return false
Inseob Kim8471cda2019-11-15 09:59:12 +09001598}
1599
Jiyong Parkf1194352019-02-25 11:05:47 +09001600func isBionic(name string) bool {
1601 switch name {
Jooyung Hanbff73352022-12-13 18:29:44 +09001602 case "libc", "libm", "libdl", "libdl_android", "linker":
Jiyong Parkf1194352019-02-25 11:05:47 +09001603 return true
1604 }
1605 return false
1606}
1607
Martin Stjernholm279de572019-09-10 23:18:20 +01001608func InstallToBootstrap(name string, config android.Config) bool {
Florian Mayer95cd6db2023-03-23 17:48:07 -07001609 if name == "libclang_rt.hwasan" || name == "libc_hwasan" {
Jooyung Han8ce8db92020-05-15 19:05:05 +09001610 return true
Peter Collingbourne3478bb22019-04-24 14:41:12 -07001611 }
1612 return isBionic(name)
1613}
1614
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001615func (c *Module) isCfiAssemblySupportEnabled() bool {
1616 return c.sanitize != nil &&
1617 Bool(c.sanitize.Properties.Sanitize.Config.Cfi_assembly_support)
1618}
1619
Inseob Kim800d1142021-06-14 12:03:51 +09001620func (c *Module) InstallInRoot() bool {
1621 return c.installer != nil && c.installer.installInRoot()
1622}
1623
Colin Crossca860ac2016-01-04 14:34:37 -08001624type baseModuleContext struct {
Colin Cross0ea8ba82019-06-06 14:33:29 -07001625 android.BaseModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001626 moduleContextImpl
1627}
1628
Colin Cross37047f12016-12-13 17:06:13 -08001629type depsContext struct {
1630 android.BottomUpMutatorContext
1631 moduleContextImpl
1632}
1633
Colin Crossca860ac2016-01-04 14:34:37 -08001634type moduleContext struct {
Colin Cross635c3b02016-05-18 15:37:25 -07001635 android.ModuleContext
Colin Crossca860ac2016-01-04 14:34:37 -08001636 moduleContextImpl
1637}
1638
1639type moduleContextImpl struct {
1640 mod *Module
1641 ctx BaseModuleContext
1642}
1643
Colin Crossb98c8b02016-07-29 13:44:28 -07001644func (ctx *moduleContextImpl) toolchain() config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08001645 return ctx.mod.toolchain(ctx.ctx)
1646}
1647
1648func (ctx *moduleContextImpl) static() bool {
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00001649 return ctx.mod.static()
Colin Crossca860ac2016-01-04 14:34:37 -08001650}
1651
1652func (ctx *moduleContextImpl) staticBinary() bool {
Jiyong Park379de2f2018-12-19 02:47:14 +09001653 return ctx.mod.staticBinary()
Colin Crossca860ac2016-01-04 14:34:37 -08001654}
1655
Colin Cross6a730042024-12-05 13:53:43 -08001656func (ctx *moduleContextImpl) staticLibrary() bool {
1657 return ctx.mod.staticLibrary()
1658}
1659
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07001660func (ctx *moduleContextImpl) testBinary() bool {
1661 return ctx.mod.testBinary()
1662}
1663
Yi Kong56fc1b62022-09-06 16:24:00 +08001664func (ctx *moduleContextImpl) testLibrary() bool {
1665 return ctx.mod.testLibrary()
1666}
1667
Jiyong Park1d1119f2019-07-29 21:27:18 +09001668func (ctx *moduleContextImpl) header() bool {
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001669 return ctx.mod.Header()
Jiyong Park1d1119f2019-07-29 21:27:18 +09001670}
1671
Inseob Kim7f283f42020-06-01 21:53:49 +09001672func (ctx *moduleContextImpl) binary() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001673 return ctx.mod.Binary()
Inseob Kim7f283f42020-06-01 21:53:49 +09001674}
1675
Inseob Kim1042d292020-06-01 23:23:05 +09001676func (ctx *moduleContextImpl) object() bool {
Ivan Lozanod7586b62021-04-01 09:49:36 -04001677 return ctx.mod.Object()
Inseob Kim1042d292020-06-01 23:23:05 +09001678}
1679
Yi Kong5786f5c2024-05-28 02:22:34 +09001680func (ctx *moduleContextImpl) optimizeForSize() bool {
1681 return ctx.mod.OptimizeForSize()
1682}
1683
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001684func (ctx *moduleContextImpl) useSdk() bool {
Colin Crossc511bc52020-04-07 16:50:32 +00001685 return ctx.mod.UseSdk()
Colin Crossca860ac2016-01-04 14:34:37 -08001686}
1687
1688func (ctx *moduleContextImpl) sdkVersion() string {
Dan Willemsena96ff642016-06-07 12:34:45 -07001689 if ctx.ctx.Device() {
Justin Yun732aa6a2018-03-23 17:43:47 +09001690 return String(ctx.mod.Properties.Sdk_version)
Dan Willemsena96ff642016-06-07 12:34:45 -07001691 }
1692 return ""
Colin Crossca860ac2016-01-04 14:34:37 -08001693}
1694
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001695func MinSdkVersion(mod VersionedLinkableInterface, ctxIsForPlatform bool, device bool,
1696 platformSdkVersion string) string {
1697
1698 ver := mod.MinSdkVersion()
1699 if ver == "apex_inherit" && !ctxIsForPlatform {
1700 ver = mod.ApexSdkVersion().String()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001701 }
1702 if ver == "apex_inherit" || ver == "" {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001703 ver = mod.SdkVersion()
Jiyong Parkb35a8192020-08-10 15:59:36 +09001704 }
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001705
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001706 if device {
Jooyung Hanaa2d3f52024-11-09 02:41:06 +00001707 // When building for vendor/product, use the latest _stable_ API as "current".
1708 // This is passed to clang/aidl compilers so that compiled/generated code works
1709 // with the system.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001710 if (mod.InVendor() || mod.InProduct()) && (ver == "" || ver == "current") {
1711 ver = platformSdkVersion
Yi-Yo Chiang88960aa2024-01-19 15:02:29 +08001712 }
1713 }
1714
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001715 // For crt objects, the meaning of min_sdk_version is very different from other types of
1716 // module. For them, min_sdk_version defines the oldest version that the build system will
1717 // create versioned variants for. For example, if min_sdk_version is 16, then sdk variant of
1718 // the crt object has local variants of 16, 17, ..., up to the latest version. sdk_version
1719 // and min_sdk_version properties of the variants are set to the corresponding version
Jiyong Park5df7bd32021-08-25 16:18:46 +09001720 // numbers. However, the non-sdk variant (for apex or platform) of the crt object is left
1721 // untouched. min_sdk_version: 16 doesn't actually mean that the non-sdk variant has to
1722 // support such an old version. The version is set to the later version in case when the
1723 // non-sdk variant is for the platform, or the min_sdk_version of the containing APEX if
1724 // it's for an APEX.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001725 if mod.IsCrt() && !mod.IsSdkVariant() {
1726 if ctxIsForPlatform {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001727 ver = strconv.Itoa(android.FutureApiLevelInt)
1728 } else { // for apex
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001729 ver = mod.ApexSdkVersion().String()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001730 if ver == "" { // in case when min_sdk_version was not set by the APEX
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001731 ver = mod.SdkVersion()
Jiyong Park5df7bd32021-08-25 16:18:46 +09001732 }
1733 }
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09001734 }
1735
Jiyong Parkb35a8192020-08-10 15:59:36 +09001736 // Also make sure that minSdkVersion is not greater than sdkVersion, if they are both numbers
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001737 sdkVersionInt, err := strconv.Atoi(mod.SdkVersion())
Jiyong Parkb35a8192020-08-10 15:59:36 +09001738 minSdkVersionInt, err2 := strconv.Atoi(ver)
1739 if err == nil && err2 == nil {
1740 if sdkVersionInt < minSdkVersionInt {
1741 return strconv.Itoa(sdkVersionInt)
1742 }
1743 }
1744 return ver
1745}
1746
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001747func (ctx *moduleContextImpl) minSdkVersion() string {
1748 platformSdkVersion := ""
1749 if ctx.ctx.Device() {
1750 platformSdkVersion = ctx.ctx.Config().PlatformSdkVersion().String()
1751 }
1752 return MinSdkVersion(ctx.mod, CtxIsForPlatform(ctx.ctx), ctx.ctx.Device(), platformSdkVersion)
1753}
1754
Jiyong Parkb35a8192020-08-10 15:59:36 +09001755func (ctx *moduleContextImpl) isSdkVariant() bool {
1756 return ctx.mod.IsSdkVariant()
1757}
1758
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001759func (ctx *moduleContextImpl) useVndk() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07001760 return ctx.mod.UseVndk()
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07001761}
Justin Yun8effde42017-06-23 19:24:43 +09001762
Kiyoung Kimaa394802024-01-08 12:55:45 +09001763func (ctx *moduleContextImpl) InVendorOrProduct() bool {
1764 return ctx.mod.InVendorOrProduct()
1765}
1766
Colin Cross95f1ca02020-10-29 20:47:22 -07001767func (ctx *moduleContextImpl) isNdk(config android.Config) bool {
1768 return ctx.mod.IsNdk(config)
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001769}
1770
Colin Cross127bb8b2020-12-16 16:46:01 -08001771func (ctx *moduleContextImpl) IsLlndk() bool {
1772 return ctx.mod.IsLlndk()
Logan Chienf6dbd9c2019-01-16 20:19:51 +08001773}
1774
Colin Cross127bb8b2020-12-16 16:46:01 -08001775func (ctx *moduleContextImpl) isImplementationForLLNDKPublic() bool {
1776 return ctx.mod.isImplementationForLLNDKPublic()
1777}
1778
Colin Cross3513fb12024-01-24 14:44:47 -08001779func (ctx *moduleContextImpl) isAfdoCompile(mctx ModuleContext) bool {
1780 return ctx.mod.isAfdoCompile(mctx)
Yi Kong4ef54592022-02-14 20:00:10 +08001781}
1782
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001783func (ctx *moduleContextImpl) isOrderfileCompile() bool {
1784 return ctx.mod.isOrderfileCompile()
1785}
1786
Yi Kongc702ebd2022-08-19 16:02:45 +08001787func (ctx *moduleContextImpl) isCfi() bool {
1788 return ctx.mod.isCfi()
1789}
1790
Yi Konged79fa32023-06-04 17:15:42 +09001791func (ctx *moduleContextImpl) isFuzzer() bool {
1792 return ctx.mod.isFuzzer()
1793}
1794
Pirama Arumuga Nainar1acd4472018-12-10 15:12:40 -08001795func (ctx *moduleContextImpl) isNDKStubLibrary() bool {
1796 return ctx.mod.isNDKStubLibrary()
1797}
1798
Colin Cross5271fea2021-04-27 13:06:04 -07001799func (ctx *moduleContextImpl) IsVendorPublicLibrary() bool {
1800 return ctx.mod.IsVendorPublicLibrary()
1801}
1802
Dan Willemsen8146b2f2016-03-30 21:00:30 -07001803func (ctx *moduleContextImpl) selectedStl() string {
1804 if stl := ctx.mod.stl; stl != nil {
1805 return stl.Properties.SelectedStl
1806 }
1807 return ""
1808}
1809
Ivan Lozanobd721262018-11-27 14:33:03 -08001810func (ctx *moduleContextImpl) useClangLld(actx ModuleContext) bool {
1811 return ctx.mod.linker.useClangLld(actx)
1812}
1813
Colin Crossce75d2c2016-10-06 16:12:58 -07001814func (ctx *moduleContextImpl) baseModuleName() string {
Spandan Das2b6dfb52024-01-19 00:22:22 +00001815 return ctx.mod.BaseModuleName()
Colin Crossce75d2c2016-10-06 16:12:58 -07001816}
1817
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001818func CtxIsForPlatform(ctx android.BaseModuleContext) bool {
1819 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Colin Crossff694a82023-12-13 15:54:49 -08001820 return apexInfo.IsForPlatform()
Logan Chiene274fc92019-12-03 11:18:32 -08001821}
1822
Colin Crosse07f2312020-08-13 11:24:56 -07001823func (ctx *moduleContextImpl) apexVariationName() string {
Colin Crossff694a82023-12-13 15:54:49 -08001824 apexInfo, _ := android.ModuleProvider(ctx.ctx, android.ApexInfoProvider)
1825 return apexInfo.ApexVariationName
Jiyong Park25fc6a92018-11-18 18:02:45 +09001826}
1827
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001828func (ctx *moduleContextImpl) bootstrap() bool {
Jiyong Park7d55b612021-06-11 17:22:09 +09001829 return ctx.mod.Bootstrap()
Jiyong Parka4b9dd02019-01-16 22:53:13 +09001830}
1831
Pirama Arumuga Nainar65c95ff2019-03-25 10:21:31 -07001832func (ctx *moduleContextImpl) nativeCoverage() bool {
1833 return ctx.mod.nativeCoverage()
1834}
1835
Colin Cross95b07f22020-12-16 11:06:50 -08001836func (ctx *moduleContextImpl) isPreventInstall() bool {
1837 return ctx.mod.Properties.PreventInstall
1838}
1839
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001840func (ctx *moduleContextImpl) getSharedFlags() *SharedFlags {
1841 shared := &ctx.mod.sharedFlags
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001842 if shared.FlagsMap == nil {
1843 shared.NumSharedFlags = 0
1844 shared.FlagsMap = make(map[string]string)
Chih-Hung Hsieh7540a782022-01-08 19:56:09 -08001845 }
1846 return shared
1847}
1848
Cindy Zhou5d5cfc12021-01-09 08:25:22 -08001849func (ctx *moduleContextImpl) isCfiAssemblySupportEnabled() bool {
1850 return ctx.mod.isCfiAssemblySupportEnabled()
1851}
1852
Colin Cross4a9e6ec2023-12-18 15:29:41 -08001853func (ctx *moduleContextImpl) notInPlatform() bool {
1854 return ctx.mod.NotInPlatform()
1855}
1856
Yu Liu76d94462024-10-31 23:32:36 +00001857func (ctx *moduleContextImpl) getOrCreateMakeVarsInfo() *CcMakeVarsInfo {
1858 if ctx.mod.makeVarsInfo == nil {
1859 ctx.mod.makeVarsInfo = &CcMakeVarsInfo{}
1860 }
1861 return ctx.mod.makeVarsInfo
1862}
1863
Colin Cross635c3b02016-05-18 15:37:25 -07001864func newBaseModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001865 return &Module{
1866 hod: hod,
1867 multilib: multilib,
1868 }
1869}
1870
Colin Cross635c3b02016-05-18 15:37:25 -07001871func newModule(hod android.HostOrDeviceSupported, multilib android.Multilib) *Module {
Colin Crossca860ac2016-01-04 14:34:37 -08001872 module := newBaseModule(hod, multilib)
Dan Willemsena03cf6d2016-09-26 15:45:04 -07001873 module.features = []feature{
1874 &tidyFeature{},
1875 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07001876 module.stl = &stl{}
Colin Cross16b23492016-01-06 14:41:07 -08001877 module.sanitize = &sanitize{}
Dan Willemsen581341d2017-02-09 16:16:31 -08001878 module.coverage = &coverage{}
Cory Barkera1da26f2022-06-07 20:12:06 +00001879 module.fuzzer = &fuzzer{}
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08001880 module.sabi = &sabi{}
Stephen Craneba090d12017-05-09 15:44:35 -07001881 module.lto = &lto{}
Yi Kongeb8efc92021-12-09 18:06:29 +08001882 module.afdo = &afdo{}
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00001883 module.orderfile = &orderfile{}
Colin Crossca860ac2016-01-04 14:34:37 -08001884 return module
1885}
1886
Colin Crossce75d2c2016-10-06 16:12:58 -07001887func (c *Module) Prebuilt() *android.Prebuilt {
1888 if p, ok := c.linker.(prebuiltLinkerInterface); ok {
1889 return p.prebuilt()
1890 }
1891 return nil
1892}
1893
Ivan Lozano3968d8f2020-12-14 11:27:52 -05001894func (c *Module) IsPrebuilt() bool {
1895 return c.Prebuilt() != nil
1896}
1897
Colin Crossce75d2c2016-10-06 16:12:58 -07001898func (c *Module) Name() string {
1899 name := c.ModuleBase.Name()
Dan Willemsen01a90592017-04-07 15:21:13 -07001900 if p, ok := c.linker.(interface {
1901 Name(string) string
1902 }); ok {
Colin Crossce75d2c2016-10-06 16:12:58 -07001903 name = p.Name(name)
1904 }
1905 return name
1906}
1907
Ivan Lozano9eaacc82024-10-30 14:28:17 +00001908func (c *Module) Multilib() string {
1909 return c.Arch().ArchType.Multilib
1910}
1911
1912func (c *Module) ApexSdkVersion() android.ApiLevel {
1913 return c.apexSdkVersion
1914}
1915
Alex Light3d673592019-01-18 14:37:31 -08001916func (c *Module) Symlinks() []string {
1917 if p, ok := c.installer.(interface {
1918 symlinkList() []string
1919 }); ok {
1920 return p.symlinkList()
1921 }
1922 return nil
1923}
1924
Chris Parsons216e10a2020-07-09 17:12:52 -04001925func (c *Module) DataPaths() []android.DataPath {
Liz Kammer1c14a212020-05-12 15:26:55 -07001926 if p, ok := c.installer.(interface {
Chris Parsons216e10a2020-07-09 17:12:52 -04001927 dataPaths() []android.DataPath
Liz Kammer1c14a212020-05-12 15:26:55 -07001928 }); ok {
1929 return p.dataPaths()
1930 }
1931 return nil
1932}
1933
Ivan Lozanof1868af2022-04-12 13:08:36 -04001934func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface) string {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001935 // Returns the name suffix for product and vendor variants. If the VNDK version is not
1936 // "current", it will append the VNDK version to the name suffix.
Justin Yun5f7f7e82019-11-18 19:52:14 +09001937 var nameSuffix string
Ivan Lozanof9e21722020-12-02 09:00:51 -05001938 if c.InProduct() {
Justin Yund00f5ca2021-02-03 19:43:02 +09001939 if c.ProductSpecific() {
1940 // If the module is product specific with 'product_specific: true',
1941 // do not add a name suffix because it is a base module.
1942 return ""
1943 }
Justin Yunaf1fde42023-09-27 16:22:10 +09001944 return ProductSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001945 } else {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05001946 nameSuffix = VendorSuffix
Justin Yun5f7f7e82019-11-18 19:52:14 +09001947 }
Kiyoung Kim4e765b12024-04-04 17:33:42 +09001948 if c.VndkVersion() != "" {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001949 // add version suffix only if the module is using different vndk version than the
1950 // version in product or vendor partition.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001951 nameSuffix += "." + c.VndkVersion()
Justin Yun5f7f7e82019-11-18 19:52:14 +09001952 }
1953 return nameSuffix
1954}
1955
Ivan Lozanof1868af2022-04-12 13:08:36 -04001956func GetSubnameProperty(actx android.ModuleContext, c LinkableInterface) string {
1957 var subName = ""
Inseob Kim64c43952019-08-26 16:52:35 +09001958
1959 if c.Target().NativeBridge == android.NativeBridgeEnabled {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001960 subName += NativeBridgeSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001961 }
1962
Colin Cross127bb8b2020-12-16 16:46:01 -08001963 llndk := c.IsLlndk()
Kiyoung Kimaa394802024-01-08 12:55:45 +09001964 if llndk || (c.InVendorOrProduct() && c.HasNonSystemVariants()) {
Justin Yun5f7f7e82019-11-18 19:52:14 +09001965 // .vendor.{version} suffix is added for vendor variant or .product.{version} suffix is
1966 // added for product variant only when we have vendor and product variants with core
1967 // variant. The suffix is not added for vendor-only or product-only module.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001968 subName += getNameSuffixWithVndkVersion(actx, c)
Colin Cross5271fea2021-04-27 13:06:04 -07001969 } else if c.IsVendorPublicLibrary() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001970 subName += vendorPublicLibrarySuffix
1971 } else if c.IsVndkPrebuiltLibrary() {
Inseob Kim64c43952019-08-26 16:52:35 +09001972 // .vendor suffix is added for backward compatibility with VNDK snapshot whose names with
1973 // such suffixes are already hard-coded in prebuilts/vndk/.../Android.bp.
Ivan Lozanof1868af2022-04-12 13:08:36 -04001974 subName += VendorSuffix
Yifan Hong1b3348d2020-01-21 15:53:22 -08001975 } else if c.InRamdisk() && !c.OnlyInRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001976 subName += RamdiskSuffix
Yifan Hong60e0cfb2020-10-21 15:17:56 -07001977 } else if c.InVendorRamdisk() && !c.OnlyInVendorRamdisk() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001978 subName += VendorRamdiskSuffix
Ivan Lozano52767be2019-10-18 14:49:46 -07001979 } else if c.InRecovery() && !c.OnlyInRecovery() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001980 subName += RecoverySuffix
1981 } else if c.IsSdkVariant() && (c.SdkAndPlatformVariantVisibleToMake() || c.SplitPerApiLevel()) {
1982 subName += sdkSuffix
Dan Albert92fe7402020-07-15 13:33:30 -07001983 if c.SplitPerApiLevel() {
Ivan Lozanof1868af2022-04-12 13:08:36 -04001984 subName += "." + c.SdkVersion()
Dan Albert92fe7402020-07-15 13:33:30 -07001985 }
Spandan Dasb2b41d52023-04-13 18:15:05 +00001986 } else if c.IsStubs() && c.IsSdkVariant() {
1987 // Public API surface (NDK)
1988 // Add a suffix to this stub variant to distinguish it from the module-lib stub variant.
1989 subName = sdkSuffix
Inseob Kim64c43952019-08-26 16:52:35 +09001990 }
Ivan Lozanof1868af2022-04-12 13:08:36 -04001991
1992 return subName
Chris Parsons8d6e4332021-02-22 16:13:50 -05001993}
1994
Sam Delmerico75dbca22023-04-20 13:13:25 +00001995func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
1996 ctx := &moduleContext{
1997 ModuleContext: actx,
1998 moduleContextImpl: moduleContextImpl{
1999 mod: c,
2000 },
2001 }
2002 ctx.ctx = ctx
2003 return ctx
2004}
2005
Spandan Das20fce2d2023-04-12 17:21:39 +00002006// TODO (b/277651159): Remove this allowlist
2007var (
2008 skipStubLibraryMultipleApexViolation = map[string]bool{
2009 "libclang_rt.asan": true,
2010 "libclang_rt.hwasan": true,
2011 // runtime apex
2012 "libc": true,
2013 "libc_hwasan": true,
2014 "libdl_android": true,
2015 "libm": true,
2016 "libdl": true,
Spandan Das1a0c6e12024-01-04 01:44:17 +00002017 "libz": true,
Spandan Das20fce2d2023-04-12 17:21:39 +00002018 // art apex
Martin Stjernholm75598032024-07-12 18:47:26 +01002019 // TODO(b/234351700): Remove this when com.android.art.debug is gone.
Spandan Das20fce2d2023-04-12 17:21:39 +00002020 "libandroidio": true,
2021 "libdexfile": true,
Martin Stjernholm75598032024-07-12 18:47:26 +01002022 "libdexfiled": true, // com.android.art.debug only
Spandan Das20fce2d2023-04-12 17:21:39 +00002023 "libnativebridge": true,
2024 "libnativehelper": true,
2025 "libnativeloader": true,
2026 "libsigchain": true,
2027 }
2028)
2029
2030// Returns true if a stub library could be installed in multiple apexes
2031func (c *Module) stubLibraryMultipleApexViolation(ctx android.ModuleContext) bool {
2032 // If this is not an apex variant, no check necessary
Colin Cross2dcbca62024-11-20 14:55:14 -08002033 if info, ok := android.ModuleProvider(ctx, android.ApexInfoProvider); !ok || info.IsForPlatform() {
Spandan Das20fce2d2023-04-12 17:21:39 +00002034 return false
2035 }
2036 // If this is not a stub library, no check necessary
2037 if !c.HasStubsVariants() {
2038 return false
2039 }
2040 // Skip the allowlist
2041 // Use BaseModuleName so that this matches prebuilts.
2042 if _, exists := skipStubLibraryMultipleApexViolation[c.BaseModuleName()]; exists {
2043 return false
2044 }
2045
Spandan Das20fce2d2023-04-12 17:21:39 +00002046 // Stub libraries should not have more than one apex_available
Colin Crossaf4c8562024-11-20 15:07:58 -08002047 apexAvailable := android.FirstUniqueStrings(c.ApexAvailable())
2048 if len(apexAvailable) > 1 {
Spandan Das20fce2d2023-04-12 17:21:39 +00002049 return true
2050 }
2051 // Stub libraries should not use the wildcard
Colin Crossaf4c8562024-11-20 15:07:58 -08002052 if apexAvailable[0] == android.AvailableToAnyApex {
Spandan Das20fce2d2023-04-12 17:21:39 +00002053 return true
2054 }
2055 // Default: no violation
2056 return false
2057}
2058
Chris Parsons8d6e4332021-02-22 16:13:50 -05002059func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002060 ctx := moduleContextFromAndroidModuleContext(actx, c)
2061
Inseob Kim37e0bb02024-04-29 15:54:44 +09002062 c.logtagsPaths = android.PathsForModuleSrc(actx, c.Properties.Logtags)
2063 android.SetProvider(ctx, android.LogtagsProviderKey, &android.LogtagsInfo{
2064 Logtags: c.logtagsPaths,
2065 })
2066
Ronald Braunstein6a08d492024-04-15 12:55:30 -07002067 // If Test_only is set on a module in bp file, respect the setting, otherwise
2068 // see if is a known test module type.
2069 testOnly := c.testModule || c.testLibrary()
2070 if c.sourceProperties.Test_only != nil {
2071 testOnly = Bool(c.sourceProperties.Test_only)
2072 }
2073 // Keep before any early returns.
2074 android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{
2075 TestOnly: testOnly,
2076 TopLevelTarget: c.testModule,
2077 })
2078
Ivan Lozanof1868af2022-04-12 13:08:36 -04002079 c.Properties.SubName = GetSubnameProperty(actx, c)
Colin Crossff694a82023-12-13 15:54:49 -08002080 apexInfo, _ := android.ModuleProvider(actx, android.ApexInfoProvider)
Chris Parsons8d6e4332021-02-22 16:13:50 -05002081 if !apexInfo.IsForPlatform() {
2082 c.hideApexVariantFromMake = true
2083 }
2084
Chris Parsonseefc9e62021-04-02 17:36:47 -04002085 c.makeLinkType = GetMakeLinkType(actx, c)
2086
Colin Crossf18e1102017-11-16 14:33:08 -08002087 deps := c.depsToPaths(ctx)
2088 if ctx.Failed() {
2089 return
2090 }
2091
Joe Onorato37f900c2023-07-18 16:58:16 -07002092 for _, generator := range c.generators {
2093 gen := generator.GeneratorSources(ctx)
2094 deps.IncludeDirs = append(deps.IncludeDirs, gen.IncludeDirs...)
2095 deps.ReexportedDirs = append(deps.ReexportedDirs, gen.ReexportedDirs...)
2096 deps.GeneratedDeps = append(deps.GeneratedDeps, gen.Headers...)
2097 deps.ReexportedGeneratedHeaders = append(deps.ReexportedGeneratedHeaders, gen.Headers...)
2098 deps.ReexportedDeps = append(deps.ReexportedDeps, gen.Headers...)
2099 if len(deps.Objs.objFiles) == 0 {
2100 // If we are reusuing object files (which happens when we're a shared library and we're
2101 // reusing our static variant's object files), then skip adding the actual source files,
2102 // because we already have the object for it.
2103 deps.GeneratedSources = append(deps.GeneratedSources, gen.Sources...)
2104 }
2105 }
2106
2107 if ctx.Failed() {
2108 return
2109 }
2110
Spandan Das20fce2d2023-04-12 17:21:39 +00002111 if c.stubLibraryMultipleApexViolation(actx) {
2112 actx.PropertyErrorf("apex_available",
2113 "Stub libraries should have a single apex_available (test apexes excluded). Got %v", c.ApexAvailable())
2114 }
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002115 if c.Properties.Clang != nil && *c.Properties.Clang == false {
2116 ctx.PropertyErrorf("clang", "false (GCC) is no longer supported")
Alixb5f6d9e2022-04-20 23:00:58 +00002117 } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() {
2118 ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file")
Dan Willemsen8536d6b2018-10-07 20:54:34 -07002119 }
2120
Colin Crossca860ac2016-01-04 14:34:37 -08002121 flags := Flags{
2122 Toolchain: c.toolchain(ctx),
Sasha Smundak2a4549e2018-11-05 16:49:08 -08002123 EmitXrefs: ctx.Config().EmitXrefRules(),
Colin Crossca860ac2016-01-04 14:34:37 -08002124 }
Joe Onorato37f900c2023-07-18 16:58:16 -07002125 for _, generator := range c.generators {
2126 flags = generator.GeneratorFlags(ctx, flags, deps)
2127 }
Colin Crossca860ac2016-01-04 14:34:37 -08002128 if c.compiler != nil {
Colin Crossf18e1102017-11-16 14:33:08 -08002129 flags = c.compiler.compilerFlags(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002130 }
2131 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002132 flags = c.linker.linkerFlags(ctx, flags)
Colin Crossca860ac2016-01-04 14:34:37 -08002133 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002134 if c.stl != nil {
2135 flags = c.stl.flags(ctx, flags)
2136 }
Colin Cross16b23492016-01-06 14:41:07 -08002137 if c.sanitize != nil {
2138 flags = c.sanitize.flags(ctx, flags)
2139 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002140 if c.coverage != nil {
Pirama Arumuga Nainar82fe59b2019-07-02 14:55:35 -07002141 flags, deps = c.coverage.flags(ctx, flags, deps)
Dan Willemsen581341d2017-02-09 16:16:31 -08002142 }
Cory Barkera1da26f2022-06-07 20:12:06 +00002143 if c.fuzzer != nil {
2144 flags = c.fuzzer.flags(ctx, flags)
2145 }
Stephen Craneba090d12017-05-09 15:44:35 -07002146 if c.lto != nil {
2147 flags = c.lto.flags(ctx, flags)
2148 }
Yi Kongeb8efc92021-12-09 18:06:29 +08002149 if c.afdo != nil {
2150 flags = c.afdo.flags(ctx, flags)
2151 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002152 if c.orderfile != nil {
2153 flags = c.orderfile.flags(ctx, flags)
2154 }
Colin Crossca860ac2016-01-04 14:34:37 -08002155 for _, feature := range c.features {
2156 flags = feature.flags(ctx, flags)
2157 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002158 if ctx.Failed() {
2159 return
2160 }
2161
Colin Cross4af21ed2019-11-04 09:37:55 -08002162 flags.Local.CFlags, _ = filterList(flags.Local.CFlags, config.IllegalFlags)
2163 flags.Local.CppFlags, _ = filterList(flags.Local.CppFlags, config.IllegalFlags)
2164 flags.Local.ConlyFlags, _ = filterList(flags.Local.ConlyFlags, config.IllegalFlags)
Colin Cross3f40fa42015-01-30 17:27:36 -08002165
Colin Cross4af21ed2019-11-04 09:37:55 -08002166 flags.Local.CommonFlags = append(flags.Local.CommonFlags, deps.Flags...)
Inseob Kim69378442019-06-03 19:10:47 +09002167
2168 for _, dir := range deps.IncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002169 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002170 }
2171 for _, dir := range deps.SystemIncludeDirs {
Colin Cross4af21ed2019-11-04 09:37:55 -08002172 flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-isystem "+dir.String())
Inseob Kim69378442019-06-03 19:10:47 +09002173 }
2174
Colin Cross3e5e7782022-06-17 22:17:05 +00002175 flags.Local.LdFlags = append(flags.Local.LdFlags, deps.LdFlags...)
2176
Fabien Sanglardd61f1f42017-01-10 16:21:22 -08002177 c.flags = flags
Jayant Chowdhary9677e8c2017-06-15 14:45:18 -07002178 // We need access to all the flags seen by a source file.
2179 if c.sabi != nil {
2180 flags = c.sabi.flags(ctx, flags)
2181 }
Dan Willemsen98ab3112019-08-27 21:20:40 -07002182
Colin Cross4af21ed2019-11-04 09:37:55 -08002183 flags.AssemblerWithCpp = inList("-xassembler-with-cpp", flags.Local.AsFlags)
Dan Willemsen98ab3112019-08-27 21:20:40 -07002184
Joe Onorato37f900c2023-07-18 16:58:16 -07002185 for _, generator := range c.generators {
2186 generator.GeneratorBuildActions(ctx, flags, deps)
2187 }
2188
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002189 var objs Objects
Colin Crossca860ac2016-01-04 14:34:37 -08002190 if c.compiler != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002191 objs = c.compiler.compile(ctx, flags, deps)
Colin Crossca860ac2016-01-04 14:34:37 -08002192 if ctx.Failed() {
2193 return
2194 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002195 }
2196
Colin Crossca860ac2016-01-04 14:34:37 -08002197 if c.linker != nil {
Dan Willemsen5cb580f2016-09-26 17:33:01 -07002198 outputFile := c.linker.link(ctx, flags, deps, objs)
Colin Crossca860ac2016-01-04 14:34:37 -08002199 if ctx.Failed() {
2200 return
2201 }
Colin Cross635c3b02016-05-18 15:37:25 -07002202 c.outputFile = android.OptionalPathForPath(outputFile)
Jiyong Parkb0788572018-12-20 22:10:17 +09002203
Chris Parsons94a0bba2021-06-04 15:03:47 -04002204 c.maybeUnhideFromMake()
Colin Crossb614cd42024-10-11 12:52:21 -07002205
2206 android.SetProvider(ctx, ImplementationDepInfoProvider, &ImplementationDepInfo{
2207 ImplementationDeps: depset.New(depset.PREORDER, deps.directImplementationDeps, deps.transitiveImplementationDeps),
2208 })
Colin Crossce75d2c2016-10-06 16:12:58 -07002209 }
Ronald Braunsteina115e262024-04-09 18:07:38 -07002210
Hao Chen1c8ea5b2023-10-20 23:03:45 +00002211 if Bool(c.Properties.Cmake_snapshot_supported) {
2212 android.SetProvider(ctx, cmakeSnapshotSourcesProvider, android.GlobFiles(ctx, ctx.ModuleDir()+"/**/*", nil))
2213 }
2214
Chris Parsons94a0bba2021-06-04 15:03:47 -04002215 c.maybeInstall(ctx, apexInfo)
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002216
2217 if c.linker != nil {
2218 moduleInfoJSON := ctx.ModuleInfoJSON()
2219 c.linker.moduleInfoJSON(ctx, moduleInfoJSON)
2220 moduleInfoJSON.SharedLibs = c.Properties.AndroidMkSharedLibs
2221 moduleInfoJSON.StaticLibs = c.Properties.AndroidMkStaticLibs
2222 moduleInfoJSON.SystemSharedLibs = c.Properties.AndroidMkSystemSharedLibs
2223 moduleInfoJSON.RuntimeDependencies = c.Properties.AndroidMkRuntimeLibs
2224
2225 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkSharedLibs...)
2226 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkStaticLibs...)
2227 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkHeaderLibs...)
2228 moduleInfoJSON.Dependencies = append(moduleInfoJSON.Dependencies, c.Properties.AndroidMkWholeStaticLibs...)
2229
2230 if c.sanitize != nil && len(moduleInfoJSON.Class) > 0 &&
2231 (moduleInfoJSON.Class[0] == "STATIC_LIBRARIES" || moduleInfoJSON.Class[0] == "HEADER_LIBRARIES") {
2232 if Bool(c.sanitize.Properties.SanitizeMutated.Cfi) {
2233 moduleInfoJSON.SubName += ".cfi"
2234 }
2235 if Bool(c.sanitize.Properties.SanitizeMutated.Hwaddress) {
2236 moduleInfoJSON.SubName += ".hwasan"
2237 }
2238 if Bool(c.sanitize.Properties.SanitizeMutated.Scs) {
2239 moduleInfoJSON.SubName += ".scs"
2240 }
2241 }
2242 moduleInfoJSON.SubName += c.Properties.SubName
2243
2244 if c.Properties.IsSdkVariant && c.Properties.SdkAndPlatformVariantVisibleToMake {
2245 moduleInfoJSON.Uninstallable = true
2246 }
Colin Cross4a9e6ec2023-12-18 15:29:41 -08002247 }
Wei Lia1aa2972024-06-21 13:08:51 -07002248
2249 buildComplianceMetadataInfo(ctx, c, deps)
mrziwangabdb2932024-06-18 12:43:41 -07002250
Cole Faust96a692b2024-08-08 14:47:51 -07002251 if b, ok := c.compiler.(*baseCompiler); ok {
2252 c.hasAidl = b.hasSrcExt(ctx, ".aidl")
2253 c.hasLex = b.hasSrcExt(ctx, ".l") || b.hasSrcExt(ctx, ".ll")
2254 c.hasProto = b.hasSrcExt(ctx, ".proto")
2255 c.hasRenderscript = b.hasSrcExt(ctx, ".rscript") || b.hasSrcExt(ctx, ".fs")
2256 c.hasSysprop = b.hasSrcExt(ctx, ".sysprop")
2257 c.hasWinMsg = b.hasSrcExt(ctx, ".mc")
2258 c.hasYacc = b.hasSrcExt(ctx, ".y") || b.hasSrcExt(ctx, ".yy")
2259 }
2260
Yu Liuec7043d2024-11-05 18:22:20 +00002261 ccObjectInfo := CcObjectInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002262 KytheFiles: objs.kytheFiles,
Yu Liuec7043d2024-11-05 18:22:20 +00002263 }
2264 if !ctx.Config().KatiEnabled() || !android.ShouldSkipAndroidMkProcessing(ctx, c) {
Yu Liu4f825132024-12-18 00:35:39 +00002265 ccObjectInfo.ObjFiles = objs.objFiles
2266 ccObjectInfo.TidyFiles = objs.tidyFiles
Yu Liuec7043d2024-11-05 18:22:20 +00002267 }
Yu Liu4f825132024-12-18 00:35:39 +00002268 if len(ccObjectInfo.KytheFiles)+len(ccObjectInfo.ObjFiles)+len(ccObjectInfo.TidyFiles) > 0 {
Yu Liuec7043d2024-11-05 18:22:20 +00002269 android.SetProvider(ctx, CcObjectInfoProvider, ccObjectInfo)
2270 }
2271
Yu Liuf6f85492025-01-13 21:02:36 +00002272 linkableInfo := CreateCommonLinkableInfo(ctx, c)
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002273 if lib, ok := c.linker.(VersionedInterface); ok {
2274 linkableInfo.StubsVersion = lib.StubsVersion()
Yu Liu8024b922024-12-20 23:31:32 +00002275 }
2276 if c.linker != nil {
2277 if library, ok := c.linker.(libraryInterface); ok {
2278 linkableInfo.Static = library.static()
Yu Liu8a8d5b42025-01-07 00:48:08 +00002279 linkableInfo.Shared = library.shared()
Yu Liu8024b922024-12-20 23:31:32 +00002280 linkableInfo.CoverageFiles = library.objs().coverageFiles
2281 linkableInfo.SAbiDumpFiles = library.objs().sAbiDumpFiles
2282 }
2283 }
2284 android.SetProvider(ctx, LinkableInfoProvider, linkableInfo)
Yu Liu986d98c2024-11-12 00:28:11 +00002285
Yu Liu323d77a2024-12-16 23:13:57 +00002286 ccInfo := CcInfo{
Yu Liu323d77a2024-12-16 23:13:57 +00002287 IsPrebuilt: c.IsPrebuilt(),
2288 CmakeSnapshotSupported: proptools.Bool(c.Properties.Cmake_snapshot_supported),
Yu Liu68a70b72025-01-08 22:54:44 +00002289 HasLlndkStubs: c.HasLlndkStubs(),
Yu Liu323d77a2024-12-16 23:13:57 +00002290 }
2291 if c.compiler != nil {
2292 ccInfo.CompilerInfo = &CompilerInfo{
2293 Srcs: c.compiler.(CompiledInterface).Srcs(),
2294 Cflags: c.compiler.baseCompilerProps().Cflags,
2295 AidlInterfaceInfo: AidlInterfaceInfo{
2296 Sources: c.compiler.baseCompilerProps().AidlInterface.Sources,
2297 AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot,
2298 Lang: c.compiler.baseCompilerProps().AidlInterface.Lang,
2299 Flags: c.compiler.baseCompilerProps().AidlInterface.Flags,
2300 },
2301 }
2302 switch decorator := c.compiler.(type) {
2303 case *libraryDecorator:
2304 ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
Yu Liu4f825132024-12-18 00:35:39 +00002305 ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs,
Yu Liu323d77a2024-12-16 23:13:57 +00002306 }
2307 }
2308 }
2309 if c.linker != nil {
2310 ccInfo.LinkerInfo = &LinkerInfo{
Yu Liu8024b922024-12-20 23:31:32 +00002311 WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs,
2312 StaticLibs: c.linker.baseLinkerProps().Static_libs,
2313 SharedLibs: c.linker.baseLinkerProps().Shared_libs,
2314 HeaderLibs: c.linker.baseLinkerProps().Header_libs,
Yu Liu323d77a2024-12-16 23:13:57 +00002315 }
2316 switch decorator := c.linker.(type) {
2317 case *binaryDecorator:
2318 ccInfo.LinkerInfo.BinaryDecoratorInfo = &BinaryDecoratorInfo{}
2319 case *libraryDecorator:
Yu Liu116610a2025-01-06 21:54:48 +00002320 ccInfo.LinkerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{
2321 InjectBsslHash: Bool(c.linker.(*libraryDecorator).Properties.Inject_bssl_hash),
2322 }
Yu Liu323d77a2024-12-16 23:13:57 +00002323 case *testBinary:
2324 ccInfo.LinkerInfo.TestBinaryInfo = &TestBinaryInfo{
2325 Gtest: decorator.testDecorator.gtest(),
2326 }
2327 case *benchmarkDecorator:
2328 ccInfo.LinkerInfo.BenchmarkDecoratorInfo = &BenchmarkDecoratorInfo{}
2329 case *objectLinker:
2330 ccInfo.LinkerInfo.ObjectLinkerInfo = &ObjectLinkerInfo{}
Yu Liu8a8d5b42025-01-07 00:48:08 +00002331 case *stubDecorator:
2332 ccInfo.LinkerInfo.StubDecoratorInfo = &StubDecoratorInfo{}
Yu Liu323d77a2024-12-16 23:13:57 +00002333 }
Yu Liu8024b922024-12-20 23:31:32 +00002334
2335 if s, ok := c.linker.(SnapshotInterface); ok {
2336 ccInfo.SnapshotInfo = &SnapshotInfo{
2337 SnapshotAndroidMkSuffix: s.SnapshotAndroidMkSuffix(),
2338 }
Yu Liuffe86322024-12-18 18:53:12 +00002339 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002340 if v, ok := c.linker.(VersionedInterface); ok {
2341 name := v.ImplementationModuleName(ctx.OtherModuleName(c))
Yu Liu68a70b72025-01-08 22:54:44 +00002342 ccInfo.LinkerInfo.ImplementationModuleName = &name
2343 }
Yu Liuffe86322024-12-18 18:53:12 +00002344 }
Yu Liu8a8d5b42025-01-07 00:48:08 +00002345 if c.library != nil {
2346 ccInfo.LibraryInfo = &LibraryInfo{
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002347 BuildStubs: c.library.BuildStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002348 }
2349 }
Yu Liu8024b922024-12-20 23:31:32 +00002350 android.SetProvider(ctx, CcInfoProvider, &ccInfo)
Yu Liub1bfa9d2024-12-05 18:57:51 +00002351
mrziwangabdb2932024-06-18 12:43:41 -07002352 c.setOutputFiles(ctx)
Yu Liu76d94462024-10-31 23:32:36 +00002353
2354 if c.makeVarsInfo != nil {
2355 android.SetProvider(ctx, CcMakeVarsInfoProvider, c.makeVarsInfo)
2356 }
mrziwangabdb2932024-06-18 12:43:41 -07002357}
2358
Yu Liuf6f85492025-01-13 21:02:36 +00002359func CreateCommonLinkableInfo(ctx android.ModuleContext, mod VersionedLinkableInterface) *LinkableInfo {
Yu Liu8024b922024-12-20 23:31:32 +00002360 return &LinkableInfo{
2361 StaticExecutable: mod.StaticExecutable(),
2362 HasStubsVariants: mod.HasStubsVariants(),
2363 OutputFile: mod.OutputFile(),
2364 UnstrippedOutputFile: mod.UnstrippedOutputFile(),
Yu Liuf6f85492025-01-13 21:02:36 +00002365 CoverageOutputFile: mod.CoverageOutputFile(),
2366 Partition: mod.Partition(),
Yu Liu8024b922024-12-20 23:31:32 +00002367 IsStubs: mod.IsStubs(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002368 CcLibrary: mod.CcLibrary(),
Yu Liu8024b922024-12-20 23:31:32 +00002369 CcLibraryInterface: mod.CcLibraryInterface(),
2370 RustLibraryInterface: mod.RustLibraryInterface(),
2371 BaseModuleName: mod.BaseModuleName(),
2372 IsLlndk: mod.IsLlndk(),
Yu Liuf6f85492025-01-13 21:02:36 +00002373 IsNdk: mod.IsNdk(ctx.Config()),
Yu Liu8024b922024-12-20 23:31:32 +00002374 HasNonSystemVariants: mod.HasNonSystemVariants(),
2375 SubName: mod.SubName(),
2376 InVendorOrProduct: mod.InVendorOrProduct(),
2377 InRamdisk: mod.InRamdisk(),
2378 OnlyInRamdisk: mod.OnlyInRamdisk(),
2379 InVendorRamdisk: mod.InVendorRamdisk(),
2380 OnlyInVendorRamdisk: mod.OnlyInVendorRamdisk(),
2381 InRecovery: mod.InRecovery(),
2382 OnlyInRecovery: mod.OnlyInRecovery(),
Yu Liu8a8d5b42025-01-07 00:48:08 +00002383 Installable: mod.Installable(),
Yu Liu97880e12025-01-07 19:03:34 +00002384 RelativeInstallPath: mod.RelativeInstallPath(),
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002385 // TODO(b/362509506): remove this once all apex_exclude uses are switched to stubs.
2386 RustApexExclude: mod.RustApexExclude(),
Yu Liu2da9d9a2025-01-15 00:27:02 +00002387 Bootstrap: mod.Bootstrap(),
Yu Liu8024b922024-12-20 23:31:32 +00002388 }
2389}
2390
Yu Liuec7043d2024-11-05 18:22:20 +00002391func setOutputFilesIfNotEmpty(ctx ModuleContext, files android.Paths, tag string) {
2392 if len(files) > 0 {
2393 ctx.SetOutputFiles(files, tag)
2394 }
2395}
2396
mrziwangabdb2932024-06-18 12:43:41 -07002397func (c *Module) setOutputFiles(ctx ModuleContext) {
2398 if c.outputFile.Valid() {
2399 ctx.SetOutputFiles(android.Paths{c.outputFile.Path()}, "")
2400 } else {
2401 ctx.SetOutputFiles(android.Paths{}, "")
2402 }
2403 if c.linker != nil {
2404 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.unstrippedOutputFilePath()), "unstripped")
2405 ctx.SetOutputFiles(android.PathsIfNonNil(c.linker.strippedAllOutputFilePath()), "stripped_all")
2406 }
Wei Lia1aa2972024-06-21 13:08:51 -07002407}
2408
2409func buildComplianceMetadataInfo(ctx ModuleContext, c *Module, deps PathDeps) {
2410 // Dump metadata that can not be done in android/compliance-metadata.go
2411 complianceMetadataInfo := ctx.ComplianceMetadataInfo()
Wei Li8ede4f72025-01-15 21:24:22 -08002412 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static() || ctx.ModuleType() == "cc_object"))
Wei Lia1aa2972024-06-21 13:08:51 -07002413 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.BUILT_FILES, c.outputFile.String())
2414
2415 // Static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002416 staticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(false))
Wei Lia1aa2972024-06-21 13:08:51 -07002417 staticDepNames := make([]string, 0, len(staticDeps))
2418 for _, dep := range staticDeps {
2419 staticDepNames = append(staticDepNames, dep.Name())
2420 }
Wei Li8ede4f72025-01-15 21:24:22 -08002421 // Process CrtBegin and CrtEnd as static libs
2422 ctx.VisitDirectDeps(func(dep android.Module) {
2423 depName := ctx.OtherModuleName(dep)
2424 depTag := ctx.OtherModuleDependencyTag(dep)
2425 switch depTag {
2426 case CrtBeginDepTag:
2427 staticDepNames = append(staticDepNames, depName)
2428 case CrtEndDepTag:
2429 staticDepNames = append(staticDepNames, depName)
2430 }
2431 })
Wei Lia1aa2972024-06-21 13:08:51 -07002432
Wei Li8ede4f72025-01-15 21:24:22 -08002433 staticDepPaths := make([]string, 0, len(deps.StaticLibs)+len(deps.CrtBegin)+len(deps.CrtEnd))
Wei Lia1aa2972024-06-21 13:08:51 -07002434 for _, dep := range deps.StaticLibs {
2435 staticDepPaths = append(staticDepPaths, dep.String())
2436 }
Wei Li8ede4f72025-01-15 21:24:22 -08002437 for _, dep := range deps.CrtBegin {
2438 staticDepPaths = append(staticDepPaths, dep.String())
2439 }
2440 for _, dep := range deps.CrtEnd {
2441 staticDepPaths = append(staticDepPaths, dep.String())
2442 }
Wei Lia1aa2972024-06-21 13:08:51 -07002443 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2444 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2445
2446 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002447 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002448 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2449 for _, dep := range wholeStaticDeps {
2450 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2451 }
2452
2453 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2454 for _, dep := range deps.WholeStaticLibs {
2455 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2456 }
2457 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2458 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Wei Li8ede4f72025-01-15 21:24:22 -08002459
2460 // Header libs
2461 headerLibDeps := ctx.GetDirectDepsProxyWithTag(HeaderDepTag())
2462 headerLibDepNames := make([]string, 0, len(headerLibDeps))
2463 for _, dep := range headerLibDeps {
2464 headerLibDepNames = append(headerLibDepNames, dep.Name())
2465 }
2466 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.HEADER_LIBS, android.FirstUniqueStrings(headerLibDepNames))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002467}
2468
2469func (c *Module) maybeUnhideFromMake() {
2470 // If a lib is directly included in any of the APEXes or is not available to the
2471 // platform (which is often the case when the stub is provided as a prebuilt),
2472 // unhide the stubs variant having the latest version gets visible to make. In
2473 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2474 // force anything in the make world to link against the stubs library. (unless it
2475 // is explicitly referenced via .bootstrap suffix or the module is marked with
2476 // 'bootstrap: true').
2477 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002478 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002479 c.IsStubs() && !c.InVendorRamdisk() {
2480 c.Properties.HideFromMake = false // unhide
2481 // Note: this is still non-installable
2482 }
2483}
2484
Colin Cross8ff10582023-12-07 13:10:56 -08002485// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2486// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002487func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002488 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002489 // If the module has been specifically configure to not be installed then
2490 // hide from make as otherwise it will break when running inside make
2491 // as the output path to install will not be specified. Not all uninstallable
2492 // modules can be hidden from make as some are needed for resolving make side
2493 // dependencies.
2494 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002495 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002496 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002497 c.SkipInstall()
2498 }
2499
2500 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2501 // to allow using the outputs in a genrule.
2502 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002503 c.installer.install(ctx, c.outputFile.Path())
2504 if ctx.Failed() {
2505 return
Colin Crossca860ac2016-01-04 14:34:37 -08002506 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002507 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002508}
2509
Colin Cross0ea8ba82019-06-06 14:33:29 -07002510func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002511 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002512 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002513 }
Colin Crossca860ac2016-01-04 14:34:37 -08002514 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002515}
2516
Colin Crossca860ac2016-01-04 14:34:37 -08002517func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002518 for _, generator := range c.generators {
2519 generator.GeneratorInit(ctx)
2520 }
Colin Crossca860ac2016-01-04 14:34:37 -08002521 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002522 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002523 }
Colin Crossca860ac2016-01-04 14:34:37 -08002524 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002525 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002526 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002527 if c.stl != nil {
2528 c.stl.begin(ctx)
2529 }
Colin Cross16b23492016-01-06 14:41:07 -08002530 if c.sanitize != nil {
2531 c.sanitize.begin(ctx)
2532 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002533 if c.coverage != nil {
2534 c.coverage.begin(ctx)
2535 }
Yi Kong9723e332023-12-04 14:52:53 +09002536 if c.afdo != nil {
2537 c.afdo.begin(ctx)
2538 }
Stephen Craneba090d12017-05-09 15:44:35 -07002539 if c.lto != nil {
2540 c.lto.begin(ctx)
2541 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002542 if c.orderfile != nil {
2543 c.orderfile.begin(ctx)
2544 }
Dan Albert92fe7402020-07-15 13:33:30 -07002545 if ctx.useSdk() && c.IsSdkVariant() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002546 version, err := NativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002547 if err != nil {
2548 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002549 c.Properties.Sdk_version = nil
2550 } else {
2551 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002552 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002553 }
Colin Crossca860ac2016-01-04 14:34:37 -08002554}
2555
Colin Cross37047f12016-12-13 17:06:13 -08002556func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002557 deps := Deps{}
2558
Joe Onorato37f900c2023-07-18 16:58:16 -07002559 for _, generator := range c.generators {
2560 deps = generator.GeneratorDeps(ctx, deps)
2561 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002562 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002563 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002564 }
2565 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002566 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002567 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002568 if c.stl != nil {
2569 deps = c.stl.deps(ctx, deps)
2570 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002571 if c.coverage != nil {
2572 deps = c.coverage.deps(ctx, deps)
2573 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002574
Colin Crossb6715442017-10-24 11:13:31 -07002575 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2576 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2577 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2578 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2579 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2580 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002581 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002582 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002583
Colin Cross516c5452024-10-28 13:45:21 -07002584 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2585 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2586 }
2587
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002588 for _, lib := range deps.ReexportSharedLibHeaders {
2589 if !inList(lib, deps.SharedLibs) {
2590 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2591 }
2592 }
2593
2594 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002595 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2596 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 -07002597 }
2598 }
2599
Colin Cross5950f382016-12-13 12:50:57 -08002600 for _, lib := range deps.ReexportHeaderLibHeaders {
2601 if !inList(lib, deps.HeaderLibs) {
2602 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2603 }
2604 }
2605
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002606 for _, gen := range deps.ReexportGeneratedHeaders {
2607 if !inList(gen, deps.GeneratedHeaders) {
2608 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2609 }
2610 }
2611
Colin Crossc99deeb2016-04-11 15:06:20 -07002612 return deps
2613}
2614
Colin Cross516c5452024-10-28 13:45:21 -07002615func checkConflictingExplicitVersions(libs []string) error {
2616 withoutVersion := func(s string) string {
2617 name, _ := StubsLibNameAndVersion(s)
2618 return name
2619 }
2620 var errs []error
2621 for i, lib := range libs {
2622 libName := withoutVersion(lib)
2623 libsToCompare := libs[i+1:]
2624 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2625 return withoutVersion(s) == libName
2626 })
2627 if j >= 0 {
2628 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2629 lib, libsToCompare[j]))
2630 }
2631 }
2632 return errors.Join(errs...)
2633}
2634
Dan Albert7e9d2952016-08-04 13:02:36 -07002635func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002636 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002637 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002638 moduleContextImpl: moduleContextImpl{
2639 mod: c,
2640 },
2641 }
2642 ctx.ctx = ctx
2643
Colin Crossca860ac2016-01-04 14:34:37 -08002644 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002645}
2646
Jiyong Park7ed9de32018-10-15 22:25:07 +09002647// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002648func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002649 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2650 version := name[sharp+1:]
2651 libname := name[:sharp]
2652 return libname, version
2653 }
2654 return name, ""
2655}
2656
Dan Albert92fe7402020-07-15 13:33:30 -07002657func GetCrtVariations(ctx android.BottomUpMutatorContext,
2658 m LinkableInterface) []blueprint.Variation {
2659 if ctx.Os() != android.Android {
2660 return nil
2661 }
2662 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002663 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2664 minSdkVersion := m.MinSdkVersion()
2665 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2666 minSdkVersion = m.SdkVersion()
2667 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002668 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2669 if err != nil {
2670 ctx.PropertyErrorf("min_sdk_version", err.Error())
2671 }
Colin Cross363ec762023-01-13 13:45:14 -08002672
2673 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002674 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002675 if apiLevel.LessThan(minApiForArch) {
2676 apiLevel = minApiForArch
2677 }
2678
Dan Albert92fe7402020-07-15 13:33:30 -07002679 return []blueprint.Variation{
2680 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002681 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002682 }
2683 }
2684 return []blueprint.Variation{
2685 {Mutator: "sdk", Variation: ""},
2686 }
2687}
2688
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002689func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2690 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002691
2692 variations = append([]blueprint.Variation(nil), variations...)
2693
Liz Kammer23942242022-04-08 15:41:00 -04002694 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002695 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002696 if version == "impl" {
2697 version = ""
2698 }
Colin Crosse7257d22020-09-24 09:56:18 -07002699 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002700 if tag, ok := depTag.(libraryDependencyTag); ok {
2701 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002702 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2703 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2704 // the modified copy to depTag.
2705 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002706 } else {
2707 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2708 }
Colin Crosse7257d22020-09-24 09:56:18 -07002709 }
Colin Crosse7257d22020-09-24 09:56:18 -07002710
Colin Cross0de8a1e2020-09-18 14:15:30 -07002711 if far {
2712 ctx.AddFarVariationDependencies(variations, depTag, name)
2713 } else {
2714 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002715 }
2716}
2717
Kiyoung Kim487689e2022-07-26 09:48:22 +09002718func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2719 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002720 return snapshot
2721 }
2722
2723 return lib
2724}
2725
Kiyoung Kim37693d02024-04-04 09:56:15 +09002726// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002727// of names:
2728//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002729// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002730//
2731// For each of these, it adds the name of the ndk_library module to the list of
2732// variant libs.
2733//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002734// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002735//
2736// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002737//
2738// The caller can then know to add the variantLibs dependencies differently from the
2739// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002740func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002741 variantLibs = []string{}
2742
2743 nonvariantLibs = []string{}
2744 for _, entry := range list {
2745 // strip #version suffix out
2746 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002747 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002748 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002749 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002750 nonvariantLibs = append(nonvariantLibs, entry)
2751 }
2752 }
2753 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002754
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002755}
2756
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002757func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2758 nonVariantLibs := []string{}
2759 variantLibs := []string{}
2760
2761 for _, lib := range libs {
2762 replaceLibName := GetReplaceModuleName(lib, replaceList)
2763 if replaceLibName == lib {
2764 // Do not handle any libs which are not in API imports
2765 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2766 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2767 variantLibs = append(variantLibs, replaceLibName)
2768 } else {
2769 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2770 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002771 }
2772
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002773 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002774}
2775
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002776func (c *Module) shouldUseApiSurface() bool {
2777 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2778 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2779 // LLNDK Variant
2780 return true
2781 }
2782
2783 if c.Properties.IsSdkVariant {
2784 // NDK Variant
2785 return true
2786 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002787 }
2788
2789 return false
2790}
2791
Colin Cross1e676be2016-10-12 14:38:15 -07002792func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002793 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002794 return
2795 }
2796
Colin Cross37047f12016-12-13 17:06:13 -08002797 ctx := &depsContext{
2798 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002799 moduleContextImpl: moduleContextImpl{
2800 mod: c,
2801 },
2802 }
2803 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002804
Colin Crossc99deeb2016-04-11 15:06:20 -07002805 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002806
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002807 apiNdkLibs := []string{}
2808 apiLateNdkLibs := []string{}
2809
Yo Chiang219968c2020-09-22 18:45:04 +08002810 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2811
Dan Albert914449f2016-06-17 16:45:24 -07002812 variantNdkLibs := []string{}
2813 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002814 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002815 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2816 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2817 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002818 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002819
Colin Cross32ec36c2016-12-15 07:39:51 -08002820 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002821 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002822 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002823 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002824 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002825
Spandan Das73bcafc2022-08-18 23:26:00 +00002826 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002827 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2828 if variationExists {
2829 actx.AddVariationDependencies(nil, depTag, lib)
2830 } else {
2831 // dependencies to ndk_headers fall here as ndk_headers do not have
2832 // any variants.
2833 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2834 }
Spandan Dasff665182024-09-11 18:48:44 +00002835 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002836 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002837 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002838 } else {
2839 actx.AddVariationDependencies(nil, depTag, lib)
2840 }
2841 }
2842
Dan Albertf1d14c72020-07-30 14:32:55 -07002843 if c.isNDKStubLibrary() {
2844 // NDK stubs depend on their implementation because the ABI dumps are
2845 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002846
Spandan Das8b08aea2023-03-14 19:29:34 +00002847 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2848 c.ImageVariation(),
2849 blueprint.Variation{Mutator: "link", Variation: "shared"},
2850 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002851 }
2852
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002853 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2854 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2855 c.Target().NativeBridge == android.NativeBridgeDisabled {
2856 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002857 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002858 llndkHeaderLibTag,
2859 deps.LlndkHeaderLibs...)
2860 }
2861
Jiyong Park5d1598f2019-02-25 22:14:17 +09002862 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002863 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002864
Jiyong Park5d1598f2019-02-25 22:14:17 +09002865 actx.AddVariationDependencies([]blueprint.Variation{
2866 {Mutator: "link", Variation: "static"},
2867 }, depTag, lib)
2868 }
2869
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002870 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002871 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002872 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002873
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002874 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002875 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002876 }
Jiyong Parke3867542020-12-03 17:28:25 +09002877 if inList(lib, deps.ExcludeLibsForApex) {
2878 depTag.excludeInApex = true
2879 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002880 actx.AddVariationDependencies([]blueprint.Variation{
2881 {Mutator: "link", Variation: "static"},
2882 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002883 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002884
Jooyung Han75568392020-03-20 04:29:24 +09002885 // staticUnwinderDep is treated as staticDep for Q apexes
2886 // so that native libraries/binaries are linked with static unwinder
2887 // because Q libc doesn't have unwinder APIs
2888 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002889 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002890 actx.AddVariationDependencies([]blueprint.Variation{
2891 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002892 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002893 }
2894
Jiyong Park7ed9de32018-10-15 22:25:07 +09002895 // shared lib names without the #version suffix
2896 var sharedLibNames []string
2897
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002898 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002899 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002900 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002901 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002902 }
Jiyong Parke3867542020-12-03 17:28:25 +09002903 if inList(lib, deps.ExcludeLibsForApex) {
2904 depTag.excludeInApex = true
2905 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002906 if inList(lib, deps.ExcludeLibsForNonApex) {
2907 depTag.excludeInNonApex = true
2908 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002909
Jiyong Park73c54ee2019-10-22 20:31:18 +09002910 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002911 sharedLibNames = append(sharedLibNames, name)
2912
Colin Crosse7257d22020-09-24 09:56:18 -07002913 variations := []blueprint.Variation{
2914 {Mutator: "link", Variation: "shared"},
2915 }
Spandan Dasff665182024-09-11 18:48:44 +00002916 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002917 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002918
Colin Crossfe9acfe2021-06-14 16:13:03 -07002919 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002920 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002921 actx.AddVariationDependencies([]blueprint.Variation{
2922 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002923 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002924 }
2925
Colin Cross3e5e7782022-06-17 22:17:05 +00002926 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002927 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002928 actx.AddVariationDependencies([]blueprint.Variation{
2929 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002930 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002931 }
2932
Jiyong Park7ed9de32018-10-15 22:25:07 +09002933 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002934 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002935 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2936 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2937 // linking against both the stubs lib and the non-stubs lib at the same time.
2938 continue
2939 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002940 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002941 variations := []blueprint.Variation{
2942 {Mutator: "link", Variation: "shared"},
2943 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002944 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002945 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002946
Dan Willemsen59339a22018-07-22 21:18:45 -07002947 actx.AddVariationDependencies([]blueprint.Variation{
2948 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002949 }, dataLibDepTag, deps.DataLibs...)
2950
Colin Crossc8caa062021-09-24 16:50:14 -07002951 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2952
Chris Parsons79d66a52020-06-05 17:26:16 -04002953 actx.AddVariationDependencies([]blueprint.Variation{
2954 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002955 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002956
Colin Cross68861832016-07-08 10:41:41 -07002957 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002958
2959 for _, gen := range deps.GeneratedHeaders {
2960 depTag := genHeaderDepTag
2961 if inList(gen, deps.ReexportGeneratedHeaders) {
2962 depTag = genHeaderExportDepTag
2963 }
2964 actx.AddDependency(c, depTag, gen)
2965 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002966
Cole Faust65cb40a2024-10-21 15:41:42 -07002967 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2968 depTag := genHeaderDepTag
2969 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2970 }
2971
Dan Albert92fe7402020-07-15 13:33:30 -07002972 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002973 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002974 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002975 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002976 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002977 }
Colin Crossc465efd2021-06-11 18:00:04 -07002978 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002979 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002980 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002981 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002982 if deps.DynamicLinker != "" {
2983 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002984 }
Dan Albert914449f2016-06-17 16:45:24 -07002985
2986 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002987
Colin Cross8acea3e2024-12-12 14:53:30 -08002988 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002989 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002990 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002991 {Mutator: "link", Variation: "shared"},
2992 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002993 actx.AddVariationDependencies([]blueprint.Variation{
2994 {Mutator: "version", Variation: version},
2995 {Mutator: "link", Variation: "shared"},
2996 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002997
Colin Cross8acea3e2024-12-12 14:53:30 -08002998 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002999 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07003000 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07003001 {Mutator: "link", Variation: "shared"},
3002 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09003003 actx.AddVariationDependencies([]blueprint.Variation{
3004 {Mutator: "version", Variation: version},
3005 {Mutator: "link", Variation: "shared"},
3006 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08003007
Vinh Tran367d89d2023-04-28 11:21:25 -04003008 if len(deps.AidlLibs) > 0 {
3009 actx.AddDependency(
3010 c,
3011 aidlLibraryTag,
3012 deps.AidlLibs...,
3013 )
3014 }
3015
Colin Cross6362e272015-10-29 15:25:03 -07003016}
Colin Cross21b9a242015-03-24 14:15:58 -07003017
Colin Crosse40b4ea2018-10-02 22:25:58 -07003018func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07003019 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07003020 c.beginMutator(ctx)
3021 }
3022}
3023
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003024// Whether a module can link to another module, taking into
3025// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09003026func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07003027 tag blueprint.DependencyTag) {
3028
3029 switch t := tag.(type) {
3030 case dependencyTag:
3031 if t != vndkExtDepTag {
3032 return
3033 }
3034 case libraryDependencyTag:
3035 default:
3036 return
3037 }
3038
Ivan Lozanof9e21722020-12-02 09:00:51 -05003039 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003040 // Host code is not restricted
3041 return
3042 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003043
Ivan Lozano52767be2019-10-18 14:49:46 -07003044 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003045 // Platform code can link to anything
3046 return
3047 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08003048 if from.InRamdisk() {
3049 // Ramdisk code is not NDK
3050 return
3051 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003052 if from.InVendorRamdisk() {
3053 // Vendor ramdisk code is not NDK
3054 return
3055 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003056 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09003057 // Recovery code is not NDK
3058 return
3059 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003060 // Change this to LinkableInterface if Rust gets NDK support, which stubDecorators are for
Colin Cross31076b32020-10-23 17:22:06 -07003061 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003062 if c.StubDecorator() {
3063 // These aren't real libraries, but are the stub shared libraries that are included in
3064 // the NDK.
3065 return
3066 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003067 }
Logan Chien834b9a62019-01-14 15:39:03 +08003068
Ivan Lozano52767be2019-10-18 14:49:46 -07003069 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003070 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3071 // to link to libc++ (non-NDK and without sdk_version).
3072 return
3073 }
3074
Ivan Lozano52767be2019-10-18 14:49:46 -07003075 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003076 // NDK code linking to platform code is never okay.
3077 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003078 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003079 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003080 }
3081
3082 // At this point we know we have two NDK libraries, but we need to
3083 // check that we're not linking against anything built against a higher
3084 // API level, as it is only valid to link against older or equivalent
3085 // APIs.
3086
Inseob Kim01a28722018-04-11 09:48:45 +09003087 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003088 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003089 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003090 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003091 // Current can't be linked against by anything else.
3092 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003093 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003094 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003095 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003096 if err != nil {
3097 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003098 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003099 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003100 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003101 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003102 if err != nil {
3103 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003104 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003105 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003106 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003107
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003108 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003109 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003110 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003111 }
3112 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003113 }
Dan Albert202fe492017-12-15 13:56:59 -08003114
3115 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003116 fromStl := from.SelectedStl()
3117 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003118 if fromStl == "" || toStl == "" {
3119 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003120 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003121 // We can be permissive with the system "STL" since it is only the C++
3122 // ABI layer, but in the future we should make sure that everyone is
3123 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003124 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003125 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003126 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3127 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003128 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003129}
3130
Jooyung Han479ca172020-10-19 18:51:07 +09003131func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3132 if c, ok := ctx.Module().(*Module); ok {
3133 ctx.VisitDirectDeps(func(dep android.Module) {
3134 depTag := ctx.OtherModuleDependencyTag(dep)
3135 ccDep, ok := dep.(LinkableInterface)
3136 if ok {
3137 checkLinkType(ctx, c, ccDep, depTag)
3138 }
3139 })
3140 }
3141}
3142
Jiyong Park5fb8c102018-04-09 12:03:06 +09003143// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003144// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3145// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003146// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003147func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003148 check := func(child, parent android.Module) bool {
3149 to, ok := child.(*Module)
3150 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003151 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003152 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003153
Jooyung Hana70f0672019-01-18 15:20:43 +09003154 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3155 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003156 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003157
Jiyong Park0474e1f2021-01-14 14:26:06 +09003158 // These dependencies are not excercised at runtime. Tracking these will give us
3159 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003160 depTag := ctx.OtherModuleDependencyTag(child)
3161 if IsHeaderDepTag(depTag) {
3162 return false
3163 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003164 if depTag == staticVariantTag {
3165 return false
3166 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003167 if depTag == StubImplDepTag {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003168 return false
3169 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003170 if depTag == android.RequiredDepTag {
3171 return false
3172 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003173
Justin Yun63e9ec72020-10-29 16:49:43 +09003174 // Even if target lib has no vendor variant, keep checking dependency
3175 // graph in case it depends on vendor_available or product_available
3176 // but not double_loadable transtively.
3177 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003178 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003179 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003180
Jiyong Park0474e1f2021-01-14 14:26:06 +09003181 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3182 // one.
3183 if Bool(to.VendorProperties.Double_loadable) {
3184 return true
3185 }
3186
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003187 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003188 return false
3189 }
3190
Jooyung Hana70f0672019-01-18 15:20:43 +09003191 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3192 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003193 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003194 return false
3195 }
3196 if module, ok := ctx.Module().(*Module); ok {
3197 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003198 if lib.HasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003199 ctx.WalkDeps(check)
3200 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003201 }
3202 }
3203}
3204
Yu Liue4312402023-01-18 09:15:31 -08003205func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3206 // For the dependency from platform to apex, use the latest stubs
3207 apexSdkVersion := android.FutureApiLevel
3208 if !apexInfo.IsForPlatform() {
3209 apexSdkVersion = apexInfo.MinSdkVersion
3210 }
3211
3212 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3213 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3214 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3215 // (b/144430859)
3216 apexSdkVersion = android.FutureApiLevel
3217 }
3218
3219 return apexSdkVersion
3220}
3221
Colin Crossc99deeb2016-04-11 15:06:20 -07003222// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003223func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003224 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003225
Colin Cross0de8a1e2020-09-18 14:15:30 -07003226 var directStaticDeps []StaticLibraryInfo
3227 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003228
Colin Cross0de8a1e2020-09-18 14:15:30 -07003229 reexportExporter := func(exporter FlagExporterInfo) {
3230 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3231 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3232 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3233 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3234 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003235 }
3236
Colin Crossff694a82023-12-13 15:54:49 -08003237 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003238 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003239
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003240 skipModuleList := map[string]bool{}
3241
Yu Liu8024b922024-12-20 23:31:32 +00003242 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003243 depName := ctx.OtherModuleName(dep)
3244 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003245
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003246 if _, ok := skipModuleList[depName]; ok {
3247 // skip this module because original module or API imported module matching with this should be used instead.
3248 return
3249 }
3250
Yu Liu8024b922024-12-20 23:31:32 +00003251 var ccInfo *CcInfo
3252 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3253 if hasCcInfo {
3254 ccInfo = v
3255 }
3256 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003257 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003258 if !hasCcInfo {
3259 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3260 }
3261 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003262 return
3263 }
3264
Vinh Tran367d89d2023-04-28 11:21:25 -04003265 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003266 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003267 depPaths.AidlLibraryInfos = append(
3268 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003269 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003270 )
3271 }
3272 }
3273
Yu Liu8024b922024-12-20 23:31:32 +00003274 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003275 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003276 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003277 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003278 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003279 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003280 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003281 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003282 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003283 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003284 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003285 // Support exported headers from a generated_sources dependency
3286 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003287 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003288 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003289 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003290 genRule.GeneratedDeps...)
3291 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003292 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003293 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003294 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003295 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003296 genRule.GeneratedSourceFiles...)
3297 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003298 // 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 +09003299 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003300 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003301 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003302 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003303 }
Colin Crosscef792e2021-06-11 18:01:26 -07003304 case CrtBeginDepTag:
3305 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3306 case CrtEndDepTag:
3307 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003308 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003309 return
3310 }
3311
Colin Crossfe17f6f2019-03-28 19:30:56 -07003312 if depTag == android.ProtoPluginDepTag {
3313 return
3314 }
3315
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003316 if depTag == android.RequiredDepTag {
3317 return
3318 }
3319
Yu Liu8024b922024-12-20 23:31:32 +00003320 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3321 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003322 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 -07003323 return
3324 }
Yu Liu8024b922024-12-20 23:31:32 +00003325 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003326 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003327 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003328 return
3329 }
3330
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003331 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003332 // Skip reused objects for stub libraries, they use their own stub object file instead.
3333 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3334 // version mutator, so the stubs variant is created from the shared variant that
3335 // already has the reuseObjTag dependency on the static variant.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003336 if !c.library.BuildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003337 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003338 objs := staticAnalogue.ReuseObjects
3339 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003340 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003341 reexportExporter(depExporterInfo)
3342 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003343 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003344 }
3345
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003346 if depTag == llndkHeaderLibTag {
3347 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3348 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3349 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3350 }
3351
Yu Liu8024b922024-12-20 23:31:32 +00003352 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003353
3354 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3355 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003356 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003357 return
3358 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003359
Jiyong Parke3867542020-12-03 17:28:25 +09003360 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3361 return
3362 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003363 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3364 return
3365 }
Jiyong Parke3867542020-12-03 17:28:25 +09003366
Colin Cross313aa542023-12-13 13:47:44 -08003367 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003368
Colin Cross6e511a92020-07-27 21:26:48 -07003369 var ptr *android.Paths
3370 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003371
Colin Cross6e511a92020-07-27 21:26:48 -07003372 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003373
Colin Cross6e511a92020-07-27 21:26:48 -07003374 switch {
3375 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003376 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003377 if !ctx.Config().AllowMissingDependencies() {
3378 ctx.ModuleErrorf("module %q is not a header library", depName)
3379 } else {
3380 ctx.AddMissingDependencies([]string{depName})
3381 }
3382 return
3383 }
Colin Cross6e511a92020-07-27 21:26:48 -07003384 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003385 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003386 if !ctx.Config().AllowMissingDependencies() {
3387 ctx.ModuleErrorf("module %q is not a shared library", depName)
3388 } else {
3389 ctx.AddMissingDependencies([]string{depName})
3390 }
3391 return
3392 }
Jiyong Parke3867542020-12-03 17:28:25 +09003393
Jiyong Park7d55b612021-06-11 17:22:09 +09003394 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3395 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003396
Jiyong Park1ad8e162020-12-01 23:40:09 +09003397 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3398 // linkFile, depFile, and ptr.
3399 if c.IsStubs() {
3400 break
3401 }
3402
Colin Cross0de8a1e2020-09-18 14:15:30 -07003403 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3404 depFile = sharedLibraryInfo.TableOfContents
3405
Colin Crossb614cd42024-10-11 12:52:21 -07003406 if !sharedLibraryInfo.IsStubs {
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003407 // TODO(b/362509506): remove this additional check once all apex_exclude uses are switched to stubs.
3408 if !linkableInfo.RustApexExclude {
3409 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3410 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3411 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3412 }
Colin Crossb614cd42024-10-11 12:52:21 -07003413 }
3414 }
3415
Colin Cross6e511a92020-07-27 21:26:48 -07003416 ptr = &depPaths.SharedLibs
3417 switch libDepTag.Order {
3418 case earlyLibraryDependency:
3419 ptr = &depPaths.EarlySharedLibs
3420 depPtr = &depPaths.EarlySharedLibsDeps
3421 case normalLibraryDependency:
3422 ptr = &depPaths.SharedLibs
3423 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003424 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003425 case lateLibraryDependency:
3426 ptr = &depPaths.LateSharedLibs
3427 depPtr = &depPaths.LateSharedLibsDeps
3428 default:
3429 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003430 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003431
Colin Cross6e511a92020-07-27 21:26:48 -07003432 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003433 if linkableInfo.RustLibraryInterface {
3434 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003435 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3436 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3437 if libDepTag.wholeStatic {
3438 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3439 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003440
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003441 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3442 // exported functions from the rust generated staticlib still exported.
3443 if c.CcLibrary() && c.Shared() {
3444 c.WholeRustStaticlib = true
3445 }
Colin Cross6e511a92020-07-27 21:26:48 -07003446 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003447
Colin Cross6e511a92020-07-27 21:26:48 -07003448 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003449 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3450 if !isStaticLib {
3451 if !ctx.Config().AllowMissingDependencies() {
3452 ctx.ModuleErrorf("module %q is not a static library", depName)
3453 } else {
3454 ctx.AddMissingDependencies([]string{depName})
3455 }
3456 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003457 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003458
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003459 // Stubs lib doesn't link to the static lib dependencies. Don't set
3460 // linkFile, depFile, and ptr.
3461 if c.IsStubs() {
3462 break
3463 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003464
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003465 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3466 if libDepTag.wholeStatic {
3467 ptr = &depPaths.WholeStaticLibs
3468 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3469 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3470 } else {
3471 // This case normally catches prebuilt static
3472 // libraries, but it can also occur when
3473 // AllowMissingDependencies is on and the
3474 // dependencies has no sources of its own
3475 // but has a whole_static_libs dependency
3476 // on a missing library. We want to depend
3477 // on the .a file so that there is something
3478 // in the dependency tree that contains the
3479 // error rule for the missing transitive
3480 // dependency.
3481 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3482 }
3483 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3484 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3485 } else {
3486 switch libDepTag.Order {
3487 case earlyLibraryDependency:
3488 panic(fmt.Errorf("early static libs not supported"))
3489 case normalLibraryDependency:
3490 // static dependencies will be handled separately so they can be ordered
3491 // using transitive dependencies.
3492 ptr = nil
3493 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3494 case lateLibraryDependency:
3495 ptr = &depPaths.LateStaticLibs
3496 default:
3497 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3498 }
3499 }
3500
3501 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3502 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3503
3504 if libDepTag.unexportedSymbols {
3505 depPaths.LdFlags = append(depPaths.LdFlags,
3506 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3507 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003508 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003509 }
3510
Yu Liu8024b922024-12-20 23:31:32 +00003511 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3512 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003513 ctx.ModuleErrorf("module %q not a static library", depName)
3514 return
3515 }
Logan Chien43d34c32017-12-20 01:17:32 +08003516
Colin Cross6e511a92020-07-27 21:26:48 -07003517 // When combining coverage files for shared libraries and executables, coverage files
3518 // in static libraries act as if they were whole static libraries. The same goes for
3519 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003520 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003521 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003522 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003523 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003524 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003525 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003526 // Handle non-CC modules here
3527 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003528 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003529 }
3530 }
3531
Colin Cross6e511a92020-07-27 21:26:48 -07003532 if ptr != nil {
3533 if !linkFile.Valid() {
3534 if !ctx.Config().AllowMissingDependencies() {
3535 ctx.ModuleErrorf("module %q missing output file", depName)
3536 } else {
3537 ctx.AddMissingDependencies([]string{depName})
3538 }
3539 return
3540 }
3541 *ptr = append(*ptr, linkFile.Path())
3542 }
3543
3544 if depPtr != nil {
3545 dep := depFile
3546 if !dep.Valid() {
3547 dep = linkFile
3548 }
3549 *depPtr = append(*depPtr, dep.Path())
3550 }
3551
Colin Cross0de8a1e2020-09-18 14:15:30 -07003552 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3553 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3554 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3555 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003556 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3557
3558 // Only re-export RustRlibDeps for cc static libs
3559 if c.static() {
3560 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3561 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003562
3563 if libDepTag.reexportFlags {
3564 reexportExporter(depExporterInfo)
3565 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3566 // Re-exported shared library headers must be included as well since they can help us with type information
3567 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003568 c.sabi.Properties.ReexportedIncludes = append(
3569 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003570 c.sabi.Properties.ReexportedSystemIncludes = append(
3571 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003572 }
3573
Yu Liu8024b922024-12-20 23:31:32 +00003574 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003575 switch {
3576 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003577 c.Properties.AndroidMkHeaderLibs = append(
3578 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003579 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003580 // Note: the order of libs in this list is not important because
3581 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003582 c.Properties.AndroidMkSharedLibs = append(
3583 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003584 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003585 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003586 if libDepTag.wholeStatic {
3587 c.Properties.AndroidMkWholeStaticLibs = append(
3588 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3589 } else {
3590 c.Properties.AndroidMkStaticLibs = append(
3591 c.Properties.AndroidMkStaticLibs, makeLibName)
3592 }
Colin Cross6e511a92020-07-27 21:26:48 -07003593 }
3594 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003595 } else if !c.IsStubs() {
3596 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3597
Colin Cross6e511a92020-07-27 21:26:48 -07003598 switch depTag {
3599 case runtimeDepTag:
3600 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu8024b922024-12-20 23:31:32 +00003601 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003602 case objDepTag:
3603 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3604 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003605 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003606 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003607 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003608 case dynamicLinkerDepTag:
3609 depPaths.DynamicLinker = linkFile
3610 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003611 }
Colin Crossca860ac2016-01-04 14:34:37 -08003612 })
3613
Jeff Gaston294356f2017-09-27 17:05:30 -07003614 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003615 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3616 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3617 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003618
Colin Crossdd84e052017-05-17 13:44:16 -07003619 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003620 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003621 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3622 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003623 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003624 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3625
Jiyong Park74955042019-10-22 20:19:51 +09003626 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3627 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003628 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003629 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003630 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003631 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003632
3633 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003634 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003635 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003636 }
Colin Crossdd84e052017-05-17 13:44:16 -07003637
Colin Crossca860ac2016-01-04 14:34:37 -08003638 return depPaths
3639}
3640
Yu Liuf6f85492025-01-13 21:02:36 +00003641func ShouldUseStubForApex(ctx android.ModuleContext, parent android.Module, dep android.ModuleProxy) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003642 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003643 bootstrap := false
Yu Liuf6f85492025-01-13 21:02:36 +00003644 if ctx.EqualModules(ctx.Module(), parent) {
3645 if linkable, ok := parent.(LinkableInterface); !ok {
3646 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3647 } else {
3648 inVendorOrProduct = linkable.InVendorOrProduct()
3649 bootstrap = linkable.Bootstrap()
3650 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003651 } else {
Yu Liuf6f85492025-01-13 21:02:36 +00003652 if linkable, ok := android.OtherModuleProvider(ctx, parent, LinkableInfoProvider); !ok {
3653 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3654 } else {
3655 inVendorOrProduct = linkable.InVendorOrProduct
3656 bootstrap = linkable.Bootstrap
3657 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003658 }
3659
Spandan Das10c41362024-12-03 01:33:09 +00003660 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003661
3662 useStubs := false
3663
Yu Liu8024b922024-12-20 23:31:32 +00003664 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003665 if !apexInfo.IsForPlatform() {
3666 // For platform libraries, use current version of LLNDK
3667 // If this is for use_vendor apex we will apply the same rules
3668 // of apex sdk enforcement below to choose right version.
3669 useStubs = true
3670 }
3671 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3672 // If not building for APEX or the containing APEX allows the use of
3673 // platform APIs, use stubs only when it is from an APEX (and not from
3674 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3675 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003676 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003677
Spandan Dasff665182024-09-11 18:48:44 +00003678 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003679 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003680 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3681 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003682 }
3683
3684 return useStubs
3685}
3686
3687// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3688// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3689// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3690// has different level of updatability. For example, if a library foo in an APEX depends on a
3691// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3692// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3693// same APEX as foo, the non-stub variant of bar is used.
Yu Liuf6f85492025-01-13 21:02:36 +00003694func ChooseStubOrImpl(ctx android.ModuleContext, dep android.ModuleProxy) (SharedLibraryInfo, FlagExporterInfo) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003695 depTag := ctx.OtherModuleDependencyTag(dep)
3696 libDepTag, ok := depTag.(libraryDependencyTag)
3697 if !ok || !libDepTag.shared() {
3698 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3699 }
3700
Colin Cross313aa542023-12-13 13:47:44 -08003701 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3702 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3703 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003704
3705 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003706 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003707 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003708 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3709 toUse := stubs[len(stubs)-1]
3710 sharedLibraryInfo = toUse.SharedLibraryInfo
3711 depExporterInfo = toUse.FlagExporterInfo
3712 }
3713 }
3714 return sharedLibraryInfo, depExporterInfo
3715}
3716
Colin Cross0de8a1e2020-09-18 14:15:30 -07003717// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3718// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003719// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003720// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003721func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3722 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003723 var staticPaths android.Paths
3724 for _, staticDep := range staticDeps {
3725 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3726 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3727 }
3728 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003729 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003730 }
3731 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3732
3733 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3734
3735 // reorder the dependencies based on transitive dependencies
3736 staticPaths = android.FirstUniquePaths(staticPaths)
3737 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3738
3739 if len(orderedStaticPaths) != len(staticPaths) {
3740 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3741 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3742 }
3743
3744 return orderedStaticPaths, transitiveStaticLibs
3745}
3746
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003747// BaseLibName trims known prefixes and suffixes
3748func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003749 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3750 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003751 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003752 return libName
3753}
3754
Yu Liu8024b922024-12-20 23:31:32 +00003755func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003756 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003757 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3758 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003759
Yu Liu8024b922024-12-20 23:31:32 +00003760 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003761 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003762 if ccInfo.SnapshotInfo != nil {
3763 return linkableInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003764 }
3765 }
3766
Yu Liu8024b922024-12-20 23:31:32 +00003767 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003768 // The vendor and product modules in Make will have been renamed to not conflict with the
3769 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003770 return libName + linkableInfo.SubName
3771 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003772 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003773 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003774 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003775 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003776 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003777 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003778 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003779 } else {
3780 return libName
3781 }
3782}
3783
Colin Crossca860ac2016-01-04 14:34:37 -08003784func (c *Module) InstallInData() bool {
3785 if c.installer == nil {
3786 return false
3787 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003788 return c.installer.inData()
3789}
3790
3791func (c *Module) InstallInSanitizerDir() bool {
3792 if c.installer == nil {
3793 return false
3794 }
3795 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003796 return true
3797 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003798 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003799}
3800
Yifan Hong1b3348d2020-01-21 15:53:22 -08003801func (c *Module) InstallInRamdisk() bool {
3802 return c.InRamdisk()
3803}
3804
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003805func (c *Module) InstallInVendorRamdisk() bool {
3806 return c.InVendorRamdisk()
3807}
3808
Jiyong Parkf9332f12018-02-01 00:54:12 +09003809func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003810 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003811}
3812
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003813func (c *Module) MakeUninstallable() {
3814 if c.installer == nil {
3815 c.ModuleBase.MakeUninstallable()
3816 return
3817 }
3818 c.installer.makeUninstallable(c)
3819}
3820
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003821func (c *Module) HostToolPath() android.OptionalPath {
3822 if c.installer == nil {
3823 return android.OptionalPath{}
3824 }
3825 return c.installer.hostToolPath()
3826}
3827
Nan Zhangd4e641b2017-07-12 12:55:28 -07003828func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3829 return c.outputFile
3830}
3831
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003832func (c *Module) static() bool {
3833 if static, ok := c.linker.(interface {
3834 static() bool
3835 }); ok {
3836 return static.static()
3837 }
3838 return false
3839}
3840
Colin Cross6a730042024-12-05 13:53:43 -08003841func (c *Module) staticLibrary() bool {
3842 if static, ok := c.linker.(interface {
3843 staticLibrary() bool
3844 }); ok {
3845 return static.staticLibrary()
3846 }
3847 return false
3848}
3849
Jiyong Park379de2f2018-12-19 02:47:14 +09003850func (c *Module) staticBinary() bool {
3851 if static, ok := c.linker.(interface {
3852 staticBinary() bool
3853 }); ok {
3854 return static.staticBinary()
3855 }
3856 return false
3857}
3858
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003859func (c *Module) testBinary() bool {
3860 if test, ok := c.linker.(interface {
3861 testBinary() bool
3862 }); ok {
3863 return test.testBinary()
3864 }
3865 return false
3866}
3867
Jingwen Chen537242c2022-08-24 11:53:27 +00003868func (c *Module) testLibrary() bool {
3869 if test, ok := c.linker.(interface {
3870 testLibrary() bool
3871 }); ok {
3872 return test.testLibrary()
3873 }
3874 return false
3875}
3876
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003877func (c *Module) benchmarkBinary() bool {
3878 if b, ok := c.linker.(interface {
3879 benchmarkBinary() bool
3880 }); ok {
3881 return b.benchmarkBinary()
3882 }
3883 return false
3884}
3885
3886func (c *Module) fuzzBinary() bool {
3887 if f, ok := c.linker.(interface {
3888 fuzzBinary() bool
3889 }); ok {
3890 return f.fuzzBinary()
3891 }
3892 return false
3893}
3894
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003895// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3896func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003897 if h, ok := c.linker.(interface {
3898 header() bool
3899 }); ok {
3900 return h.header()
3901 }
3902 return false
3903}
3904
Ivan Lozanod7586b62021-04-01 09:49:36 -04003905func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003906 if b, ok := c.linker.(interface {
3907 binary() bool
3908 }); ok {
3909 return b.binary()
3910 }
3911 return false
3912}
3913
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003914func (c *Module) ForceDisableSanitizers() {
3915 c.sanitize.Properties.ForceDisable = true
3916}
3917
Justin Yun5e035862021-06-29 20:50:37 +09003918func (c *Module) StaticExecutable() bool {
3919 if b, ok := c.linker.(*binaryDecorator); ok {
3920 return b.static()
3921 }
3922 return false
3923}
3924
Ivan Lozanod7586b62021-04-01 09:49:36 -04003925func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003926 if o, ok := c.linker.(interface {
3927 object() bool
3928 }); ok {
3929 return o.object()
3930 }
3931 return false
3932}
3933
Kiyoung Kim37693d02024-04-04 09:56:15 +09003934func (m *Module) Dylib() bool {
3935 return false
3936}
3937
3938func (m *Module) Rlib() bool {
3939 return false
3940}
3941
Ivan Lozanof9e21722020-12-02 09:00:51 -05003942func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003943 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003944 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003945 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003946 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003947 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003948 return "native:product"
3949 }
Jooyung Han38002912019-05-16 04:01:54 +09003950 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003951 } else if c.InRamdisk() {
3952 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003953 } else if c.InVendorRamdisk() {
3954 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003955 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003956 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003957 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003958 return "native:ndk:none:none"
3959 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3960 //family, link := getNdkStlFamilyAndLinkType(c)
3961 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3962 } else {
3963 return "native:platform"
3964 }
3965}
3966
Jiyong Park9d452992018-10-03 00:38:19 +09003967// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003968// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003969func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003970 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003971 // Stub libs and prebuilt libs in a versioned SDK are not
3972 // installable to APEX even though they are shared libs.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003973 return lib.shared() && !lib.BuildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003974 }
3975 return false
3976}
3977
Jiyong Parka90ca002019-10-07 15:47:24 +09003978func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003979 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3980}
3981
3982func (c *Module) ApexAvailableFor() []string {
3983 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003984 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003985 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003986 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003987 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003988 }
Yu Liub73c3a62024-12-10 00:58:06 +00003989
3990 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003991}
3992
Paul Duffin0cb37b92020-03-04 14:52:46 +00003993func (c *Module) EverInstallable() bool {
3994 return c.installer != nil &&
3995 // Check to see whether the module is actually ever installable.
3996 c.installer.everInstallable()
3997}
3998
Ivan Lozanod7586b62021-04-01 09:49:36 -04003999func (c *Module) PreventInstall() bool {
4000 return c.Properties.PreventInstall
4001}
4002
4003func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07004004 if c.library != nil {
4005 if i := c.library.installable(); i != nil {
4006 return i
4007 }
4008 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04004009 return c.Properties.Installable
4010}
4011
4012func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00004013 ret := c.EverInstallable() &&
4014 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04004015 proptools.BoolDefault(c.Installable(), true) &&
4016 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004017
4018 // The platform variant doesn't need further condition. Apex variants however might not
4019 // be installable because it will likely to be included in the APEX and won't appear
4020 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07004021 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09004022 return ret
4023 }
4024
4025 // Special case for modules that are configured to be installed to /data, which includes
4026 // test modules. For these modules, both APEX and non-APEX variants are considered as
4027 // installable. This is because even the APEX variants won't be included in the APEX, but
4028 // will anyway be installed to /data/*.
4029 // See b/146995717
4030 if c.InstallInData() {
4031 return ret
4032 }
4033
4034 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09004035}
4036
Logan Chien41eabe62019-04-10 13:33:58 +08004037func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
4038 if c.linker != nil {
4039 if library, ok := c.linker.(*libraryDecorator); ok {
4040 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
4041 }
4042 }
4043}
4044
Jiyong Park45bf82e2020-12-15 22:29:02 +09004045var _ android.ApexModule = (*Module)(nil)
4046
4047// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004048func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004049 if depTag == StubImplDepTag {
Colin Crossc1b36442021-05-06 13:42:48 -07004050 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004051 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004052 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004053 if depTag == staticVariantTag {
4054 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4055 // actually mean that the static lib (and its dependencies) are copied into the
4056 // APEX.
4057 return false
4058 }
Colin Cross8acea3e2024-12-12 14:53:30 -08004059
4060 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
4061 if isLibDepTag && c.static() && libDepTag.shared() {
4062 // shared_lib dependency from a static lib is considered as crossing
4063 // the APEX boundary because the dependency doesn't actually is
4064 // linked; the dependency is used only during the compilation phase.
4065 return false
4066 }
4067
4068 if isLibDepTag && libDepTag.excludeInApex {
4069 return false
4070 }
4071
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004072 return true
4073}
4074
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004075func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004076 if c.HasStubsVariants() {
4077 if IsSharedDepTag(depTag) {
4078 // dynamic dep to a stubs lib crosses APEX boundary
4079 return false
4080 }
4081 if IsRuntimeDepTag(depTag) {
4082 // runtime dep to a stubs lib also crosses APEX boundary
4083 return false
4084 }
4085 if IsHeaderDepTag(depTag) {
4086 return false
4087 }
4088 }
4089 if c.IsLlndk() {
4090 return false
4091 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004092
4093 return true
4094}
4095
Jiyong Park45bf82e2020-12-15 22:29:02 +09004096// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07004097func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
4098 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09004099 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4100 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
4101 return nil
4102 }
Jooyung Han749dc692020-04-15 11:03:39 +09004103 // We don't check for prebuilt modules
4104 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4105 return nil
4106 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004107
Jooyung Han749dc692020-04-15 11:03:39 +09004108 minSdkVersion := c.MinSdkVersion()
4109 if minSdkVersion == "apex_inherit" {
4110 return nil
4111 }
4112 if minSdkVersion == "" {
4113 // JNI libs within APK-in-APEX fall into here
4114 // Those are okay to set sdk_version instead
4115 // We don't have to check if this is a SDK variant because
4116 // non-SDK variant resets sdk_version, which works too.
4117 minSdkVersion = c.SdkVersion()
4118 }
Dan Albertc8060532020-07-22 22:32:17 -07004119 if minSdkVersion == "" {
4120 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4121 }
4122 // Not using nativeApiLevelFromUser because the context here is not
4123 // necessarily a native context.
4124 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004125 if err != nil {
4126 return err
4127 }
Dan Albertc8060532020-07-22 22:32:17 -07004128
Colin Cross8ca61c12022-10-06 21:00:14 -07004129 // A dependency only needs to support a min_sdk_version at least
4130 // as high as the api level that the architecture was introduced in.
4131 // This allows introducing new architectures in the platform that
4132 // need to be included in apexes that normally require an older
4133 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004134 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004135 if sdkVersion.LessThan(minApiForArch) {
4136 sdkVersion = minApiForArch
4137 }
4138
Dan Albertc8060532020-07-22 22:32:17 -07004139 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004140 return fmt.Errorf("newer SDK(%v)", ver)
4141 }
4142 return nil
4143}
4144
Paul Duffinb5769c12021-05-12 16:16:51 +01004145// Implements android.ApexModule
4146func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4147 // stub libraries and native bridge libraries are always available to platform
4148 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4149}
4150
Inseob Kima1888ce2022-10-04 14:42:02 +09004151func (c *Module) overriddenModules() []string {
4152 if o, ok := c.linker.(overridable); ok {
4153 return o.overriddenModules()
4154 }
4155 return nil
4156}
4157
Liz Kammer35ca77e2021-12-22 15:31:40 -05004158type moduleType int
4159
4160const (
4161 unknownType moduleType = iota
4162 binary
4163 object
4164 fullLibrary
4165 staticLibrary
4166 sharedLibrary
4167 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004168 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004169 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004170)
4171
4172func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004173 if c.testBinary() {
4174 // testBinary is also a binary, so this comes before the c.Binary()
4175 // conditional. A testBinary has additional implicit dependencies and
4176 // other test-only semantics.
4177 return testBin
4178 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004179 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004180 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004181 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004182 } else if c.testLibrary() {
4183 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4184 // will let them add implicit compile deps on gtest, for example.
4185 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004186 // For now, treat them as regular libraries.
4187 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004188 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004189 static := false
4190 shared := false
4191 if library, ok := c.linker.(*libraryDecorator); ok {
4192 static = library.MutatedProperties.BuildStatic
4193 shared = library.MutatedProperties.BuildShared
4194 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4195 static = library.MutatedProperties.BuildStatic
4196 shared = library.MutatedProperties.BuildShared
4197 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004198 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004199 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004200 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004201 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004202 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004203 return staticLibrary
4204 }
4205 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004206 } else if c.isNDKStubLibrary() {
4207 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004208 }
4209 return unknownType
4210}
4211
Colin Crosscfad1192015-11-02 16:43:11 -08004212// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004213type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004214 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004215 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004216 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004217}
4218
Patrice Arrudac249c712019-03-19 17:00:29 -07004219// cc_defaults provides a set of properties that can be inherited by other cc
4220// modules. A module can use the properties from a cc_defaults using
4221// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4222// merged (when possible) by prepending the default module's values to the
4223// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004224func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004225 return DefaultsFactory()
4226}
4227
Colin Cross36242852017-06-23 15:06:31 -07004228func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004229 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004230
Colin Cross36242852017-06-23 15:06:31 -07004231 module.AddProperties(props...)
4232 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004233 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004234 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004235 &BaseCompilerProperties{},
4236 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004237 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004238 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004239 &StaticProperties{},
4240 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004241 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004242 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004243 &TestLinkerProperties{},
4244 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004245 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004246 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004247 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004248 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004249 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004250 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004251 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004252 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004253 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004254 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004255 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004256 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004257 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004258 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004259 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4260 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004261 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004262 )
Colin Crosscfad1192015-11-02 16:43:11 -08004263
Jooyung Hancc372c52019-09-25 15:18:44 +09004264 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004265
4266 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004267}
4268
Jiyong Park2286afd2020-06-16 21:58:53 +09004269func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004270 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004271}
4272
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004273func kytheExtractAllFactory() android.Singleton {
4274 return &kytheExtractAllSingleton{}
4275}
4276
4277type kytheExtractAllSingleton struct {
4278}
4279
4280func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4281 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004282 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004283 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004284 if len(files) > 0 {
4285 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004286 }
4287 })
4288 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4289 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004290 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004291 }
4292}
4293
Jihoon Kangf78a8902022-09-01 22:47:07 +00004294func (c *Module) Partition() string {
4295 if p, ok := c.installer.(interface {
4296 getPartition() string
4297 }); ok {
4298 return p.getPartition()
4299 }
4300 return ""
4301}
4302
Spandan Das2b6dfb52024-01-19 00:22:22 +00004303type sourceModuleName interface {
4304 sourceModuleName() string
4305}
4306
4307func (c *Module) BaseModuleName() string {
4308 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4309 // if the prebuilt module sets a source_module_name in Android.bp, use that
4310 return smn.sourceModuleName()
4311 }
4312 return c.ModuleBase.BaseModuleName()
4313}
4314
Spandan Dase20c56c2024-07-23 21:34:24 +00004315func (c *Module) stubsSymbolFilePath() android.Path {
4316 if library, ok := c.linker.(*libraryDecorator); ok {
4317 return library.stubsSymbolFilePath
4318 }
4319 return android.OptionalPath{}.Path()
4320}
4321
Colin Cross06a931b2015-10-28 17:23:31 -07004322var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004323var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004324var BoolPtr = proptools.BoolPtr
4325var String = proptools.String
4326var StringPtr = proptools.StringPtr