blob: b525ccb81578ba7119659ffe7b329b3e7675209d [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()
2412 complianceMetadataInfo.SetStringValue(android.ComplianceMetadataProp.IS_STATIC_LIB, strconv.FormatBool(ctx.static()))
2413 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 }
2421
2422 staticDepPaths := make([]string, 0, len(deps.StaticLibs))
2423 for _, dep := range deps.StaticLibs {
2424 staticDepPaths = append(staticDepPaths, dep.String())
2425 }
2426 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames))
2427 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepPaths))
2428
2429 // Whole static deps
Yu Liuf432c2e2024-12-17 00:09:15 +00002430 wholeStaticDeps := ctx.GetDirectDepsProxyWithTag(StaticDepTag(true))
Wei Lia1aa2972024-06-21 13:08:51 -07002431 wholeStaticDepNames := make([]string, 0, len(wholeStaticDeps))
2432 for _, dep := range wholeStaticDeps {
2433 wholeStaticDepNames = append(wholeStaticDepNames, dep.Name())
2434 }
2435
2436 wholeStaticDepPaths := make([]string, 0, len(deps.WholeStaticLibs))
2437 for _, dep := range deps.WholeStaticLibs {
2438 wholeStaticDepPaths = append(wholeStaticDepPaths, dep.String())
2439 }
2440 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEPS, android.FirstUniqueStrings(wholeStaticDepNames))
2441 complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.WHOLE_STATIC_DEP_FILES, android.FirstUniqueStrings(wholeStaticDepPaths))
Chris Parsons94a0bba2021-06-04 15:03:47 -04002442}
2443
2444func (c *Module) maybeUnhideFromMake() {
2445 // If a lib is directly included in any of the APEXes or is not available to the
2446 // platform (which is often the case when the stub is provided as a prebuilt),
2447 // unhide the stubs variant having the latest version gets visible to make. In
2448 // addition, the non-stubs variant is renamed to <libname>.bootstrap. This is to
2449 // force anything in the make world to link against the stubs library. (unless it
2450 // is explicitly referenced via .bootstrap suffix or the module is marked with
2451 // 'bootstrap: true').
2452 if c.HasStubsVariants() && c.NotInPlatform() && !c.InRamdisk() &&
Kiyoung Kimaa394802024-01-08 12:55:45 +09002453 !c.InRecovery() && !c.InVendorOrProduct() && !c.static() && !c.isCoverageVariant() &&
Chris Parsons94a0bba2021-06-04 15:03:47 -04002454 c.IsStubs() && !c.InVendorRamdisk() {
2455 c.Properties.HideFromMake = false // unhide
2456 // Note: this is still non-installable
2457 }
2458}
2459
Colin Cross8ff10582023-12-07 13:10:56 -08002460// maybeInstall is called at the end of both GenerateAndroidBuildActions to run the
2461// install hooks for installable modules, like binaries and tests.
Chris Parsons94a0bba2021-06-04 15:03:47 -04002462func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
Colin Cross1bc94122021-10-28 13:25:54 -07002463 if !proptools.BoolDefault(c.Installable(), true) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002464 // If the module has been specifically configure to not be installed then
2465 // hide from make as otherwise it will break when running inside make
2466 // as the output path to install will not be specified. Not all uninstallable
2467 // modules can be hidden from make as some are needed for resolving make side
2468 // dependencies.
2469 c.HideFromMake()
Spandan Das034af2c2024-10-30 21:45:09 +00002470 c.SkipInstall()
Ivan Lozanod7586b62021-04-01 09:49:36 -04002471 } else if !installable(c, apexInfo) {
Colin Crossa9c8c9f2020-12-16 10:20:23 -08002472 c.SkipInstall()
2473 }
2474
2475 // Still call c.installer.install though, the installs will be stored as PackageSpecs
2476 // to allow using the outputs in a genrule.
2477 if c.installer != nil && c.outputFile.Valid() {
Colin Crossce75d2c2016-10-06 16:12:58 -07002478 c.installer.install(ctx, c.outputFile.Path())
2479 if ctx.Failed() {
2480 return
Colin Crossca860ac2016-01-04 14:34:37 -08002481 }
Dan Albertc403f7c2015-03-18 14:01:18 -07002482 }
Colin Cross3f40fa42015-01-30 17:27:36 -08002483}
2484
Colin Cross0ea8ba82019-06-06 14:33:29 -07002485func (c *Module) toolchain(ctx android.BaseModuleContext) config.Toolchain {
Colin Crossca860ac2016-01-04 14:34:37 -08002486 if c.cachedToolchain == nil {
Liz Kammer356f7d42021-01-26 09:18:53 -05002487 c.cachedToolchain = config.FindToolchainWithContext(ctx)
Colin Cross3f40fa42015-01-30 17:27:36 -08002488 }
Colin Crossca860ac2016-01-04 14:34:37 -08002489 return c.cachedToolchain
Colin Cross3f40fa42015-01-30 17:27:36 -08002490}
2491
Colin Crossca860ac2016-01-04 14:34:37 -08002492func (c *Module) begin(ctx BaseModuleContext) {
Joe Onorato37f900c2023-07-18 16:58:16 -07002493 for _, generator := range c.generators {
2494 generator.GeneratorInit(ctx)
2495 }
Colin Crossca860ac2016-01-04 14:34:37 -08002496 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002497 c.compiler.compilerInit(ctx)
Colin Cross21b9a242015-03-24 14:15:58 -07002498 }
Colin Crossca860ac2016-01-04 14:34:37 -08002499 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002500 c.linker.linkerInit(ctx)
Colin Crossca860ac2016-01-04 14:34:37 -08002501 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002502 if c.stl != nil {
2503 c.stl.begin(ctx)
2504 }
Colin Cross16b23492016-01-06 14:41:07 -08002505 if c.sanitize != nil {
2506 c.sanitize.begin(ctx)
2507 }
Dan Willemsen581341d2017-02-09 16:16:31 -08002508 if c.coverage != nil {
2509 c.coverage.begin(ctx)
2510 }
Yi Kong9723e332023-12-04 14:52:53 +09002511 if c.afdo != nil {
2512 c.afdo.begin(ctx)
2513 }
Stephen Craneba090d12017-05-09 15:44:35 -07002514 if c.lto != nil {
2515 c.lto.begin(ctx)
2516 }
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00002517 if c.orderfile != nil {
2518 c.orderfile.begin(ctx)
2519 }
Dan Albert92fe7402020-07-15 13:33:30 -07002520 if ctx.useSdk() && c.IsSdkVariant() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00002521 version, err := NativeApiLevelFromUser(ctx, ctx.sdkVersion())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002522 if err != nil {
2523 ctx.PropertyErrorf("sdk_version", err.Error())
Dan Albert1a246272020-07-06 14:49:35 -07002524 c.Properties.Sdk_version = nil
2525 } else {
2526 c.Properties.Sdk_version = StringPtr(version.String())
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002527 }
Dan Albert7fa7b2e2016-08-05 16:37:52 -07002528 }
Colin Crossca860ac2016-01-04 14:34:37 -08002529}
2530
Colin Cross37047f12016-12-13 17:06:13 -08002531func (c *Module) deps(ctx DepsContext) Deps {
Colin Crossc99deeb2016-04-11 15:06:20 -07002532 deps := Deps{}
2533
Joe Onorato37f900c2023-07-18 16:58:16 -07002534 for _, generator := range c.generators {
2535 deps = generator.GeneratorDeps(ctx, deps)
2536 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002537 if c.compiler != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002538 deps = c.compiler.compilerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002539 }
2540 if c.linker != nil {
Colin Cross42742b82016-08-01 13:20:05 -07002541 deps = c.linker.linkerDeps(ctx, deps)
Colin Crossc99deeb2016-04-11 15:06:20 -07002542 }
Colin Crossa8e07cc2016-04-04 15:07:06 -07002543 if c.stl != nil {
2544 deps = c.stl.deps(ctx, deps)
2545 }
Pirama Arumuga Nainar0b882f02018-04-23 22:44:39 +00002546 if c.coverage != nil {
2547 deps = c.coverage.deps(ctx, deps)
2548 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002549
Colin Crossb6715442017-10-24 11:13:31 -07002550 deps.WholeStaticLibs = android.LastUniqueStrings(deps.WholeStaticLibs)
2551 deps.StaticLibs = android.LastUniqueStrings(deps.StaticLibs)
2552 deps.LateStaticLibs = android.LastUniqueStrings(deps.LateStaticLibs)
2553 deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
2554 deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
2555 deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
Logan Chien43d34c32017-12-20 01:17:32 +08002556 deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002557 deps.LlndkHeaderLibs = android.LastUniqueStrings(deps.LlndkHeaderLibs)
Colin Crossc99deeb2016-04-11 15:06:20 -07002558
Colin Cross516c5452024-10-28 13:45:21 -07002559 if err := checkConflictingExplicitVersions(deps.SharedLibs); err != nil {
2560 ctx.PropertyErrorf("shared_libs", "%s", err.Error())
2561 }
2562
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002563 for _, lib := range deps.ReexportSharedLibHeaders {
2564 if !inList(lib, deps.SharedLibs) {
2565 ctx.PropertyErrorf("export_shared_lib_headers", "Shared library not in shared_libs: '%s'", lib)
2566 }
2567 }
2568
2569 for _, lib := range deps.ReexportStaticLibHeaders {
Steven Morelandba407c82021-04-01 22:17:50 +00002570 if !inList(lib, deps.StaticLibs) && !inList(lib, deps.WholeStaticLibs) {
2571 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 -07002572 }
2573 }
2574
Colin Cross5950f382016-12-13 12:50:57 -08002575 for _, lib := range deps.ReexportHeaderLibHeaders {
2576 if !inList(lib, deps.HeaderLibs) {
2577 ctx.PropertyErrorf("export_header_lib_headers", "Header library not in header_libs: '%s'", lib)
2578 }
2579 }
2580
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002581 for _, gen := range deps.ReexportGeneratedHeaders {
2582 if !inList(gen, deps.GeneratedHeaders) {
2583 ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
2584 }
2585 }
2586
Colin Crossc99deeb2016-04-11 15:06:20 -07002587 return deps
2588}
2589
Colin Cross516c5452024-10-28 13:45:21 -07002590func checkConflictingExplicitVersions(libs []string) error {
2591 withoutVersion := func(s string) string {
2592 name, _ := StubsLibNameAndVersion(s)
2593 return name
2594 }
2595 var errs []error
2596 for i, lib := range libs {
2597 libName := withoutVersion(lib)
2598 libsToCompare := libs[i+1:]
2599 j := slices.IndexFunc(libsToCompare, func(s string) bool {
2600 return withoutVersion(s) == libName
2601 })
2602 if j >= 0 {
2603 errs = append(errs, fmt.Errorf("duplicate shared libraries with different explicit versions: %q and %q",
2604 lib, libsToCompare[j]))
2605 }
2606 }
2607 return errors.Join(errs...)
2608}
2609
Dan Albert7e9d2952016-08-04 13:02:36 -07002610func (c *Module) beginMutator(actx android.BottomUpMutatorContext) {
Colin Crossca860ac2016-01-04 14:34:37 -08002611 ctx := &baseModuleContext{
Colin Cross0ea8ba82019-06-06 14:33:29 -07002612 BaseModuleContext: actx,
Colin Crossca860ac2016-01-04 14:34:37 -08002613 moduleContextImpl: moduleContextImpl{
2614 mod: c,
2615 },
2616 }
2617 ctx.ctx = ctx
2618
Colin Crossca860ac2016-01-04 14:34:37 -08002619 c.begin(ctx)
Dan Albert7e9d2952016-08-04 13:02:36 -07002620}
2621
Jiyong Park7ed9de32018-10-15 22:25:07 +09002622// Split name#version into name and version
Jiyong Park73c54ee2019-10-22 20:31:18 +09002623func StubsLibNameAndVersion(name string) (string, string) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002624 if sharp := strings.LastIndex(name, "#"); sharp != -1 && sharp != len(name)-1 {
2625 version := name[sharp+1:]
2626 libname := name[:sharp]
2627 return libname, version
2628 }
2629 return name, ""
2630}
2631
Dan Albert92fe7402020-07-15 13:33:30 -07002632func GetCrtVariations(ctx android.BottomUpMutatorContext,
2633 m LinkableInterface) []blueprint.Variation {
2634 if ctx.Os() != android.Android {
2635 return nil
2636 }
2637 if m.UseSdk() {
Jiyong Parkfdaa5f72021-03-19 22:18:04 +09002638 // Choose the CRT that best satisfies the min_sdk_version requirement of this module
2639 minSdkVersion := m.MinSdkVersion()
2640 if minSdkVersion == "" || minSdkVersion == "apex_inherit" {
2641 minSdkVersion = m.SdkVersion()
2642 }
Jooyung Han94a76ee2021-06-08 09:49:48 +09002643 apiLevel, err := android.ApiLevelFromUser(ctx, minSdkVersion)
2644 if err != nil {
2645 ctx.PropertyErrorf("min_sdk_version", err.Error())
2646 }
Colin Cross363ec762023-01-13 13:45:14 -08002647
2648 // Raise the minSdkVersion to the minimum supported for the architecture.
Colin Crossbb137a32023-01-26 09:54:42 -08002649 minApiForArch := MinApiForArch(ctx, m.Target().Arch.ArchType)
Colin Cross363ec762023-01-13 13:45:14 -08002650 if apiLevel.LessThan(minApiForArch) {
2651 apiLevel = minApiForArch
2652 }
2653
Dan Albert92fe7402020-07-15 13:33:30 -07002654 return []blueprint.Variation{
2655 {Mutator: "sdk", Variation: "sdk"},
Jooyung Han94a76ee2021-06-08 09:49:48 +09002656 {Mutator: "version", Variation: apiLevel.String()},
Dan Albert92fe7402020-07-15 13:33:30 -07002657 }
2658 }
2659 return []blueprint.Variation{
2660 {Mutator: "sdk", Variation: ""},
2661 }
2662}
2663
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002664func AddSharedLibDependenciesWithVersions(ctx android.BottomUpMutatorContext, mod LinkableInterface,
2665 variations []blueprint.Variation, depTag blueprint.DependencyTag, name, version string, far bool) {
Colin Crosse7257d22020-09-24 09:56:18 -07002666
2667 variations = append([]blueprint.Variation(nil), variations...)
2668
Liz Kammer23942242022-04-08 15:41:00 -04002669 if version != "" && canBeOrLinkAgainstVersionVariants(mod) {
Colin Crosse7257d22020-09-24 09:56:18 -07002670 // Version is explicitly specified. i.e. libFoo#30
Colin Crossb614cd42024-10-11 12:52:21 -07002671 if version == "impl" {
2672 version = ""
2673 }
Colin Crosse7257d22020-09-24 09:56:18 -07002674 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version})
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002675 if tag, ok := depTag.(libraryDependencyTag); ok {
2676 tag.explicitlyVersioned = true
Colin Crossafcdce82024-10-22 13:59:33 -07002677 // depTag is an interface that contains a concrete non-pointer struct. That makes the local
2678 // tag variable a copy of the contents of depTag, and updating it doesn't change depTag. Reassign
2679 // the modified copy to depTag.
2680 depTag = tag
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002681 } else {
2682 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
2683 }
Colin Crosse7257d22020-09-24 09:56:18 -07002684 }
Colin Crosse7257d22020-09-24 09:56:18 -07002685
Colin Cross0de8a1e2020-09-18 14:15:30 -07002686 if far {
2687 ctx.AddFarVariationDependencies(variations, depTag, name)
2688 } else {
2689 ctx.AddVariationDependencies(variations, depTag, name)
Colin Crosse7257d22020-09-24 09:56:18 -07002690 }
2691}
2692
Kiyoung Kim487689e2022-07-26 09:48:22 +09002693func GetReplaceModuleName(lib string, replaceMap map[string]string) string {
2694 if snapshot, ok := replaceMap[lib]; ok {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002695 return snapshot
2696 }
2697
2698 return lib
2699}
2700
Kiyoung Kim37693d02024-04-04 09:56:15 +09002701// FilterNdkLibs takes a list of names of shared libraries and scans it for two types
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002702// of names:
2703//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002704// 1. Name of an NDK library that refers to an ndk_library module.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002705//
2706// For each of these, it adds the name of the ndk_library module to the list of
2707// variant libs.
2708//
Kiyoung Kim37693d02024-04-04 09:56:15 +09002709// 2. Anything else (so anything that isn't an NDK library).
Kiyoung Kim487689e2022-07-26 09:48:22 +09002710//
2711// It adds these to the nonvariantLibs list.
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002712//
2713// The caller can then know to add the variantLibs dependencies differently from the
2714// nonvariantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002715func FilterNdkLibs(c LinkableInterface, config android.Config, list []string) (nonvariantLibs []string, variantLibs []string) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002716 variantLibs = []string{}
2717
2718 nonvariantLibs = []string{}
2719 for _, entry := range list {
2720 // strip #version suffix out
2721 name, _ := StubsLibNameAndVersion(entry)
Kiyoung Kim37693d02024-04-04 09:56:15 +09002722 if c.UseSdk() && inList(name, *getNDKKnownLibs(config)) {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002723 variantLibs = append(variantLibs, name+ndkLibrarySuffix)
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002724 } else {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002725 nonvariantLibs = append(nonvariantLibs, entry)
2726 }
2727 }
2728 return nonvariantLibs, variantLibs
Kiyoung Kim37693d02024-04-04 09:56:15 +09002729
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002730}
2731
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002732func rewriteLibsForApiImports(c LinkableInterface, libs []string, replaceList map[string]string, config android.Config) ([]string, []string) {
2733 nonVariantLibs := []string{}
2734 variantLibs := []string{}
2735
2736 for _, lib := range libs {
2737 replaceLibName := GetReplaceModuleName(lib, replaceList)
2738 if replaceLibName == lib {
2739 // Do not handle any libs which are not in API imports
2740 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2741 } else if c.UseSdk() && inList(replaceLibName, *getNDKKnownLibs(config)) {
2742 variantLibs = append(variantLibs, replaceLibName)
2743 } else {
2744 nonVariantLibs = append(nonVariantLibs, replaceLibName)
2745 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09002746 }
2747
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002748 return nonVariantLibs, variantLibs
Kiyoung Kim487689e2022-07-26 09:48:22 +09002749}
2750
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002751func (c *Module) shouldUseApiSurface() bool {
2752 if c.Os() == android.Android && c.Target().NativeBridge != android.NativeBridgeEnabled {
2753 if GetImageVariantType(c) == vendorImageVariant || GetImageVariantType(c) == productImageVariant {
2754 // LLNDK Variant
2755 return true
2756 }
2757
2758 if c.Properties.IsSdkVariant {
2759 // NDK Variant
2760 return true
2761 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09002762 }
2763
2764 return false
2765}
2766
Colin Cross1e676be2016-10-12 14:38:15 -07002767func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002768 if !c.Enabled(actx) {
Inseob Kimeec88e12020-01-22 11:11:29 +09002769 return
2770 }
2771
Colin Cross37047f12016-12-13 17:06:13 -08002772 ctx := &depsContext{
2773 BottomUpMutatorContext: actx,
Dan Albert7e9d2952016-08-04 13:02:36 -07002774 moduleContextImpl: moduleContextImpl{
2775 mod: c,
2776 },
2777 }
2778 ctx.ctx = ctx
Colin Crossca860ac2016-01-04 14:34:37 -08002779
Colin Crossc99deeb2016-04-11 15:06:20 -07002780 deps := c.deps(ctx)
Kiyoung Kim11d91082022-10-19 19:20:57 +09002781
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002782 apiNdkLibs := []string{}
2783 apiLateNdkLibs := []string{}
2784
Yo Chiang219968c2020-09-22 18:45:04 +08002785 c.Properties.AndroidMkSystemSharedLibs = deps.SystemSharedLibs
2786
Dan Albert914449f2016-06-17 16:45:24 -07002787 variantNdkLibs := []string{}
2788 variantLateNdkLibs := []string{}
Dan Willemsenb916b802017-03-19 13:44:32 -07002789 if ctx.Os() == android.Android {
Kiyoung Kim37693d02024-04-04 09:56:15 +09002790 deps.SharedLibs, variantNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.SharedLibs)
2791 deps.LateSharedLibs, variantLateNdkLibs = FilterNdkLibs(c, ctx.Config(), deps.LateSharedLibs)
2792 deps.ReexportSharedLibHeaders, _ = FilterNdkLibs(c, ctx.Config(), deps.ReexportSharedLibHeaders)
Dan Willemsen72d39932016-07-08 23:23:48 -07002793 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002794
Colin Cross32ec36c2016-12-15 07:39:51 -08002795 for _, lib := range deps.HeaderLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002796 depTag := libraryDependencyTag{Kind: headerLibraryDependency}
Colin Cross32ec36c2016-12-15 07:39:51 -08002797 if inList(lib, deps.ReexportHeaderLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002798 depTag.reexportFlags = true
Colin Cross32ec36c2016-12-15 07:39:51 -08002799 }
Inseob Kimeec88e12020-01-22 11:11:29 +09002800
Spandan Das73bcafc2022-08-18 23:26:00 +00002801 if c.isNDKStubLibrary() {
Jiyong Parkf8fab9b2024-09-02 15:24:15 +09002802 variationExists := actx.OtherModuleDependencyVariantExists(nil, lib)
2803 if variationExists {
2804 actx.AddVariationDependencies(nil, depTag, lib)
2805 } else {
2806 // dependencies to ndk_headers fall here as ndk_headers do not have
2807 // any variants.
2808 actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
2809 }
Spandan Dasff665182024-09-11 18:48:44 +00002810 } else if c.IsStubs() {
Colin Cross7228ecd2019-11-18 16:00:16 -08002811 actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
Colin Cross0f7d2ef2019-10-16 11:03:10 -07002812 depTag, lib)
Jiyong Park7e636d02019-01-28 16:16:54 +09002813 } else {
2814 actx.AddVariationDependencies(nil, depTag, lib)
2815 }
2816 }
2817
Dan Albertf1d14c72020-07-30 14:32:55 -07002818 if c.isNDKStubLibrary() {
2819 // NDK stubs depend on their implementation because the ABI dumps are
2820 // generated from the implementation library.
Kiyoung Kim487689e2022-07-26 09:48:22 +09002821
Spandan Das8b08aea2023-03-14 19:29:34 +00002822 actx.AddFarVariationDependencies(append(ctx.Target().Variations(),
2823 c.ImageVariation(),
2824 blueprint.Variation{Mutator: "link", Variation: "shared"},
2825 ), stubImplementation, c.BaseModuleName())
Dan Albertf1d14c72020-07-30 14:32:55 -07002826 }
2827
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002828 // If this module is an LLNDK implementation library, let it depend on LlndkHeaderLibs.
2829 if c.ImageVariation().Variation == android.CoreVariation && c.Device() &&
2830 c.Target().NativeBridge == android.NativeBridgeDisabled {
2831 actx.AddVariationDependencies(
Jihoon Kang47e91842024-06-19 00:51:16 +00002832 []blueprint.Variation{{Mutator: "image", Variation: android.VendorVariation}},
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08002833 llndkHeaderLibTag,
2834 deps.LlndkHeaderLibs...)
2835 }
2836
Jiyong Park5d1598f2019-02-25 22:14:17 +09002837 for _, lib := range deps.WholeStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002838 depTag := libraryDependencyTag{Kind: staticLibraryDependency, wholeStatic: true, reexportFlags: true}
Inseob Kimeec88e12020-01-22 11:11:29 +09002839
Jiyong Park5d1598f2019-02-25 22:14:17 +09002840 actx.AddVariationDependencies([]blueprint.Variation{
2841 {Mutator: "link", Variation: "static"},
2842 }, depTag, lib)
2843 }
2844
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002845 for _, lib := range deps.StaticLibs {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002846 // Some dependencies listed in static_libs might actually be rust_ffi rlib variants.
Colin Cross8acea3e2024-12-12 14:53:30 -08002847 depTag := libraryDependencyTag{Kind: staticLibraryDependency}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04002848
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002849 if inList(lib, deps.ReexportStaticLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002850 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002851 }
Jiyong Parke3867542020-12-03 17:28:25 +09002852 if inList(lib, deps.ExcludeLibsForApex) {
2853 depTag.excludeInApex = true
2854 }
Dan Willemsen59339a22018-07-22 21:18:45 -07002855 actx.AddVariationDependencies([]blueprint.Variation{
2856 {Mutator: "link", Variation: "static"},
2857 }, depTag, lib)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002858 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002859
Jooyung Han75568392020-03-20 04:29:24 +09002860 // staticUnwinderDep is treated as staticDep for Q apexes
2861 // so that native libraries/binaries are linked with static unwinder
2862 // because Q libc doesn't have unwinder APIs
2863 if deps.StaticUnwinderIfLegacy {
Colin Cross8acea3e2024-12-12 14:53:30 -08002864 depTag := libraryDependencyTag{Kind: staticLibraryDependency, staticUnwinder: true}
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002865 actx.AddVariationDependencies([]blueprint.Variation{
2866 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002867 }, depTag, staticUnwinder(actx))
Peter Collingbournedc4f9862020-02-12 17:13:25 -08002868 }
2869
Jiyong Park7ed9de32018-10-15 22:25:07 +09002870 // shared lib names without the #version suffix
2871 var sharedLibNames []string
2872
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002873 for _, lib := range deps.SharedLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002874 depTag := libraryDependencyTag{Kind: sharedLibraryDependency}
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002875 if inList(lib, deps.ReexportSharedLibHeaders) {
Colin Cross6e511a92020-07-27 21:26:48 -07002876 depTag.reexportFlags = true
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002877 }
Jiyong Parke3867542020-12-03 17:28:25 +09002878 if inList(lib, deps.ExcludeLibsForApex) {
2879 depTag.excludeInApex = true
2880 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09002881 if inList(lib, deps.ExcludeLibsForNonApex) {
2882 depTag.excludeInNonApex = true
2883 }
Inseob Kimc0907f12019-02-08 21:00:45 +09002884
Jiyong Park73c54ee2019-10-22 20:31:18 +09002885 name, version := StubsLibNameAndVersion(lib)
Inseob Kimc0907f12019-02-08 21:00:45 +09002886 sharedLibNames = append(sharedLibNames, name)
2887
Colin Crosse7257d22020-09-24 09:56:18 -07002888 variations := []blueprint.Variation{
2889 {Mutator: "link", Variation: "shared"},
2890 }
Spandan Dasff665182024-09-11 18:48:44 +00002891 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, name, version, false)
Dan Willemsen490a8dc2016-06-06 18:22:19 -07002892 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002893
Colin Crossfe9acfe2021-06-14 16:13:03 -07002894 for _, lib := range deps.LateStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002895 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency}
Colin Crossfe9acfe2021-06-14 16:13:03 -07002896 actx.AddVariationDependencies([]blueprint.Variation{
2897 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002898 }, depTag, lib)
Colin Crossfe9acfe2021-06-14 16:13:03 -07002899 }
2900
Colin Cross3e5e7782022-06-17 22:17:05 +00002901 for _, lib := range deps.UnexportedStaticLibs {
Colin Cross8acea3e2024-12-12 14:53:30 -08002902 depTag := libraryDependencyTag{Kind: staticLibraryDependency, Order: lateLibraryDependency, unexportedSymbols: true}
Colin Cross3e5e7782022-06-17 22:17:05 +00002903 actx.AddVariationDependencies([]blueprint.Variation{
2904 {Mutator: "link", Variation: "static"},
Kiyoung Kim37693d02024-04-04 09:56:15 +09002905 }, depTag, lib)
Colin Cross3e5e7782022-06-17 22:17:05 +00002906 }
2907
Jiyong Park7ed9de32018-10-15 22:25:07 +09002908 for _, lib := range deps.LateSharedLibs {
Jiyong Park25fc6a92018-11-18 18:02:45 +09002909 if inList(lib, sharedLibNames) {
Jiyong Park7ed9de32018-10-15 22:25:07 +09002910 // This is to handle the case that some of the late shared libs (libc, libdl, libm, ...)
2911 // are added also to SharedLibs with version (e.g., libc#10). If not skipped, we will be
2912 // linking against both the stubs lib and the non-stubs lib at the same time.
2913 continue
2914 }
Colin Cross8acea3e2024-12-12 14:53:30 -08002915 depTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency}
Colin Crosse7257d22020-09-24 09:56:18 -07002916 variations := []blueprint.Variation{
2917 {Mutator: "link", Variation: "shared"},
2918 }
Ivan Lozanod67a6b02021-05-20 13:01:32 -04002919 AddSharedLibDependenciesWithVersions(ctx, c, variations, depTag, lib, "", false)
Jiyong Park7ed9de32018-10-15 22:25:07 +09002920 }
Colin Crossc99deeb2016-04-11 15:06:20 -07002921
Dan Willemsen59339a22018-07-22 21:18:45 -07002922 actx.AddVariationDependencies([]blueprint.Variation{
2923 {Mutator: "link", Variation: "shared"},
Chris Parsons79d66a52020-06-05 17:26:16 -04002924 }, dataLibDepTag, deps.DataLibs...)
2925
Colin Crossc8caa062021-09-24 16:50:14 -07002926 actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...)
2927
Chris Parsons79d66a52020-06-05 17:26:16 -04002928 actx.AddVariationDependencies([]blueprint.Variation{
2929 {Mutator: "link", Variation: "shared"},
Dan Willemsen59339a22018-07-22 21:18:45 -07002930 }, runtimeDepTag, deps.RuntimeLibs...)
Logan Chien43d34c32017-12-20 01:17:32 +08002931
Colin Cross68861832016-07-08 10:41:41 -07002932 actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07002933
2934 for _, gen := range deps.GeneratedHeaders {
2935 depTag := genHeaderDepTag
2936 if inList(gen, deps.ReexportGeneratedHeaders) {
2937 depTag = genHeaderExportDepTag
2938 }
2939 actx.AddDependency(c, depTag, gen)
2940 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07002941
Cole Faust65cb40a2024-10-21 15:41:42 -07002942 for _, gen := range deps.DeviceFirstGeneratedHeaders {
2943 depTag := genHeaderDepTag
2944 actx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), depTag, gen)
2945 }
2946
Dan Albert92fe7402020-07-15 13:33:30 -07002947 crtVariations := GetCrtVariations(ctx, c)
Colin Crossbbc941b2020-09-30 12:27:01 -07002948 actx.AddVariationDependencies(crtVariations, objDepTag, deps.ObjFiles...)
Colin Crossc465efd2021-06-11 18:00:04 -07002949 for _, crt := range deps.CrtBegin {
Dan Albert92fe7402020-07-15 13:33:30 -07002950 actx.AddVariationDependencies(crtVariations, CrtBeginDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002951 crt)
Colin Crossca860ac2016-01-04 14:34:37 -08002952 }
Colin Crossc465efd2021-06-11 18:00:04 -07002953 for _, crt := range deps.CrtEnd {
Dan Albert92fe7402020-07-15 13:33:30 -07002954 actx.AddVariationDependencies(crtVariations, CrtEndDepTag,
Kiyoung Kim37693d02024-04-04 09:56:15 +09002955 crt)
Colin Cross21b9a242015-03-24 14:15:58 -07002956 }
Dan Willemsena0790e32018-10-12 00:24:23 -07002957 if deps.DynamicLinker != "" {
2958 actx.AddDependency(c, dynamicLinkerDepTag, deps.DynamicLinker)
Dan Willemsenc77a0b32017-09-18 23:19:12 -07002959 }
Dan Albert914449f2016-06-17 16:45:24 -07002960
2961 version := ctx.sdkVersion()
Colin Cross6e511a92020-07-27 21:26:48 -07002962
Colin Cross8acea3e2024-12-12 14:53:30 -08002963 ndkStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002964 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002965 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002966 {Mutator: "link", Variation: "shared"},
2967 }, ndkStubDepTag, variantNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002968 actx.AddVariationDependencies([]blueprint.Variation{
2969 {Mutator: "version", Variation: version},
2970 {Mutator: "link", Variation: "shared"},
2971 }, ndkStubDepTag, apiNdkLibs...)
Colin Cross6e511a92020-07-27 21:26:48 -07002972
Colin Cross8acea3e2024-12-12 14:53:30 -08002973 ndkLateStubDepTag := libraryDependencyTag{Kind: sharedLibraryDependency, Order: lateLibraryDependency, ndk: true, makeSuffix: "." + version}
Dan Albert914449f2016-06-17 16:45:24 -07002974 actx.AddVariationDependencies([]blueprint.Variation{
Colin Cross5ec407b2020-09-30 11:41:33 -07002975 {Mutator: "version", Variation: version},
Dan Willemsen59339a22018-07-22 21:18:45 -07002976 {Mutator: "link", Variation: "shared"},
2977 }, ndkLateStubDepTag, variantLateNdkLibs...)
Kiyoung Kimd5d1ab12022-11-28 16:47:10 +09002978 actx.AddVariationDependencies([]blueprint.Variation{
2979 {Mutator: "version", Variation: version},
2980 {Mutator: "link", Variation: "shared"},
2981 }, ndkLateStubDepTag, apiLateNdkLibs...)
Logan Chienf3511742017-10-31 18:04:35 +08002982
Vinh Tran367d89d2023-04-28 11:21:25 -04002983 if len(deps.AidlLibs) > 0 {
2984 actx.AddDependency(
2985 c,
2986 aidlLibraryTag,
2987 deps.AidlLibs...,
2988 )
2989 }
2990
Colin Cross6362e272015-10-29 15:25:03 -07002991}
Colin Cross21b9a242015-03-24 14:15:58 -07002992
Colin Crosse40b4ea2018-10-02 22:25:58 -07002993func BeginMutator(ctx android.BottomUpMutatorContext) {
Cole Fausta963b942024-04-11 17:43:00 -07002994 if c, ok := ctx.Module().(*Module); ok && c.Enabled(ctx) {
Dan Albert7e9d2952016-08-04 13:02:36 -07002995 c.beginMutator(ctx)
2996 }
2997}
2998
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07002999// Whether a module can link to another module, taking into
3000// account NDK linking.
Jooyung Han479ca172020-10-19 18:51:07 +09003001func checkLinkType(ctx android.BaseModuleContext, from LinkableInterface, to LinkableInterface,
Colin Cross6e511a92020-07-27 21:26:48 -07003002 tag blueprint.DependencyTag) {
3003
3004 switch t := tag.(type) {
3005 case dependencyTag:
3006 if t != vndkExtDepTag {
3007 return
3008 }
3009 case libraryDependencyTag:
3010 default:
3011 return
3012 }
3013
Ivan Lozanof9e21722020-12-02 09:00:51 -05003014 if from.Target().Os != android.Android {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003015 // Host code is not restricted
3016 return
3017 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003018
Ivan Lozano52767be2019-10-18 14:49:46 -07003019 if from.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003020 // Platform code can link to anything
3021 return
3022 }
Yifan Hong1b3348d2020-01-21 15:53:22 -08003023 if from.InRamdisk() {
3024 // Ramdisk code is not NDK
3025 return
3026 }
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003027 if from.InVendorRamdisk() {
3028 // Vendor ramdisk code is not NDK
3029 return
3030 }
Ivan Lozano52767be2019-10-18 14:49:46 -07003031 if from.InRecovery() {
Jiyong Parkf9332f12018-02-01 00:54:12 +09003032 // Recovery code is not NDK
3033 return
3034 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003035 // Change this to LinkableInterface if Rust gets NDK support, which stubDecorators are for
Colin Cross31076b32020-10-23 17:22:06 -07003036 if c, ok := to.(*Module); ok {
Colin Cross31076b32020-10-23 17:22:06 -07003037 if c.StubDecorator() {
3038 // These aren't real libraries, but are the stub shared libraries that are included in
3039 // the NDK.
3040 return
3041 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003042 }
Logan Chien834b9a62019-01-14 15:39:03 +08003043
Ivan Lozano52767be2019-10-18 14:49:46 -07003044 if strings.HasPrefix(ctx.ModuleName(), "libclang_rt.") && to.Module().Name() == "libc++" {
Logan Chien834b9a62019-01-14 15:39:03 +08003045 // Bug: http://b/121358700 - Allow libclang_rt.* shared libraries (with sdk_version)
3046 // to link to libc++ (non-NDK and without sdk_version).
3047 return
3048 }
3049
Ivan Lozano52767be2019-10-18 14:49:46 -07003050 if to.SdkVersion() == "" {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003051 // NDK code linking to platform code is never okay.
3052 ctx.ModuleErrorf("depends on non-NDK-built library %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003053 ctx.OtherModuleName(to.Module()))
Dan Willemsen155d17c2019-02-06 18:30:02 -08003054 return
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003055 }
3056
3057 // At this point we know we have two NDK libraries, but we need to
3058 // check that we're not linking against anything built against a higher
3059 // API level, as it is only valid to link against older or equivalent
3060 // APIs.
3061
Inseob Kim01a28722018-04-11 09:48:45 +09003062 // Current can link against anything.
Ivan Lozano52767be2019-10-18 14:49:46 -07003063 if from.SdkVersion() != "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003064 // Otherwise we need to check.
Ivan Lozano52767be2019-10-18 14:49:46 -07003065 if to.SdkVersion() == "current" {
Inseob Kim01a28722018-04-11 09:48:45 +09003066 // Current can't be linked against by anything else.
3067 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003068 ctx.OtherModuleName(to.Module()), "current")
Inseob Kim01a28722018-04-11 09:48:45 +09003069 } else {
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003070 fromApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003071 if err != nil {
3072 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003073 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003074 from.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003075 }
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003076 toApi, err := android.ApiLevelFromUserWithConfig(ctx.Config(), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003077 if err != nil {
3078 ctx.PropertyErrorf("sdk_version",
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003079 "Invalid sdk_version value (must be int, preview or current): %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003080 to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003081 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003082
Prashanth Swaminathan6dcbd9c2023-07-18 17:55:01 -07003083 if toApi.GreaterThan(fromApi) {
Inseob Kim01a28722018-04-11 09:48:45 +09003084 ctx.ModuleErrorf("links %q built against newer API version %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003085 ctx.OtherModuleName(to.Module()), to.SdkVersion())
Inseob Kim01a28722018-04-11 09:48:45 +09003086 }
3087 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003088 }
Dan Albert202fe492017-12-15 13:56:59 -08003089
3090 // Also check that the two STL choices are compatible.
Ivan Lozano52767be2019-10-18 14:49:46 -07003091 fromStl := from.SelectedStl()
3092 toStl := to.SelectedStl()
Dan Albert202fe492017-12-15 13:56:59 -08003093 if fromStl == "" || toStl == "" {
3094 // Libraries that don't use the STL are unrestricted.
Inseob Kimda2171a2018-04-11 15:41:38 +09003095 } else if fromStl == "ndk_system" || toStl == "ndk_system" {
Dan Albert202fe492017-12-15 13:56:59 -08003096 // We can be permissive with the system "STL" since it is only the C++
3097 // ABI layer, but in the future we should make sure that everyone is
3098 // using either libc++ or nothing.
Colin Crossb60190a2018-09-04 16:28:17 -07003099 } else if getNdkStlFamily(from) != getNdkStlFamily(to) {
Dan Albert202fe492017-12-15 13:56:59 -08003100 ctx.ModuleErrorf("uses %q and depends on %q which uses incompatible %q",
Ivan Lozano52767be2019-10-18 14:49:46 -07003101 from.SelectedStl(), ctx.OtherModuleName(to.Module()),
3102 to.SelectedStl())
Dan Albert202fe492017-12-15 13:56:59 -08003103 }
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003104}
3105
Jooyung Han479ca172020-10-19 18:51:07 +09003106func checkLinkTypeMutator(ctx android.BottomUpMutatorContext) {
3107 if c, ok := ctx.Module().(*Module); ok {
3108 ctx.VisitDirectDeps(func(dep android.Module) {
3109 depTag := ctx.OtherModuleDependencyTag(dep)
3110 ccDep, ok := dep.(LinkableInterface)
3111 if ok {
3112 checkLinkType(ctx, c, ccDep, depTag)
3113 }
3114 })
3115 }
3116}
3117
Jiyong Park5fb8c102018-04-09 12:03:06 +09003118// Tests whether the dependent library is okay to be double loaded inside a single process.
Jooyung Hana70f0672019-01-18 15:20:43 +09003119// If a library has a vendor variant and is a (transitive) dependency of an LLNDK library,
3120// it is subject to be double loaded. Such lib should be explicitly marked as double_loadable: true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003121// or as vndk-sp (vndk: { enabled: true, support_system_process: true}).
Colin Crossda279cf2024-09-17 14:25:45 -07003122func checkDoubleLoadableLibraries(ctx android.BottomUpMutatorContext) {
Jooyung Hana70f0672019-01-18 15:20:43 +09003123 check := func(child, parent android.Module) bool {
3124 to, ok := child.(*Module)
3125 if !ok {
Jooyung Han479ca172020-10-19 18:51:07 +09003126 return false
Jooyung Hana70f0672019-01-18 15:20:43 +09003127 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003128
Jooyung Hana70f0672019-01-18 15:20:43 +09003129 if lib, ok := to.linker.(*libraryDecorator); !ok || !lib.shared() {
3130 return false
Jiyong Park5fb8c102018-04-09 12:03:06 +09003131 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003132
Jiyong Park0474e1f2021-01-14 14:26:06 +09003133 // These dependencies are not excercised at runtime. Tracking these will give us
3134 // false negative, so skip.
Jiyong Park1ad8e162020-12-01 23:40:09 +09003135 depTag := ctx.OtherModuleDependencyTag(child)
3136 if IsHeaderDepTag(depTag) {
3137 return false
3138 }
Jiyong Park0474e1f2021-01-14 14:26:06 +09003139 if depTag == staticVariantTag {
3140 return false
3141 }
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003142 if depTag == StubImplDepTag {
Jiyong Park0474e1f2021-01-14 14:26:06 +09003143 return false
3144 }
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003145 if depTag == android.RequiredDepTag {
3146 return false
3147 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003148
Justin Yun63e9ec72020-10-29 16:49:43 +09003149 // Even if target lib has no vendor variant, keep checking dependency
3150 // graph in case it depends on vendor_available or product_available
3151 // but not double_loadable transtively.
3152 if !to.HasNonSystemVariants() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003153 return true
Jiyong Park5fb8c102018-04-09 12:03:06 +09003154 }
Jooyung Hana70f0672019-01-18 15:20:43 +09003155
Jiyong Park0474e1f2021-01-14 14:26:06 +09003156 // The happy path. Keep tracking dependencies until we hit a non double-loadable
3157 // one.
3158 if Bool(to.VendorProperties.Double_loadable) {
3159 return true
3160 }
3161
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003162 if to.IsLlndk() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003163 return false
3164 }
3165
Jooyung Hana70f0672019-01-18 15:20:43 +09003166 ctx.ModuleErrorf("links a library %q which is not LL-NDK, "+
3167 "VNDK-SP, or explicitly marked as 'double_loadable:true'. "+
Jiyong Park0474e1f2021-01-14 14:26:06 +09003168 "Dependency list: %s", ctx.OtherModuleName(to), ctx.GetPathString(false))
Jooyung Hana70f0672019-01-18 15:20:43 +09003169 return false
3170 }
3171 if module, ok := ctx.Module().(*Module); ok {
3172 if lib, ok := module.linker.(*libraryDecorator); ok && lib.shared() {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003173 if lib.HasLLNDKStubs() {
Jooyung Hana70f0672019-01-18 15:20:43 +09003174 ctx.WalkDeps(check)
3175 }
Jiyong Park5fb8c102018-04-09 12:03:06 +09003176 }
3177 }
3178}
3179
Yu Liue4312402023-01-18 09:15:31 -08003180func findApexSdkVersion(ctx android.BaseModuleContext, apexInfo android.ApexInfo) android.ApiLevel {
3181 // For the dependency from platform to apex, use the latest stubs
3182 apexSdkVersion := android.FutureApiLevel
3183 if !apexInfo.IsForPlatform() {
3184 apexSdkVersion = apexInfo.MinSdkVersion
3185 }
3186
3187 if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
3188 // In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
3189 // so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
3190 // (b/144430859)
3191 apexSdkVersion = android.FutureApiLevel
3192 }
3193
3194 return apexSdkVersion
3195}
3196
Colin Crossc99deeb2016-04-11 15:06:20 -07003197// Convert dependencies to paths. Returns a PathDeps containing paths
Colin Cross635c3b02016-05-18 15:37:25 -07003198func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
Colin Crossca860ac2016-01-04 14:34:37 -08003199 var depPaths PathDeps
Colin Crossca860ac2016-01-04 14:34:37 -08003200
Colin Cross0de8a1e2020-09-18 14:15:30 -07003201 var directStaticDeps []StaticLibraryInfo
3202 var directSharedDeps []SharedLibraryInfo
Jeff Gaston294356f2017-09-27 17:05:30 -07003203
Colin Cross0de8a1e2020-09-18 14:15:30 -07003204 reexportExporter := func(exporter FlagExporterInfo) {
3205 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, exporter.IncludeDirs...)
3206 depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.SystemIncludeDirs...)
3207 depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.Flags...)
3208 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.Deps...)
3209 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.GeneratedHeaders...)
Inseob Kim69378442019-06-03 19:10:47 +09003210 }
3211
Colin Crossff694a82023-12-13 15:54:49 -08003212 apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
Yu Liue4312402023-01-18 09:15:31 -08003213 c.apexSdkVersion = findApexSdkVersion(ctx, apexInfo)
Jooyung Hande34d232020-07-23 13:04:15 +09003214
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003215 skipModuleList := map[string]bool{}
3216
Yu Liu8024b922024-12-20 23:31:32 +00003217 ctx.VisitDirectDepsProxy(func(dep android.ModuleProxy) {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003218 depName := ctx.OtherModuleName(dep)
3219 depTag := ctx.OtherModuleDependencyTag(dep)
Dan Albert9e10cd42016-08-03 14:12:14 -07003220
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003221 if _, ok := skipModuleList[depName]; ok {
3222 // skip this module because original module or API imported module matching with this should be used instead.
3223 return
3224 }
3225
Yu Liu8024b922024-12-20 23:31:32 +00003226 var ccInfo *CcInfo
3227 v, hasCcInfo := android.OtherModuleProvider(ctx, dep, CcInfoProvider)
3228 if hasCcInfo {
3229 ccInfo = v
3230 }
3231 linkableInfo, hasLinkableInfo := android.OtherModuleProvider(ctx, dep, LinkableInfoProvider)
Dan Willemsen47450072021-10-19 20:24:49 -07003232 if depTag == android.DarwinUniversalVariantTag {
Yu Liu8024b922024-12-20 23:31:32 +00003233 if !hasCcInfo {
3234 panic(fmt.Errorf("dep is not a cc module: %s", dep.String()))
3235 }
3236 depPaths.DarwinSecondArchOutput = linkableInfo.OutputFile
Dan Willemsen47450072021-10-19 20:24:49 -07003237 return
3238 }
3239
Vinh Tran367d89d2023-04-28 11:21:25 -04003240 if depTag == aidlLibraryTag {
Colin Cross313aa542023-12-13 13:47:44 -08003241 if aidlLibraryInfo, ok := android.OtherModuleProvider(ctx, dep, aidl_library.AidlLibraryProvider); ok {
Vinh Tran367d89d2023-04-28 11:21:25 -04003242 depPaths.AidlLibraryInfos = append(
3243 depPaths.AidlLibraryInfos,
Colin Cross313aa542023-12-13 13:47:44 -08003244 aidlLibraryInfo,
Vinh Tran367d89d2023-04-28 11:21:25 -04003245 )
3246 }
3247 }
3248
Yu Liu8024b922024-12-20 23:31:32 +00003249 if !hasLinkableInfo {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003250 // handling for a few module types that aren't cc Module but that are also supported
Yu Liu8024b922024-12-20 23:31:32 +00003251 genRule, ok := android.OtherModuleProvider(ctx, dep, android.GeneratedSourceInfoProvider)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003252 switch depTag {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003253 case genSourceDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003254 if ok {
Dan Willemsenb40aab62016-04-20 14:21:14 -07003255 depPaths.GeneratedSources = append(depPaths.GeneratedSources,
Yu Liu8024b922024-12-20 23:31:32 +00003256 genRule.GeneratedSourceFiles...)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003257 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003258 ctx.ModuleErrorf("module %q is not a gensrcs or genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003259 }
Colin Crosse90bfd12017-04-26 16:59:26 -07003260 // Support exported headers from a generated_sources dependency
3261 fallthrough
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003262 case genHeaderDepTag, genHeaderExportDepTag:
Yu Liu8024b922024-12-20 23:31:32 +00003263 if ok {
Inseob Kimd110f872019-12-06 13:15:38 +09003264 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
Yu Liu8024b922024-12-20 23:31:32 +00003265 genRule.GeneratedDeps...)
3266 dirs := genRule.GeneratedHeaderDirs
Inseob Kim69378442019-06-03 19:10:47 +09003267 depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003268 if depTag == genHeaderExportDepTag {
Inseob Kim69378442019-06-03 19:10:47 +09003269 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
Inseob Kimd110f872019-12-06 13:15:38 +09003270 depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
Yu Liu8024b922024-12-20 23:31:32 +00003271 genRule.GeneratedSourceFiles...)
3272 depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps...)
Jayant Chowdhary715cac32017-04-20 06:53:59 -07003273 // 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 +09003274 c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
Dan Willemsenb3454ab2016-09-28 17:34:58 -07003275 }
Dan Willemsenb40aab62016-04-20 14:21:14 -07003276 } else {
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003277 ctx.ModuleErrorf("module %q is not a genrule", depName)
Dan Willemsenb40aab62016-04-20 14:21:14 -07003278 }
Colin Crosscef792e2021-06-11 18:01:26 -07003279 case CrtBeginDepTag:
3280 depPaths.CrtBegin = append(depPaths.CrtBegin, android.OutputFileForModule(ctx, dep, ""))
3281 case CrtEndDepTag:
3282 depPaths.CrtEnd = append(depPaths.CrtEnd, android.OutputFileForModule(ctx, dep, ""))
Colin Crossca860ac2016-01-04 14:34:37 -08003283 }
Colin Crossc99deeb2016-04-11 15:06:20 -07003284 return
3285 }
3286
Colin Crossfe17f6f2019-03-28 19:30:56 -07003287 if depTag == android.ProtoPluginDepTag {
3288 return
3289 }
3290
Jiyong Park8bcf3c62024-03-18 18:37:10 +09003291 if depTag == android.RequiredDepTag {
3292 return
3293 }
3294
Yu Liu8024b922024-12-20 23:31:32 +00003295 commonInfo := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey)
3296 if commonInfo.Target.Os != ctx.Os() {
Steven Morelandaaae81f2024-08-27 22:55:48 +00003297 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 -07003298 return
3299 }
Yu Liu8024b922024-12-20 23:31:32 +00003300 if commonInfo.Target.Arch.ArchType != ctx.Arch().ArchType {
Jooyung Han61b66e92020-03-21 14:21:46 +00003301 ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)",
Yu Liu8024b922024-12-20 23:31:32 +00003302 ctx.ModuleName(), ctx.Arch().ArchType, depName, commonInfo.Target.Arch.ArchType)
Colin Crossa1ad8d12016-06-01 17:09:44 -07003303 return
3304 }
3305
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -07003306 if depTag == reuseObjTag {
Colin Crossa717db72020-10-23 14:53:06 -07003307 // Skip reused objects for stub libraries, they use their own stub object file instead.
3308 // The reuseObjTag dependency still exists because the LinkageMutator runs before the
3309 // version mutator, so the stubs variant is created from the shared variant that
3310 // already has the reuseObjTag dependency on the static variant.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003311 if !c.library.BuildStubs() {
Colin Cross313aa542023-12-13 13:47:44 -08003312 staticAnalogue, _ := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003313 objs := staticAnalogue.ReuseObjects
3314 depPaths.Objs = depPaths.Objs.Append(objs)
Colin Cross313aa542023-12-13 13:47:44 -08003315 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossa717db72020-10-23 14:53:06 -07003316 reexportExporter(depExporterInfo)
3317 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003318 return
Jiyong Parke4bb9862019-02-01 00:31:10 +09003319 }
3320
Hsin-Yi Chen715142a2024-03-27 16:31:16 +08003321 if depTag == llndkHeaderLibTag {
3322 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3323 depPaths.LlndkIncludeDirs = append(depPaths.LlndkIncludeDirs, depExporterInfo.IncludeDirs...)
3324 depPaths.LlndkSystemIncludeDirs = append(depPaths.LlndkSystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3325 }
3326
Yu Liu8024b922024-12-20 23:31:32 +00003327 linkFile := linkableInfo.OutputFile
Colin Cross6e511a92020-07-27 21:26:48 -07003328
3329 if libDepTag, ok := depTag.(libraryDependencyTag); ok {
3330 // Only use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
Dan Albertc8060532020-07-22 22:32:17 -07003331 if libDepTag.staticUnwinder && c.apexSdkVersion.GreaterThan(android.SdkVersion_Android10) {
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003332 return
3333 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08003334
Jiyong Parke3867542020-12-03 17:28:25 +09003335 if !apexInfo.IsForPlatform() && libDepTag.excludeInApex {
3336 return
3337 }
Jooyung Han9ffbe832023-11-28 22:31:35 +09003338 if apexInfo.IsForPlatform() && libDepTag.excludeInNonApex {
3339 return
3340 }
Jiyong Parke3867542020-12-03 17:28:25 +09003341
Colin Cross313aa542023-12-13 13:47:44 -08003342 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
Colin Crossc99deeb2016-04-11 15:06:20 -07003343
Colin Cross6e511a92020-07-27 21:26:48 -07003344 var ptr *android.Paths
3345 var depPtr *android.Paths
Colin Crossc99deeb2016-04-11 15:06:20 -07003346
Colin Cross6e511a92020-07-27 21:26:48 -07003347 depFile := android.OptionalPath{}
Colin Cross26c34ed2016-09-30 17:10:16 -07003348
Colin Cross6e511a92020-07-27 21:26:48 -07003349 switch {
3350 case libDepTag.header():
Colin Cross313aa542023-12-13 13:47:44 -08003351 if _, isHeaderLib := android.OtherModuleProvider(ctx, dep, HeaderLibraryInfoProvider); !isHeaderLib {
Colin Cross649d8172020-12-10 12:30:21 -08003352 if !ctx.Config().AllowMissingDependencies() {
3353 ctx.ModuleErrorf("module %q is not a header library", depName)
3354 } else {
3355 ctx.AddMissingDependencies([]string{depName})
3356 }
3357 return
3358 }
Colin Cross6e511a92020-07-27 21:26:48 -07003359 case libDepTag.shared():
Colin Cross313aa542023-12-13 13:47:44 -08003360 if _, isSharedLib := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider); !isSharedLib {
Colin Cross0de8a1e2020-09-18 14:15:30 -07003361 if !ctx.Config().AllowMissingDependencies() {
3362 ctx.ModuleErrorf("module %q is not a shared library", depName)
3363 } else {
3364 ctx.AddMissingDependencies([]string{depName})
3365 }
3366 return
3367 }
Jiyong Parke3867542020-12-03 17:28:25 +09003368
Jiyong Park7d55b612021-06-11 17:22:09 +09003369 sharedLibraryInfo, returnedDepExporterInfo := ChooseStubOrImpl(ctx, dep)
3370 depExporterInfo = returnedDepExporterInfo
Colin Cross0de8a1e2020-09-18 14:15:30 -07003371
Jiyong Park1ad8e162020-12-01 23:40:09 +09003372 // Stubs lib doesn't link to the shared lib dependencies. Don't set
3373 // linkFile, depFile, and ptr.
3374 if c.IsStubs() {
3375 break
3376 }
3377
Colin Cross0de8a1e2020-09-18 14:15:30 -07003378 linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary)
3379 depFile = sharedLibraryInfo.TableOfContents
3380
Colin Crossb614cd42024-10-11 12:52:21 -07003381 if !sharedLibraryInfo.IsStubs {
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003382 // TODO(b/362509506): remove this additional check once all apex_exclude uses are switched to stubs.
3383 if !linkableInfo.RustApexExclude {
3384 depPaths.directImplementationDeps = append(depPaths.directImplementationDeps, android.OutputFileForModule(ctx, dep, ""))
3385 if info, ok := android.OtherModuleProvider(ctx, dep, ImplementationDepInfoProvider); ok {
3386 depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps)
3387 }
Colin Crossb614cd42024-10-11 12:52:21 -07003388 }
3389 }
3390
Colin Cross6e511a92020-07-27 21:26:48 -07003391 ptr = &depPaths.SharedLibs
3392 switch libDepTag.Order {
3393 case earlyLibraryDependency:
3394 ptr = &depPaths.EarlySharedLibs
3395 depPtr = &depPaths.EarlySharedLibsDeps
3396 case normalLibraryDependency:
3397 ptr = &depPaths.SharedLibs
3398 depPtr = &depPaths.SharedLibsDeps
Colin Cross0de8a1e2020-09-18 14:15:30 -07003399 directSharedDeps = append(directSharedDeps, sharedLibraryInfo)
Colin Cross6e511a92020-07-27 21:26:48 -07003400 case lateLibraryDependency:
3401 ptr = &depPaths.LateSharedLibs
3402 depPtr = &depPaths.LateSharedLibsDeps
3403 default:
3404 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
Colin Crossc99deeb2016-04-11 15:06:20 -07003405 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003406
Colin Cross6e511a92020-07-27 21:26:48 -07003407 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003408 if linkableInfo.RustLibraryInterface {
3409 rlibDep := RustRlibDep{LibPath: linkFile.Path(), CrateName: linkableInfo.CrateName, LinkDirs: linkableInfo.ExportedCrateLinkDirs}
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003410 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, rlibDep)
3411 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3412 if libDepTag.wholeStatic {
3413 depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, depExporterInfo.IncludeDirs...)
3414 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, rlibDep)
Jiyong Park1ad8e162020-12-01 23:40:09 +09003415
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003416 // If whole_static, track this as we want to make sure that in a final linkage for a shared library,
3417 // exported functions from the rust generated staticlib still exported.
3418 if c.CcLibrary() && c.Shared() {
3419 c.WholeRustStaticlib = true
3420 }
Colin Cross6e511a92020-07-27 21:26:48 -07003421 }
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003422
Colin Cross6e511a92020-07-27 21:26:48 -07003423 } else {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003424 staticLibraryInfo, isStaticLib := android.OtherModuleProvider(ctx, dep, StaticLibraryInfoProvider)
3425 if !isStaticLib {
3426 if !ctx.Config().AllowMissingDependencies() {
3427 ctx.ModuleErrorf("module %q is not a static library", depName)
3428 } else {
3429 ctx.AddMissingDependencies([]string{depName})
3430 }
3431 return
Inseob Kimeec88e12020-01-22 11:11:29 +09003432 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003433
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003434 // Stubs lib doesn't link to the static lib dependencies. Don't set
3435 // linkFile, depFile, and ptr.
3436 if c.IsStubs() {
3437 break
3438 }
Ivan Lozano0a468a42024-05-13 21:03:34 -04003439
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003440 linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary)
3441 if libDepTag.wholeStatic {
3442 ptr = &depPaths.WholeStaticLibs
3443 if len(staticLibraryInfo.Objects.objFiles) > 0 {
3444 depPaths.WholeStaticLibObjs = depPaths.WholeStaticLibObjs.Append(staticLibraryInfo.Objects)
3445 } else {
3446 // This case normally catches prebuilt static
3447 // libraries, but it can also occur when
3448 // AllowMissingDependencies is on and the
3449 // dependencies has no sources of its own
3450 // but has a whole_static_libs dependency
3451 // on a missing library. We want to depend
3452 // on the .a file so that there is something
3453 // in the dependency tree that contains the
3454 // error rule for the missing transitive
3455 // dependency.
3456 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts, linkFile.Path())
3457 }
3458 depPaths.WholeStaticLibsFromPrebuilts = append(depPaths.WholeStaticLibsFromPrebuilts,
3459 staticLibraryInfo.WholeStaticLibsFromPrebuilts...)
3460 } else {
3461 switch libDepTag.Order {
3462 case earlyLibraryDependency:
3463 panic(fmt.Errorf("early static libs not supported"))
3464 case normalLibraryDependency:
3465 // static dependencies will be handled separately so they can be ordered
3466 // using transitive dependencies.
3467 ptr = nil
3468 directStaticDeps = append(directStaticDeps, staticLibraryInfo)
3469 case lateLibraryDependency:
3470 ptr = &depPaths.LateStaticLibs
3471 default:
3472 panic(fmt.Errorf("unexpected library dependency order %d", libDepTag.Order))
3473 }
3474 }
3475
3476 // Collect any exported Rust rlib deps from static libraries which have been included as whole_static_libs
3477 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3478
3479 if libDepTag.unexportedSymbols {
3480 depPaths.LdFlags = append(depPaths.LdFlags,
3481 "-Wl,--exclude-libs="+staticLibraryInfo.StaticLibrary.Base())
3482 }
Colin Cross3e5e7782022-06-17 22:17:05 +00003483 }
Inseob Kimeec88e12020-01-22 11:11:29 +09003484 }
3485
Yu Liu8024b922024-12-20 23:31:32 +00003486 if libDepTag.static() && !libDepTag.wholeStatic && !linkableInfo.RustLibraryInterface {
3487 if !linkableInfo.CcLibraryInterface || !linkableInfo.Static {
Colin Cross6e511a92020-07-27 21:26:48 -07003488 ctx.ModuleErrorf("module %q not a static library", depName)
3489 return
3490 }
Logan Chien43d34c32017-12-20 01:17:32 +08003491
Colin Cross6e511a92020-07-27 21:26:48 -07003492 // When combining coverage files for shared libraries and executables, coverage files
3493 // in static libraries act as if they were whole static libraries. The same goes for
3494 // source based Abi dump files.
Yu Liu8024b922024-12-20 23:31:32 +00003495 if hasCcInfo {
Colin Cross6e511a92020-07-27 21:26:48 -07003496 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003497 linkableInfo.CoverageFiles...)
Colin Cross6e511a92020-07-27 21:26:48 -07003498 depPaths.StaticLibObjs.sAbiDumpFiles = append(depPaths.StaticLibObjs.sAbiDumpFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003499 linkableInfo.SAbiDumpFiles...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003500 } else {
Colin Cross6e511a92020-07-27 21:26:48 -07003501 // Handle non-CC modules here
3502 depPaths.StaticLibObjs.coverageFiles = append(depPaths.StaticLibObjs.coverageFiles,
Yu Liu8024b922024-12-20 23:31:32 +00003503 linkableInfo.CoverageFiles...)
Jiyong Parkde866cb2018-12-07 23:08:36 +09003504 }
3505 }
3506
Colin Cross6e511a92020-07-27 21:26:48 -07003507 if ptr != nil {
3508 if !linkFile.Valid() {
3509 if !ctx.Config().AllowMissingDependencies() {
3510 ctx.ModuleErrorf("module %q missing output file", depName)
3511 } else {
3512 ctx.AddMissingDependencies([]string{depName})
3513 }
3514 return
3515 }
3516 *ptr = append(*ptr, linkFile.Path())
3517 }
3518
3519 if depPtr != nil {
3520 dep := depFile
3521 if !dep.Valid() {
3522 dep = linkFile
3523 }
3524 *depPtr = append(*depPtr, dep.Path())
3525 }
3526
Colin Cross0de8a1e2020-09-18 14:15:30 -07003527 depPaths.IncludeDirs = append(depPaths.IncludeDirs, depExporterInfo.IncludeDirs...)
3528 depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, depExporterInfo.SystemIncludeDirs...)
3529 depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, depExporterInfo.Deps...)
3530 depPaths.Flags = append(depPaths.Flags, depExporterInfo.Flags...)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003531 depPaths.RustRlibDeps = append(depPaths.RustRlibDeps, depExporterInfo.RustRlibDeps...)
3532
3533 // Only re-export RustRlibDeps for cc static libs
3534 if c.static() {
3535 depPaths.ReexportedRustRlibDeps = append(depPaths.ReexportedRustRlibDeps, depExporterInfo.RustRlibDeps...)
3536 }
Colin Cross0de8a1e2020-09-18 14:15:30 -07003537
3538 if libDepTag.reexportFlags {
3539 reexportExporter(depExporterInfo)
3540 // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
3541 // Re-exported shared library headers must be included as well since they can help us with type information
3542 // about template instantiations (instantiated from their headers).
Colin Cross0de8a1e2020-09-18 14:15:30 -07003543 c.sabi.Properties.ReexportedIncludes = append(
3544 c.sabi.Properties.ReexportedIncludes, depExporterInfo.IncludeDirs.Strings()...)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003545 c.sabi.Properties.ReexportedSystemIncludes = append(
3546 c.sabi.Properties.ReexportedSystemIncludes, depExporterInfo.SystemIncludeDirs.Strings()...)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003547 }
3548
Yu Liu8024b922024-12-20 23:31:32 +00003549 makeLibName := MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName) + libDepTag.makeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003550 switch {
3551 case libDepTag.header():
Colin Cross370173e2020-07-29 12:48:33 -07003552 c.Properties.AndroidMkHeaderLibs = append(
3553 c.Properties.AndroidMkHeaderLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003554 case libDepTag.shared():
Colin Cross6e511a92020-07-27 21:26:48 -07003555 // Note: the order of libs in this list is not important because
3556 // they merely serve as Make dependencies and do not affect this lib itself.
Colin Cross370173e2020-07-29 12:48:33 -07003557 c.Properties.AndroidMkSharedLibs = append(
3558 c.Properties.AndroidMkSharedLibs, makeLibName)
Colin Cross6e511a92020-07-27 21:26:48 -07003559 case libDepTag.static():
Yu Liu8024b922024-12-20 23:31:32 +00003560 if !linkableInfo.RustLibraryInterface {
Ivan Lozanofd47b1a2024-05-17 14:13:41 -04003561 if libDepTag.wholeStatic {
3562 c.Properties.AndroidMkWholeStaticLibs = append(
3563 c.Properties.AndroidMkWholeStaticLibs, makeLibName)
3564 } else {
3565 c.Properties.AndroidMkStaticLibs = append(
3566 c.Properties.AndroidMkStaticLibs, makeLibName)
3567 }
Colin Cross6e511a92020-07-27 21:26:48 -07003568 }
3569 }
Jiyong Park1ad8e162020-12-01 23:40:09 +09003570 } else if !c.IsStubs() {
3571 // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies.
3572
Colin Cross6e511a92020-07-27 21:26:48 -07003573 switch depTag {
3574 case runtimeDepTag:
3575 c.Properties.AndroidMkRuntimeLibs = append(
Yu Liu8024b922024-12-20 23:31:32 +00003576 c.Properties.AndroidMkRuntimeLibs, MakeLibName(ccInfo, linkableInfo, &commonInfo, linkableInfo.BaseModuleName)+libDepTag.makeSuffix)
Colin Cross6e511a92020-07-27 21:26:48 -07003577 case objDepTag:
3578 depPaths.Objs.objFiles = append(depPaths.Objs.objFiles, linkFile.Path())
3579 case CrtBeginDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003580 depPaths.CrtBegin = append(depPaths.CrtBegin, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003581 case CrtEndDepTag:
Colin Crossc465efd2021-06-11 18:00:04 -07003582 depPaths.CrtEnd = append(depPaths.CrtEnd, linkFile.Path())
Colin Cross6e511a92020-07-27 21:26:48 -07003583 case dynamicLinkerDepTag:
3584 depPaths.DynamicLinker = linkFile
3585 }
Jiyong Park27b188b2017-07-18 13:23:39 +09003586 }
Colin Crossca860ac2016-01-04 14:34:37 -08003587 })
3588
Jeff Gaston294356f2017-09-27 17:05:30 -07003589 // use the ordered dependencies as this module's dependencies
Colin Cross0de8a1e2020-09-18 14:15:30 -07003590 orderedStaticPaths, transitiveStaticLibs := orderStaticModuleDeps(directStaticDeps, directSharedDeps)
3591 depPaths.TranstiveStaticLibrariesForOrdering = transitiveStaticLibs
3592 depPaths.StaticLibs = append(depPaths.StaticLibs, orderedStaticPaths...)
Jeff Gaston294356f2017-09-27 17:05:30 -07003593
Colin Crossdd84e052017-05-17 13:44:16 -07003594 // Dedup exported flags from dependencies
Colin Crossb6715442017-10-24 11:13:31 -07003595 depPaths.Flags = android.FirstUniqueStrings(depPaths.Flags)
Jiyong Park74955042019-10-22 20:19:51 +09003596 depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
3597 depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
Inseob Kimd110f872019-12-06 13:15:38 +09003598 depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003599 depPaths.RustRlibDeps = android.FirstUniqueFunc(depPaths.RustRlibDeps, EqRustRlibDeps)
3600
Jiyong Park74955042019-10-22 20:19:51 +09003601 depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
3602 depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
Colin Crossb6715442017-10-24 11:13:31 -07003603 depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
Inseob Kim69378442019-06-03 19:10:47 +09003604 depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
Inseob Kimd110f872019-12-06 13:15:38 +09003605 depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
Ivan Lozano0a468a42024-05-13 21:03:34 -04003606 depPaths.ReexportedRustRlibDeps = android.FirstUniqueFunc(depPaths.ReexportedRustRlibDeps, EqRustRlibDeps)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003607
3608 if c.sabi != nil {
Inseob Kim69378442019-06-03 19:10:47 +09003609 c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
Hsin-Yi Chen5f228b02024-04-02 12:38:47 +08003610 c.sabi.Properties.ReexportedSystemIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedSystemIncludes)
Dan Willemsenfe92c962017-08-29 12:28:37 -07003611 }
Colin Crossdd84e052017-05-17 13:44:16 -07003612
Colin Crossca860ac2016-01-04 14:34:37 -08003613 return depPaths
3614}
3615
Yu Liuf6f85492025-01-13 21:02:36 +00003616func ShouldUseStubForApex(ctx android.ModuleContext, parent android.Module, dep android.ModuleProxy) bool {
Kiyoung Kimaa394802024-01-08 12:55:45 +09003617 inVendorOrProduct := false
Jiyong Park7d55b612021-06-11 17:22:09 +09003618 bootstrap := false
Yu Liuf6f85492025-01-13 21:02:36 +00003619 if ctx.EqualModules(ctx.Module(), parent) {
3620 if linkable, ok := parent.(LinkableInterface); !ok {
3621 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3622 } else {
3623 inVendorOrProduct = linkable.InVendorOrProduct()
3624 bootstrap = linkable.Bootstrap()
3625 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003626 } else {
Yu Liuf6f85492025-01-13 21:02:36 +00003627 if linkable, ok := android.OtherModuleProvider(ctx, parent, LinkableInfoProvider); !ok {
3628 ctx.ModuleErrorf("Not a Linkable module: %q", ctx.ModuleName())
3629 } else {
3630 inVendorOrProduct = linkable.InVendorOrProduct
3631 bootstrap = linkable.Bootstrap
3632 }
Jiyong Park7d55b612021-06-11 17:22:09 +09003633 }
3634
Spandan Das10c41362024-12-03 01:33:09 +00003635 apexInfo, _ := android.OtherModuleProvider(ctx, parent, android.ApexInfoProvider)
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003636
3637 useStubs := false
3638
Yu Liu8024b922024-12-20 23:31:32 +00003639 if android.OtherModuleProviderOrDefault(ctx, dep, LinkableInfoProvider).IsStubs && inVendorOrProduct { // LLNDK
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003640 if !apexInfo.IsForPlatform() {
3641 // For platform libraries, use current version of LLNDK
3642 // If this is for use_vendor apex we will apply the same rules
3643 // of apex sdk enforcement below to choose right version.
3644 useStubs = true
3645 }
3646 } else if apexInfo.IsForPlatform() || apexInfo.UsePlatformApis {
3647 // If not building for APEX or the containing APEX allows the use of
3648 // platform APIs, use stubs only when it is from an APEX (and not from
3649 // platform) However, for host, ramdisk, vendor_ramdisk, recovery or
3650 // bootstrap modules, always link to non-stub variant
Yu Liu8024b922024-12-20 23:31:32 +00003651 isNotInPlatform := android.OtherModuleProviderOrDefault(ctx, dep, android.CommonModuleInfoKey).NotInPlatform
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003652
Spandan Dasff665182024-09-11 18:48:44 +00003653 useStubs = isNotInPlatform && !bootstrap
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003654 } else {
Colin Crossea91a172024-11-05 16:14:05 -08003655 // If building for APEX, always use stubs (can be bypassed by depending on <dep>#impl)
3656 useStubs = true
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003657 }
3658
3659 return useStubs
3660}
3661
3662// ChooseStubOrImpl determines whether a given dependency should be redirected to the stub variant
3663// of the dependency or not, and returns the SharedLibraryInfo and FlagExporterInfo for the right
3664// dependency. The stub variant is selected when the dependency crosses a boundary where each side
3665// has different level of updatability. For example, if a library foo in an APEX depends on a
3666// library bar which provides stable interface and exists in the platform, foo uses the stub variant
3667// of bar. If bar doesn't provide a stable interface (i.e. buildStubs() == false) or is in the
3668// same APEX as foo, the non-stub variant of bar is used.
Yu Liuf6f85492025-01-13 21:02:36 +00003669func ChooseStubOrImpl(ctx android.ModuleContext, dep android.ModuleProxy) (SharedLibraryInfo, FlagExporterInfo) {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09003670 depTag := ctx.OtherModuleDependencyTag(dep)
3671 libDepTag, ok := depTag.(libraryDependencyTag)
3672 if !ok || !libDepTag.shared() {
3673 panic(fmt.Errorf("Unexpected dependency tag: %T", depTag))
3674 }
3675
Colin Cross313aa542023-12-13 13:47:44 -08003676 sharedLibraryInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryInfoProvider)
3677 depExporterInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider)
3678 sharedLibraryStubsInfo, _ := android.OtherModuleProvider(ctx, dep, SharedLibraryStubsProvider)
Jiyong Park7d55b612021-06-11 17:22:09 +09003679
3680 if !libDepTag.explicitlyVersioned && len(sharedLibraryStubsInfo.SharedStubLibraries) > 0 {
Jiyong Park7d55b612021-06-11 17:22:09 +09003681 // when to use (unspecified) stubs, use the latest one.
Spandan Das10c41362024-12-03 01:33:09 +00003682 if ShouldUseStubForApex(ctx, ctx.Module(), dep) {
Jiyong Park7d55b612021-06-11 17:22:09 +09003683 stubs := sharedLibraryStubsInfo.SharedStubLibraries
3684 toUse := stubs[len(stubs)-1]
3685 sharedLibraryInfo = toUse.SharedLibraryInfo
3686 depExporterInfo = toUse.FlagExporterInfo
3687 }
3688 }
3689 return sharedLibraryInfo, depExporterInfo
3690}
3691
Colin Cross0de8a1e2020-09-18 14:15:30 -07003692// orderStaticModuleDeps rearranges the order of the static library dependencies of the module
3693// to match the topological order of the dependency tree, including any static analogues of
Colin Crossa14fb6a2024-10-23 16:57:06 -07003694// direct shared libraries. It returns the ordered static dependencies, and a depset.DepSet
Colin Cross0de8a1e2020-09-18 14:15:30 -07003695// of the transitive dependencies.
Colin Crossa14fb6a2024-10-23 16:57:06 -07003696func orderStaticModuleDeps(staticDeps []StaticLibraryInfo, sharedDeps []SharedLibraryInfo) (ordered android.Paths, transitive depset.DepSet[android.Path]) {
3697 transitiveStaticLibsBuilder := depset.NewBuilder[android.Path](depset.TOPOLOGICAL)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003698 var staticPaths android.Paths
3699 for _, staticDep := range staticDeps {
3700 staticPaths = append(staticPaths, staticDep.StaticLibrary)
3701 transitiveStaticLibsBuilder.Transitive(staticDep.TransitiveStaticLibrariesForOrdering)
3702 }
3703 for _, sharedDep := range sharedDeps {
Colin Crossa14fb6a2024-10-23 16:57:06 -07003704 transitiveStaticLibsBuilder.Transitive(sharedDep.TransitiveStaticLibrariesForOrdering)
Colin Cross0de8a1e2020-09-18 14:15:30 -07003705 }
3706 transitiveStaticLibs := transitiveStaticLibsBuilder.Build()
3707
3708 orderedTransitiveStaticLibs := transitiveStaticLibs.ToList()
3709
3710 // reorder the dependencies based on transitive dependencies
3711 staticPaths = android.FirstUniquePaths(staticPaths)
3712 _, orderedStaticPaths := android.FilterPathList(orderedTransitiveStaticLibs, staticPaths)
3713
3714 if len(orderedStaticPaths) != len(staticPaths) {
3715 missing, _ := android.FilterPathList(staticPaths, orderedStaticPaths)
3716 panic(fmt.Errorf("expected %d ordered static paths , got %d, missing %q %q %q", len(staticPaths), len(orderedStaticPaths), missing, orderedStaticPaths, staticPaths))
3717 }
3718
3719 return orderedStaticPaths, transitiveStaticLibs
3720}
3721
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003722// BaseLibName trims known prefixes and suffixes
3723func BaseLibName(depName string) string {
Colin Cross6e511a92020-07-27 21:26:48 -07003724 libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
3725 libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
Paul Duffind23c7262020-12-11 18:13:08 +00003726 libName = android.RemoveOptionalPrebuiltPrefix(libName)
Colin Cross6e511a92020-07-27 21:26:48 -07003727 return libName
3728}
3729
Yu Liu8024b922024-12-20 23:31:32 +00003730func MakeLibName(ccInfo *CcInfo, linkableInfo *LinkableInfo, commonInfo *android.CommonModuleInfo, depName string) string {
Ivan Lozanod67a6b02021-05-20 13:01:32 -04003731 libName := BaseLibName(depName)
Yu Liu8024b922024-12-20 23:31:32 +00003732 isLLndk := ccInfo != nil && linkableInfo.IsLlndk
3733 nonSystemVariantsExist := linkableInfo.HasNonSystemVariants || isLLndk
Colin Cross6e511a92020-07-27 21:26:48 -07003734
Yu Liu8024b922024-12-20 23:31:32 +00003735 if ccInfo != nil {
Colin Cross6e511a92020-07-27 21:26:48 -07003736 // Use base module name for snapshots when exporting to Makefile.
Yu Liu8024b922024-12-20 23:31:32 +00003737 if ccInfo.SnapshotInfo != nil {
3738 return linkableInfo.BaseModuleName + ccInfo.SnapshotInfo.SnapshotAndroidMkSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003739 }
3740 }
3741
Yu Liu8024b922024-12-20 23:31:32 +00003742 if linkableInfo.InVendorOrProduct && nonSystemVariantsExist {
Justin Yuncbca3732021-02-03 19:24:13 +09003743 // The vendor and product modules in Make will have been renamed to not conflict with the
3744 // core module, so update the dependency name here accordingly.
Yu Liu8024b922024-12-20 23:31:32 +00003745 return libName + linkableInfo.SubName
3746 } else if linkableInfo.InRamdisk && !linkableInfo.OnlyInRamdisk {
Matthew Maurerc6868382021-07-13 14:12:37 -07003747 return libName + RamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003748 } else if linkableInfo.InVendorRamdisk && !linkableInfo.OnlyInVendorRamdisk {
Ivan Lozanoe6d30982021-02-05 10:57:43 -05003749 return libName + VendorRamdiskSuffix
Yu Liu8024b922024-12-20 23:31:32 +00003750 } else if linkableInfo.InRecovery && !linkableInfo.OnlyInRecovery {
Matthew Maurer460ee942021-02-11 12:31:46 -08003751 return libName + RecoverySuffix
Yu Liu8024b922024-12-20 23:31:32 +00003752 } else if commonInfo.Target.NativeBridge == android.NativeBridgeEnabled {
Matthew Maurera61e31f2021-05-27 11:09:11 -07003753 return libName + NativeBridgeSuffix
Colin Cross6e511a92020-07-27 21:26:48 -07003754 } else {
3755 return libName
3756 }
3757}
3758
Colin Crossca860ac2016-01-04 14:34:37 -08003759func (c *Module) InstallInData() bool {
3760 if c.installer == nil {
3761 return false
3762 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003763 return c.installer.inData()
3764}
3765
3766func (c *Module) InstallInSanitizerDir() bool {
3767 if c.installer == nil {
3768 return false
3769 }
3770 if c.sanitize != nil && c.sanitize.inSanitizerDir() {
Colin Cross94610402016-08-29 13:41:32 -07003771 return true
3772 }
Vishwath Mohan1dd88392017-03-29 22:00:18 -07003773 return c.installer.inSanitizerDir()
Colin Crossca860ac2016-01-04 14:34:37 -08003774}
3775
Yifan Hong1b3348d2020-01-21 15:53:22 -08003776func (c *Module) InstallInRamdisk() bool {
3777 return c.InRamdisk()
3778}
3779
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003780func (c *Module) InstallInVendorRamdisk() bool {
3781 return c.InVendorRamdisk()
3782}
3783
Jiyong Parkf9332f12018-02-01 00:54:12 +09003784func (c *Module) InstallInRecovery() bool {
Ivan Lozano52767be2019-10-18 14:49:46 -07003785 return c.InRecovery()
Jiyong Parkf9332f12018-02-01 00:54:12 +09003786}
3787
Jingwen Chen8ac7d7d2023-03-20 11:05:16 +00003788func (c *Module) MakeUninstallable() {
3789 if c.installer == nil {
3790 c.ModuleBase.MakeUninstallable()
3791 return
3792 }
3793 c.installer.makeUninstallable(c)
3794}
3795
Dan Willemsen4aa75ca2016-09-28 16:18:03 -07003796func (c *Module) HostToolPath() android.OptionalPath {
3797 if c.installer == nil {
3798 return android.OptionalPath{}
3799 }
3800 return c.installer.hostToolPath()
3801}
3802
Nan Zhangd4e641b2017-07-12 12:55:28 -07003803func (c *Module) IntermPathForModuleOut() android.OptionalPath {
3804 return c.outputFile
3805}
3806
Vishwath Mohanb743e9c2017-11-01 09:20:21 +00003807func (c *Module) static() bool {
3808 if static, ok := c.linker.(interface {
3809 static() bool
3810 }); ok {
3811 return static.static()
3812 }
3813 return false
3814}
3815
Colin Cross6a730042024-12-05 13:53:43 -08003816func (c *Module) staticLibrary() bool {
3817 if static, ok := c.linker.(interface {
3818 staticLibrary() bool
3819 }); ok {
3820 return static.staticLibrary()
3821 }
3822 return false
3823}
3824
Jiyong Park379de2f2018-12-19 02:47:14 +09003825func (c *Module) staticBinary() bool {
3826 if static, ok := c.linker.(interface {
3827 staticBinary() bool
3828 }); ok {
3829 return static.staticBinary()
3830 }
3831 return false
3832}
3833
Evgenii Stepanov193ac2e2020-04-28 15:09:12 -07003834func (c *Module) testBinary() bool {
3835 if test, ok := c.linker.(interface {
3836 testBinary() bool
3837 }); ok {
3838 return test.testBinary()
3839 }
3840 return false
3841}
3842
Jingwen Chen537242c2022-08-24 11:53:27 +00003843func (c *Module) testLibrary() bool {
3844 if test, ok := c.linker.(interface {
3845 testLibrary() bool
3846 }); ok {
3847 return test.testLibrary()
3848 }
3849 return false
3850}
3851
Liz Kammerbe46fcc2021-11-01 15:32:43 -04003852func (c *Module) benchmarkBinary() bool {
3853 if b, ok := c.linker.(interface {
3854 benchmarkBinary() bool
3855 }); ok {
3856 return b.benchmarkBinary()
3857 }
3858 return false
3859}
3860
3861func (c *Module) fuzzBinary() bool {
3862 if f, ok := c.linker.(interface {
3863 fuzzBinary() bool
3864 }); ok {
3865 return f.fuzzBinary()
3866 }
3867 return false
3868}
3869
Ivan Lozano3968d8f2020-12-14 11:27:52 -05003870// Header returns true if the module is a header-only variant. (See cc/library.go header()).
3871func (c *Module) Header() bool {
Jiyong Park1d1119f2019-07-29 21:27:18 +09003872 if h, ok := c.linker.(interface {
3873 header() bool
3874 }); ok {
3875 return h.header()
3876 }
3877 return false
3878}
3879
Ivan Lozanod7586b62021-04-01 09:49:36 -04003880func (c *Module) Binary() bool {
Inseob Kim7f283f42020-06-01 21:53:49 +09003881 if b, ok := c.linker.(interface {
3882 binary() bool
3883 }); ok {
3884 return b.binary()
3885 }
3886 return false
3887}
3888
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003889func (c *Module) ForceDisableSanitizers() {
3890 c.sanitize.Properties.ForceDisable = true
3891}
3892
Justin Yun5e035862021-06-29 20:50:37 +09003893func (c *Module) StaticExecutable() bool {
3894 if b, ok := c.linker.(*binaryDecorator); ok {
3895 return b.static()
3896 }
3897 return false
3898}
3899
Ivan Lozanod7586b62021-04-01 09:49:36 -04003900func (c *Module) Object() bool {
Inseob Kim1042d292020-06-01 23:23:05 +09003901 if o, ok := c.linker.(interface {
3902 object() bool
3903 }); ok {
3904 return o.object()
3905 }
3906 return false
3907}
3908
Kiyoung Kim37693d02024-04-04 09:56:15 +09003909func (m *Module) Dylib() bool {
3910 return false
3911}
3912
3913func (m *Module) Rlib() bool {
3914 return false
3915}
3916
Ivan Lozanof9e21722020-12-02 09:00:51 -05003917func GetMakeLinkType(actx android.ModuleContext, c LinkableInterface) string {
Kiyoung Kim8487c0b2024-01-11 16:03:13 +09003918 if c.InVendorOrProduct() {
Colin Cross127bb8b2020-12-16 16:46:01 -08003919 if c.IsLlndk() {
Ivan Lozanof9e21722020-12-02 09:00:51 -05003920 return "native:vndk"
Jooyung Han38002912019-05-16 04:01:54 +09003921 }
Ivan Lozanof9e21722020-12-02 09:00:51 -05003922 if c.InProduct() {
Justin Yun5f7f7e82019-11-18 19:52:14 +09003923 return "native:product"
3924 }
Jooyung Han38002912019-05-16 04:01:54 +09003925 return "native:vendor"
Yifan Hong1b3348d2020-01-21 15:53:22 -08003926 } else if c.InRamdisk() {
3927 return "native:ramdisk"
Yifan Hong60e0cfb2020-10-21 15:17:56 -07003928 } else if c.InVendorRamdisk() {
3929 return "native:vendor_ramdisk"
Ivan Lozano52767be2019-10-18 14:49:46 -07003930 } else if c.InRecovery() {
Colin Crossb60190a2018-09-04 16:28:17 -07003931 return "native:recovery"
Ivan Lozanof9e21722020-12-02 09:00:51 -05003932 } else if c.Target().Os == android.Android && c.SdkVersion() != "" {
Colin Crossb60190a2018-09-04 16:28:17 -07003933 return "native:ndk:none:none"
3934 // TODO(b/114741097): use the correct ndk stl once build errors have been fixed
3935 //family, link := getNdkStlFamilyAndLinkType(c)
3936 //return fmt.Sprintf("native:ndk:%s:%s", family, link)
3937 } else {
3938 return "native:platform"
3939 }
3940}
3941
Jiyong Park9d452992018-10-03 00:38:19 +09003942// Overrides ApexModule.IsInstallabeToApex()
Colin Cross3a02c7b2024-05-21 13:46:22 -07003943// Only shared/runtime libraries .
Jiyong Park9d452992018-10-03 00:38:19 +09003944func (c *Module) IsInstallableToApex() bool {
Colin Cross31076b32020-10-23 17:22:06 -07003945 if lib := c.library; lib != nil {
Jiyong Park73c54ee2019-10-22 20:31:18 +09003946 // Stub libs and prebuilt libs in a versioned SDK are not
3947 // installable to APEX even though they are shared libs.
Ivan Lozano9eaacc82024-10-30 14:28:17 +00003948 return lib.shared() && !lib.BuildStubs()
Jiyong Park9d452992018-10-03 00:38:19 +09003949 }
3950 return false
3951}
3952
Jiyong Parka90ca002019-10-07 15:47:24 +09003953func (c *Module) AvailableFor(what string) bool {
Yu Liub73c3a62024-12-10 00:58:06 +00003954 return android.CheckAvailableForApex(what, c.ApexAvailableFor())
3955}
3956
3957func (c *Module) ApexAvailableFor() []string {
3958 list := c.ApexModuleBase.ApexAvailable()
Jiyong Parka90ca002019-10-07 15:47:24 +09003959 if linker, ok := c.linker.(interface {
Yu Liub73c3a62024-12-10 00:58:06 +00003960 apexAvailable() []string
Jiyong Parka90ca002019-10-07 15:47:24 +09003961 }); ok {
Yu Liub73c3a62024-12-10 00:58:06 +00003962 list = append(list, linker.apexAvailable()...)
Jiyong Parka90ca002019-10-07 15:47:24 +09003963 }
Yu Liub73c3a62024-12-10 00:58:06 +00003964
3965 return android.FirstUniqueStrings(list)
Jiyong Parka90ca002019-10-07 15:47:24 +09003966}
3967
Paul Duffin0cb37b92020-03-04 14:52:46 +00003968func (c *Module) EverInstallable() bool {
3969 return c.installer != nil &&
3970 // Check to see whether the module is actually ever installable.
3971 c.installer.everInstallable()
3972}
3973
Ivan Lozanod7586b62021-04-01 09:49:36 -04003974func (c *Module) PreventInstall() bool {
3975 return c.Properties.PreventInstall
3976}
3977
3978func (c *Module) Installable() *bool {
Colin Cross1bc94122021-10-28 13:25:54 -07003979 if c.library != nil {
3980 if i := c.library.installable(); i != nil {
3981 return i
3982 }
3983 }
Ivan Lozanod7586b62021-04-01 09:49:36 -04003984 return c.Properties.Installable
3985}
3986
3987func installable(c LinkableInterface, apexInfo android.ApexInfo) bool {
Paul Duffin0cb37b92020-03-04 14:52:46 +00003988 ret := c.EverInstallable() &&
3989 // Check to see whether the module has been configured to not be installed.
Ivan Lozanod7586b62021-04-01 09:49:36 -04003990 proptools.BoolDefault(c.Installable(), true) &&
3991 !c.PreventInstall() && c.OutputFile().Valid()
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003992
3993 // The platform variant doesn't need further condition. Apex variants however might not
3994 // be installable because it will likely to be included in the APEX and won't appear
3995 // in the system partition.
Colin Cross56a83212020-09-15 18:30:11 -07003996 if apexInfo.IsForPlatform() {
Jiyong Parkfe9a4302020-01-07 16:59:44 +09003997 return ret
3998 }
3999
4000 // Special case for modules that are configured to be installed to /data, which includes
4001 // test modules. For these modules, both APEX and non-APEX variants are considered as
4002 // installable. This is because even the APEX variants won't be included in the APEX, but
4003 // will anyway be installed to /data/*.
4004 // See b/146995717
4005 if c.InstallInData() {
4006 return ret
4007 }
4008
4009 return false
Inseob Kim1f086e22019-05-09 13:29:15 +09004010}
4011
Logan Chien41eabe62019-04-10 13:33:58 +08004012func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
4013 if c.linker != nil {
4014 if library, ok := c.linker.(*libraryDecorator); ok {
4015 library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w)
4016 }
4017 }
4018}
4019
Jiyong Park45bf82e2020-12-15 22:29:02 +09004020var _ android.ApexModule = (*Module)(nil)
4021
4022// Implements android.ApexModule
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004023func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Ivan Lozano9eaacc82024-10-30 14:28:17 +00004024 if depTag == StubImplDepTag {
Colin Crossc1b36442021-05-06 13:42:48 -07004025 // We don't track from an implementation library to its stubs.
Jiyong Park7d95a512020-05-10 15:16:24 +09004026 return false
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004027 }
Jiyong Park12177fc2021-01-05 14:37:15 +09004028 if depTag == staticVariantTag {
4029 // This dependency is for optimization (reuse *.o from the static lib). It doesn't
4030 // actually mean that the static lib (and its dependencies) are copied into the
4031 // APEX.
4032 return false
4033 }
Colin Cross8acea3e2024-12-12 14:53:30 -08004034
4035 libDepTag, isLibDepTag := depTag.(libraryDependencyTag)
4036 if isLibDepTag && c.static() && libDepTag.shared() {
4037 // shared_lib dependency from a static lib is considered as crossing
4038 // the APEX boundary because the dependency doesn't actually is
4039 // linked; the dependency is used only during the compilation phase.
4040 return false
4041 }
4042
4043 if isLibDepTag && libDepTag.excludeInApex {
4044 return false
4045 }
4046
Jiyong Parka7bc8ad2019-10-15 15:20:07 +09004047 return true
4048}
4049
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004050func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool {
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004051 if c.HasStubsVariants() {
4052 if IsSharedDepTag(depTag) {
4053 // dynamic dep to a stubs lib crosses APEX boundary
4054 return false
4055 }
4056 if IsRuntimeDepTag(depTag) {
4057 // runtime dep to a stubs lib also crosses APEX boundary
4058 return false
4059 }
4060 if IsHeaderDepTag(depTag) {
4061 return false
4062 }
4063 }
4064 if c.IsLlndk() {
4065 return false
4066 }
Colin Crossf7bbd2f2024-12-05 13:57:10 -08004067
4068 return true
4069}
4070
Jiyong Park45bf82e2020-12-15 22:29:02 +09004071// Implements android.ApexModule
Dan Albertc8060532020-07-22 22:32:17 -07004072func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
4073 sdkVersion android.ApiLevel) error {
Jooyung Han749dc692020-04-15 11:03:39 +09004074 // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700)
4075 if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") {
4076 return nil
4077 }
Jooyung Han749dc692020-04-15 11:03:39 +09004078 // We don't check for prebuilt modules
4079 if _, ok := c.linker.(prebuiltLinkerInterface); ok {
4080 return nil
4081 }
Kiyoung Kim487689e2022-07-26 09:48:22 +09004082
Jooyung Han749dc692020-04-15 11:03:39 +09004083 minSdkVersion := c.MinSdkVersion()
4084 if minSdkVersion == "apex_inherit" {
4085 return nil
4086 }
4087 if minSdkVersion == "" {
4088 // JNI libs within APK-in-APEX fall into here
4089 // Those are okay to set sdk_version instead
4090 // We don't have to check if this is a SDK variant because
4091 // non-SDK variant resets sdk_version, which works too.
4092 minSdkVersion = c.SdkVersion()
4093 }
Dan Albertc8060532020-07-22 22:32:17 -07004094 if minSdkVersion == "" {
4095 return fmt.Errorf("neither min_sdk_version nor sdk_version specificed")
4096 }
4097 // Not using nativeApiLevelFromUser because the context here is not
4098 // necessarily a native context.
4099 ver, err := android.ApiLevelFromUser(ctx, minSdkVersion)
Jooyung Han749dc692020-04-15 11:03:39 +09004100 if err != nil {
4101 return err
4102 }
Dan Albertc8060532020-07-22 22:32:17 -07004103
Colin Cross8ca61c12022-10-06 21:00:14 -07004104 // A dependency only needs to support a min_sdk_version at least
4105 // as high as the api level that the architecture was introduced in.
4106 // This allows introducing new architectures in the platform that
4107 // need to be included in apexes that normally require an older
4108 // min_sdk_version.
Colin Crossbb137a32023-01-26 09:54:42 -08004109 minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType)
Colin Cross8ca61c12022-10-06 21:00:14 -07004110 if sdkVersion.LessThan(minApiForArch) {
4111 sdkVersion = minApiForArch
4112 }
4113
Dan Albertc8060532020-07-22 22:32:17 -07004114 if ver.GreaterThan(sdkVersion) {
Jooyung Han749dc692020-04-15 11:03:39 +09004115 return fmt.Errorf("newer SDK(%v)", ver)
4116 }
4117 return nil
4118}
4119
Paul Duffinb5769c12021-05-12 16:16:51 +01004120// Implements android.ApexModule
4121func (c *Module) AlwaysRequiresPlatformApexVariant() bool {
4122 // stub libraries and native bridge libraries are always available to platform
4123 return c.IsStubs() || c.Target().NativeBridge == android.NativeBridgeEnabled
4124}
4125
Inseob Kima1888ce2022-10-04 14:42:02 +09004126func (c *Module) overriddenModules() []string {
4127 if o, ok := c.linker.(overridable); ok {
4128 return o.overriddenModules()
4129 }
4130 return nil
4131}
4132
Liz Kammer35ca77e2021-12-22 15:31:40 -05004133type moduleType int
4134
4135const (
4136 unknownType moduleType = iota
4137 binary
4138 object
4139 fullLibrary
4140 staticLibrary
4141 sharedLibrary
4142 headerLibrary
Jingwen Chen537242c2022-08-24 11:53:27 +00004143 testBin // testBinary already declared
Spandan Das1278c2c2022-08-19 18:17:28 +00004144 ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004145)
4146
4147func (c *Module) typ() moduleType {
Jingwen Chen537242c2022-08-24 11:53:27 +00004148 if c.testBinary() {
4149 // testBinary is also a binary, so this comes before the c.Binary()
4150 // conditional. A testBinary has additional implicit dependencies and
4151 // other test-only semantics.
4152 return testBin
4153 } else if c.Binary() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004154 return binary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004155 } else if c.Object() {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004156 return object
Jingwen Chen537242c2022-08-24 11:53:27 +00004157 } else if c.testLibrary() {
4158 // TODO(b/244431896) properly convert cc_test_library to its own macro. This
4159 // will let them add implicit compile deps on gtest, for example.
4160 //
Liz Kammerefc51d92023-04-21 15:11:25 -04004161 // For now, treat them as regular libraries.
4162 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004163 } else if c.CcLibrary() {
Chris Parsons58852a02021-12-09 18:10:18 -05004164 static := false
4165 shared := false
4166 if library, ok := c.linker.(*libraryDecorator); ok {
4167 static = library.MutatedProperties.BuildStatic
4168 shared = library.MutatedProperties.BuildShared
4169 } else if library, ok := c.linker.(*prebuiltLibraryLinker); ok {
4170 static = library.MutatedProperties.BuildStatic
4171 shared = library.MutatedProperties.BuildShared
4172 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004173 if static && shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004174 return fullLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004175 } else if !static && !shared {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004176 return headerLibrary
Liz Kammerbe46fcc2021-11-01 15:32:43 -04004177 } else if static {
Liz Kammer35ca77e2021-12-22 15:31:40 -05004178 return staticLibrary
4179 }
4180 return sharedLibrary
Spandan Das1278c2c2022-08-19 18:17:28 +00004181 } else if c.isNDKStubLibrary() {
4182 return ndkLibrary
Liz Kammer35ca77e2021-12-22 15:31:40 -05004183 }
4184 return unknownType
4185}
4186
Colin Crosscfad1192015-11-02 16:43:11 -08004187// Defaults
Colin Crossca860ac2016-01-04 14:34:37 -08004188type Defaults struct {
Colin Cross635c3b02016-05-18 15:37:25 -07004189 android.ModuleBase
Colin Cross1f44a3a2017-07-07 14:33:33 -07004190 android.DefaultsModuleBase
Jiyong Park9d452992018-10-03 00:38:19 +09004191 android.ApexModuleBase
Colin Crosscfad1192015-11-02 16:43:11 -08004192}
4193
Patrice Arrudac249c712019-03-19 17:00:29 -07004194// cc_defaults provides a set of properties that can be inherited by other cc
4195// modules. A module can use the properties from a cc_defaults using
4196// `defaults: ["<:default_module_name>"]`. Properties of both modules are
4197// merged (when possible) by prepending the default module's values to the
4198// depending module's values.
Colin Cross36242852017-06-23 15:06:31 -07004199func defaultsFactory() android.Module {
Colin Crosse1d764e2016-08-18 14:18:32 -07004200 return DefaultsFactory()
4201}
4202
Colin Cross36242852017-06-23 15:06:31 -07004203func DefaultsFactory(props ...interface{}) android.Module {
Colin Crossca860ac2016-01-04 14:34:37 -08004204 module := &Defaults{}
Colin Crosscfad1192015-11-02 16:43:11 -08004205
Colin Cross36242852017-06-23 15:06:31 -07004206 module.AddProperties(props...)
4207 module.AddProperties(
Colin Crossca860ac2016-01-04 14:34:37 -08004208 &BaseProperties{},
Dan Willemsen3e5bdf22017-09-13 18:37:08 -07004209 &VendorProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004210 &BaseCompilerProperties{},
4211 &BaseLinkerProperties{},
Paul Duffina37832a2019-07-18 12:31:26 +01004212 &ObjectLinkerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004213 &LibraryProperties{},
Colin Crosse1bb5d02019-09-24 14:55:04 -07004214 &StaticProperties{},
4215 &SharedProperties{},
Colin Cross919281a2016-04-05 16:42:05 -07004216 &FlagExporterProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004217 &BinaryLinkerProperties{},
Trevor Radcliffef389cb42022-03-24 21:06:14 +00004218 &TestLinkerProperties{},
4219 &TestInstallerProperties{},
Colin Crossb916a382016-07-29 17:28:03 -07004220 &TestBinaryProperties{},
Colin Cross43287652020-06-30 10:15:07 -07004221 &BenchmarkProperties{},
hamzehc0a671f2021-07-22 12:05:08 -07004222 &fuzz.FuzzProperties{},
Colin Crossca860ac2016-01-04 14:34:37 -08004223 &StlProperties{},
Colin Cross16b23492016-01-06 14:41:07 -08004224 &SanitizeProperties{},
Colin Cross665dce92016-04-28 14:50:03 -07004225 &StripProperties{},
Dan Willemsen7424d612016-09-01 13:45:39 -07004226 &InstallerProperties{},
Dan Willemsena03cf6d2016-09-26 15:45:04 -07004227 &TidyProperties{},
Dan Willemsen581341d2017-02-09 16:16:31 -08004228 &CoverageProperties{},
Jayant Chowdhary3e231fd2017-02-08 13:45:53 -08004229 &SAbiProperties{},
Stephen Craneba090d12017-05-09 15:44:35 -07004230 &LTOProperties{},
Yi Kongeb8efc92021-12-09 18:06:29 +08004231 &AfdoProperties{},
Sharjeel Khanc6a93d82023-07-18 21:01:11 +00004232 &OrderfileProperties{},
Dan Willemsen6424d172018-03-08 13:27:59 -08004233 &android.ProtoProperties{},
Ivan Lozanobc9e4212020-09-25 16:08:34 -04004234 // RustBindgenProperties is included here so that cc_defaults can be used for rust_bindgen modules.
4235 &RustBindgenClangProperties{},
Yu-Chi Cheng24b2b0f2021-06-23 15:56:39 -07004236 &prebuiltLinkerProperties{},
Colin Crosse1d764e2016-08-18 14:18:32 -07004237 )
Colin Crosscfad1192015-11-02 16:43:11 -08004238
Jooyung Hancc372c52019-09-25 15:18:44 +09004239 android.InitDefaultsModule(module)
Colin Cross36242852017-06-23 15:06:31 -07004240
4241 return module
Colin Crosscfad1192015-11-02 16:43:11 -08004242}
4243
Jiyong Park2286afd2020-06-16 21:58:53 +09004244func (c *Module) IsSdkVariant() bool {
Lukacs T. Berki2063a0d2021-06-17 09:32:36 +02004245 return c.Properties.IsSdkVariant
Jiyong Park2286afd2020-06-16 21:58:53 +09004246}
4247
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004248func kytheExtractAllFactory() android.Singleton {
4249 return &kytheExtractAllSingleton{}
4250}
4251
4252type kytheExtractAllSingleton struct {
4253}
4254
4255func (ks *kytheExtractAllSingleton) GenerateBuildActions(ctx android.SingletonContext) {
4256 var xrefTargets android.Paths
Yu Liuec7043d2024-11-05 18:22:20 +00004257 ctx.VisitAllModuleProxies(func(module android.ModuleProxy) {
Yu Liu4f825132024-12-18 00:35:39 +00004258 files := android.OtherModuleProviderOrDefault(ctx, module, CcObjectInfoProvider).KytheFiles
Yu Liuec7043d2024-11-05 18:22:20 +00004259 if len(files) > 0 {
4260 xrefTargets = append(xrefTargets, files...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004261 }
4262 })
4263 // TODO(asmundak): Perhaps emit a rule to output a warning if there were no xrefTargets
4264 if len(xrefTargets) > 0 {
Colin Crossc3d87d32020-06-04 13:25:17 -07004265 ctx.Phony("xref_cxx", xrefTargets...)
Sasha Smundak2a4549e2018-11-05 16:49:08 -08004266 }
4267}
4268
Jihoon Kangf78a8902022-09-01 22:47:07 +00004269func (c *Module) Partition() string {
4270 if p, ok := c.installer.(interface {
4271 getPartition() string
4272 }); ok {
4273 return p.getPartition()
4274 }
4275 return ""
4276}
4277
Spandan Das2b6dfb52024-01-19 00:22:22 +00004278type sourceModuleName interface {
4279 sourceModuleName() string
4280}
4281
4282func (c *Module) BaseModuleName() string {
4283 if smn, ok := c.linker.(sourceModuleName); ok && smn.sourceModuleName() != "" {
4284 // if the prebuilt module sets a source_module_name in Android.bp, use that
4285 return smn.sourceModuleName()
4286 }
4287 return c.ModuleBase.BaseModuleName()
4288}
4289
Spandan Dase20c56c2024-07-23 21:34:24 +00004290func (c *Module) stubsSymbolFilePath() android.Path {
4291 if library, ok := c.linker.(*libraryDecorator); ok {
4292 return library.stubsSymbolFilePath
4293 }
4294 return android.OptionalPath{}.Path()
4295}
4296
Colin Cross06a931b2015-10-28 17:23:31 -07004297var Bool = proptools.Bool
Colin Cross38b40df2018-04-10 16:14:46 -07004298var BoolDefault = proptools.BoolDefault
Nan Zhang0007d812017-11-07 10:57:05 -08004299var BoolPtr = proptools.BoolPtr
4300var String = proptools.String
4301var StringPtr = proptools.StringPtr